from random import SystemRandom
random = SystemRandom()
from os import urandom
def exp(x, n, m):
y = 1
z = x
while n > 0:
if n & 1:
y = (y * z) % m
z = (z * z) % m
n //= 2
return y
def prime(n, k):
if n % 2 == 0:
return False
d = n - 1
s = 0
while d % 2 == 0:
s += 1
d /= 2
for i in xrange(k):
a = long(2 + random.randint(0, n - 4))
x = exp(a, d, n)
if (x == 1) or (x == n - 1):
continue
for r in xrange(1, s):
x = (x * x) % n
if x == 1:
return False
if x == n - 1:
break
else:
return False
return True
def get_prime(size, accuracy):
while 1:
rstr = urandom(size - 1)
r = 128 | ord(urandom(1)) for c in rstr:
r = (r << 8) | ord(c)
r |= 1
if prime(r, accuracy):
return r
def get_prime_upto(n, accuracy):
n |= 1
while n > 0:
n -= 2
if prime(n, accuracy):
return n