I understand that my code's complexity isn't the best, and I thought it might take 3 - 6 minutes running, but I gave it 15 minutes and it didn't stop. How do I know if it got stuck somewhere or it's just still running? and How can I improve it?
import random
import time
def is_prime(m):
""" probabilistic test for compositeness of m>30
adds a trivial sieve to quickly eliminate divisibility
by small primes. """
if m in [2,3,5,7,11,13,17,19,23,29]:
return True # treats small primes separately
for prime in [2,3,5,7,11,13,17,19,23,29]:
if m % prime == 0:
return False
for i in range(0,100):
a = random.randint(1,m-1) # a is a random integer in [1..m-1]
if pow(a,m-1,m) != 1:
return False
return True
def order_safe_prime(g,p):
""" computes the order of g modulo a safe prime, p """
if g<1 or g>p-1:
return str.format("g={} is out of range", g)
elif not is_prime(p):
return str.format("{} is not a prime", p)
q=(p-1)//2
if not is_prime(q):
return str.format("q={} is not a prime", (p-1)//2)
else:
if g==1:
return 1
if g==p-1:
return 2
if pow(g,q,p)==1:
return q
if pow(g,p-1,p)==1:
return p-1
def stats_ord_secure(p,times=10000):
cnt1=0
cnt2=0
for i in range(times):
g=random.randint(2,p-2)
if order_safe_prime(g,p)==(p-1)/2:
cnt1+=1
if order_safe_prime(g,p)==(p-1):
cnt2+=1
return ((cnt1/times,cnt2/times))
For example running :
>>>stats_ord_secure((2**1001)+188151)
would take more than 15 minutes !