def test_generate(): from sympy.ntheory.generate import sieve sieve._reset() assert nextprime(-4) == 2 assert nextprime(2) == 3 assert nextprime(5) == 7 assert nextprime(12) == 13 assert prevprime(3) == 2 assert prevprime(7) == 5 assert prevprime(13) == 11 assert prevprime(19) == 17 assert prevprime(20) == 19 sieve.extend_to_no(9) assert sieve._list[-1] == 23 assert sieve._list[-1] < 31 assert 31 in sieve assert nextprime(90) == 97 assert nextprime(10**40) == (10**40 + 121) assert prevprime(97) == 89 assert prevprime(10**40) == (10**40 - 17) assert list(sieve.primerange(10, 1)) == [] assert list(primerange(10, 1)) == [] assert list(primerange(2, 7)) == [2, 3, 5] assert list(primerange(2, 10)) == [2, 3, 5, 7] assert list(primerange(1050, 1100)) == [1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097] s = Sieve() for i in range(30, 2350, 376): for j in range(2, 5096, 1139): A = list(s.primerange(i, i + j)) B = list(primerange(i, i + j)) assert A == B s = Sieve() assert s[10] == 29 assert nextprime(2, 2) == 5 raises(ValueError, lambda: totient(0)) raises(ValueError, lambda: reduced_totient(0)) raises(ValueError, lambda: primorial(0)) assert mr(1, [2]) is False func = lambda i: (i**2 + 1) % 51 assert next(cycle_length(func, 4)) == (6, 2) assert list(cycle_length(func, 4, values=True)) == \ [17, 35, 2, 5, 26, 14, 44, 50, 2, 5, 26, 14] assert next(cycle_length(func, 4, nmax=5)) == (5, None) assert list(cycle_length(func, 4, nmax=5, values=True)) == \ [17, 35, 2, 5, 26] sieve.extend(3000) assert nextprime(2968) == 2969 assert prevprime(2930) == 2927 raises(ValueError, lambda: prevprime(1))
def prime_generators(): def simple_primes(): D = defaultdict(list) for q in naturals(2): if q not in D: yield q D[q * q] = [q] else: for p in D[q]: D[p + q].append(p) del D[q] def erat30(): "https://stackoverflow.com/questions/2211990/how-to-implement-an-efficient-infinite-generator-of-prime-numbers-in-python" D = {9: 3, 25: 5} yield 2 yield 3 yield 5 MASK = cycle((1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0)) MODULOS = frozenset((1, 7, 11, 13, 17, 19, 23, 29)) for q in compress(count(7, 2), MASK): p = D.pop(q, None) if p is None: D[q * q] = q yield q else: x = q + 2 * p while x in D or (x % 30) not in MODULOS: x += 2 * p D[x] = p sieve._reset() def primes_sympy(): upper = 2 while True: upper *= 2 yield from sieve.primerange(upper // 2, upper) def primes_sympy2(): upper = 2 while True: upper *= 2 yield from sieve.primerange(upper // 2, upper) print("Generate the first 40000 prime numbers") speed_compare( [simple_primes(), erat30(), primes_sympy(), primes_sympy2()], ["Simple", "erat30", "sympy", "sympy_again"], n=40000, reps=3)
def test_composite(): from sympy.ntheory.generate import sieve sieve._reset() assert composite(1) == 4 assert composite(2) == 6 assert composite(5) == 10 assert composite(11) == 20 assert composite(41) == 58 assert composite(57) == 80 assert composite(296) == 370 assert composite(559) == 684 assert composite(3000) == 3488 assert composite(4096) == 4736 assert composite(9096) == 10368 assert composite(25023) == 28088 sieve.extend(3000) assert composite(1957) == 2300 assert composite(2568) == 2998 raises(ValueError, lambda: composite(0))
def test_generate(): from sympy.ntheory.generate import sieve sieve._reset() assert nextprime(-4) == 2 assert nextprime(2) == 3 assert nextprime(5) == 7 assert nextprime(12) == 13 assert prevprime(3) == 2 assert prevprime(7) == 5 assert prevprime(13) == 11 assert prevprime(19) == 17 assert prevprime(20) == 19 sieve.extend_to_no(9) assert sieve._list[-1] == 23 assert sieve._list[-1] < 31 assert 31 in sieve assert nextprime(90) == 97 assert nextprime(10**40) == (10**40 + 121) assert prevprime(97) == 89 assert prevprime(10**40) == (10**40 - 17) assert list(sieve.primerange(10, 1)) == [] assert list(sieve.primerange(5, 9)) == [5, 7] sieve._reset(prime=True) assert list(sieve.primerange(2, 12)) == [2, 3, 5, 7, 11] assert list(sieve.totientrange(5, 15)) == [4, 2, 6, 4, 6, 4, 10, 4, 12, 6] sieve._reset(totient=True) assert list(sieve.totientrange(3, 13)) == [2, 2, 4, 2, 6, 4, 6, 4, 10, 4] assert list(sieve.totientrange(900, 1000)) == [totient(x) for x in range(900, 1000)] assert list(sieve.totientrange(0, 1)) == [] assert list(sieve.totientrange(1, 2)) == [1] assert list(sieve.mobiusrange(5, 15)) == [-1, 1, -1, 0, 0, 1, -1, 0, -1, 1] sieve._reset(mobius=True) assert list(sieve.mobiusrange(3, 13)) == [-1, 0, -1, 1, -1, 0, 0, 1, -1, 0] assert list(sieve.mobiusrange(1050, 1100)) == [mobius(x) for x in range(1050, 1100)] assert list(sieve.mobiusrange(0, 1)) == [] assert list(sieve.mobiusrange(1, 2)) == [1] assert list(primerange(10, 1)) == [] assert list(primerange(2, 7)) == [2, 3, 5] assert list(primerange(2, 10)) == [2, 3, 5, 7] assert list(primerange(1050, 1100)) == [1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097] s = Sieve() for i in range(30, 2350, 376): for j in range(2, 5096, 1139): A = list(s.primerange(i, i + j)) B = list(primerange(i, i + j)) assert A == B s = Sieve() assert s[10] == 29 assert nextprime(2, 2) == 5 raises(ValueError, lambda: totient(0)) raises(ValueError, lambda: reduced_totient(0)) raises(ValueError, lambda: primorial(0)) assert mr(1, [2]) is False func = lambda i: (i**2 + 1) % 51 assert next(cycle_length(func, 4)) == (6, 2) assert list(cycle_length(func, 4, values=True)) == \ [17, 35, 2, 5, 26, 14, 44, 50, 2, 5, 26, 14] assert next(cycle_length(func, 4, nmax=5)) == (5, None) assert list(cycle_length(func, 4, nmax=5, values=True)) == \ [17, 35, 2, 5, 26] sieve.extend(3000) assert nextprime(2968) == 2969 assert prevprime(2930) == 2927 raises(ValueError, lambda: prevprime(1))
#NumberTh functions with SymPy package #------------------------------------- from sympy import ntheory from sympy import sieve from sympy import generate sieve._reset( ) # An infinite list of prime numbers, implemented as a dynamically growing sieve of Eratosthenes.#When a lookup is # requested involving an odd number that has not been sieved,the sieve is automatically extended up to that number. print(13 in sieve) # prints 'True' if the input is prime, sieve.extend(40) #for input n grows the sieve to contain all primes <= n print(sieve[10]) # returns n th prime sieve.extend_to_no(15) # extends upto n th prime # mobiusrange(a,b) genarates Mobius numbers for the range [a,b), means output will be a list. Mob_func = sieve.mobiusrange(7, 12) print('\n Mobius function outputs in the given range:', [i for i in Mob_func]) # primerange(a,b) generates all prime numbers in the range [a,b) Prime_list = sieve.primerange(1, 5) print('\n Primes in the given range are :', [i for i in Prime_list]) #search(n) return the indices i, j of the primes that bound n. If n is prime then i == j. Although n can be an expression, # if ceiling cannot convert it to an integer then an error will be raised. x, y = sieve.search(25) print('\n The given input is in between ', '(', x, ',', y, ')', 'th Primes \n')
#used to check which values exist existence = multiprocessing.Array('i', [0 for val in range(max_n + 1)]) existence[1] = 1 existence[2] = 1 existence[3] = 1 #holds our processes jobs = [] #prime sieve to generate primes #we use these for finding the smallest prime divisor of each n print("Calculating all necessary primes...") primes = multiprocessing.Array( 'i', [i for i in sieve.primerange(2, int(sqrt(max_n)) + 1)]) sieve._reset() print("Solving...") ## #Creating the processes ## #setting up each process with their own values of n #each of the k processes only looks at values of n where n+cur=0(mod k), 0<cur<k #initialize the processes in a loop #pass in the shared variables and start the processing for cur in range(0, processes): cur_process = multiprocessing.Process( target=inductive_solver,