Add own bitarray and Miller-Rabin primality test.

This commit is contained in:
2023-10-01 18:10:27 +02:00
parent eb7ec037d2
commit bf3732794a
2 changed files with 65 additions and 6 deletions

View File

@@ -1,4 +1,5 @@
from functools import lru_cache
from lib_bitarray import Bitarray
try:
from lib_misc import get_item_counts
from lib_misc import product
@@ -65,6 +66,29 @@ def is_prime(n):
return True
def is_prime_rabin_miller(number):
""" Rabin-Miller Primality Test """
if number % 6 not in [1,5]:
return False
r, s = 1, number - 1
while s % 2 == 0:
s //= 2
r += 1
for witness in [2, 3, 5, 7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 47, 53]:
remainder = pow(witness, s, number)
if remainder == 1:
continue
for _ in range(1, r):
if remainder == number - 1:
break
remainder = pow(remainder, 2, number)
else:
return False
return True
def prime_nth(n):
"""Returns the nth prime number. The first number
is 1 indexed, i.e. n = 1 -> 2, n = 2 -> 3, etc.
@@ -97,12 +121,8 @@ def primes(n_max):
:param n_max:
"""
try:
import bitarray
b = bitarray.bitarray(n_max)
b.setall(True)
except ModuleNotFoundError:
b = [True for _ in range(n_max)]
b = Bitarray(n_max)
b.setall(True)
n = 1
b[n - 1] = False
while n * n <= n_max: