-2

I wanted to make a list of conditions for if. I wanted to make a program that would find very high prime numbers. I don't want to write: number % 2 == 0 or - for every number that I divide with. If you know how to make a list of conditions or know how to easier get high prime numbers using yield please give me a hint.

def very_high_prime_numbers_generator():
    number = 0
    while True:
        number = yield
        if not (number % 2 == 0 or number % 3 == 0 or number % 7 == 0 or number % 5 == 0 or number % 11 == 0 or number % 17 == 0 or number % 19 == 0 or number % 13 == 0):
            print(number)

number_generator = very_high_prime_numbers_generator()

number_generator.send(None)

for i in range(1000,10000):
    number_generator.send(i)
Alexis Drakopoulos
  • 1,065
  • 3
  • 16
  • "*I wanted to make a list of conditions for if.*" -- what does that mean? – costaparas Feb 02 '21 at 11:27
  • "*I wanted to make a program that would find very high prime numbers.*" -- your current approach seems quite hard-coded. I think you will have to do a lot more research before you can tackle this problem. – costaparas Feb 02 '21 at 11:28
  • Your algorithm will need some work, since it does seem to be generating some false primes. I suggest looking into some existing [primality testing algorithms](https://en.wikipedia.org/wiki/Primality_test) and [prime generation algorithms](https://en.wikipedia.org/wiki/Generation_of_primes). – costaparas Feb 02 '21 at 11:40

3 Answers3

0

This seems to be what you're trying to do although as others have pointed out it's far from efficient.

def find_prime(number, previous_primes):
    for value in previous_primes:
        if number % value == 0:
            return False
    return True


known_primes = [2, 3, 5, 7]
for i in range(8, 1000):
    is_prime = find_prime(i, known_primes)
    if is_prime:
        known_primes.append(i)
Alexis Drakopoulos
  • 1,065
  • 3
  • 16
  • yeah I know its bad but I was tasked with making a program that would generate high prime numbers but it has to be done with yield. Thanks for answering but I wanted to understand better how to use yield. Can you tell me where you would use yield in an efficient way? – maksymilian Feb 02 '21 at 21:08
0

I would advise having a look here.

a possible solution (yet not that efficient) for printing primes might be as described by Eli Bendersky, in the above link:

import math

def main():
    count = 3
    
    while True:
        isprime = True
        
        for x in range(2, int(math.sqrt(count) + 1)):
            if count % x == 0: 
                isprime = False
                break
        
        if isprime:
            print count
        
        count += 1
Hadar Sharvit
  • 333
  • 2
  • 10
0

You can use a nested loop or any or all to test the divisibility of the number against all those values:

if not any(number % k == 0 for k in (2, 3, 5, 7, 11, 13, 17, 19)):
    print(number)

Of course, this still tests only those values, which will not be enough for "very high prime numbers". Instead, you could keep track of the prime number generated so far an test against all of those:

def very_high_prime_numbers_generator():
    primes = []
    number = 2
    while True:
        if not any(number % p == 0 for p in primes):
            yield number
            primes.append(number)
        number += 1

number_generator = very_high_prime_numbers_generator()
for _ in range(100):
    print(next(number_generator))

(This could be further enhanced by stopping once k**2 > number, e.g. using itertools.takewhile, and only testing odd numbers above 2.)

Also note that your "generator" was rather odd. By using send to set the value of number and then printing inside the function, your "generator" behaved rather like a regular "check if this number is prime" function than a proper generator. The above also fixes that.

tobias_k
  • 74,298
  • 11
  • 102
  • 155