2020-12-12 00:26:02 +01:00
|
|
|
|
|
|
|
# Copyright (C) 2019, 2020 Hesham T. Banafa
|
|
|
|
|
2020-04-18 17:34:36 +02:00
|
|
|
#From: https://stackoverflow.com/questions/17298130/working-with-large-primes-in-python
|
|
|
|
from random import randrange
|
|
|
|
def is_prime(n, k=10):
|
|
|
|
if n == 2:
|
|
|
|
return True
|
|
|
|
if not n & 1:
|
|
|
|
return False
|
|
|
|
|
|
|
|
def check(a, s, d, n):
|
|
|
|
x = pow(a, d, n)
|
|
|
|
if x == 1:
|
|
|
|
return True
|
|
|
|
for i in range(s - 1):
|
|
|
|
if x == n - 1:
|
|
|
|
return True
|
|
|
|
x = pow(x, 2, n)
|
|
|
|
return x == n - 1
|
|
|
|
|
|
|
|
s = 0
|
|
|
|
d = n - 1
|
|
|
|
|
|
|
|
while d % 2 == 0:
|
|
|
|
d >>= 1
|
|
|
|
s += 1
|
|
|
|
|
|
|
|
for i in range(k):
|
|
|
|
a = randrange(2, n - 1)
|
|
|
|
if not check(a, s, d, n):
|
|
|
|
return False
|
|
|
|
return True
|