from hw3_4_util import mod_exp from random import randrange def rabin_miller(n, target=128): """returns True if prob(^n' is prime) <= 2**(-'target')""" def calculate_t(n): n = n - 1 t = 0 while n % 2 == 0: n = n / 2 t += 1 return t if n % 2 == 0: return False t = calculate_t(n) s = (n - 1)/(2 ** t) n_tests = target / 2 tried = set() if n_tests > n: raise Exception("n i s too small") for i in range(n_tests): while True: a = randrange(1, n) if a not in tried: break tried.add(a) if mod_exp(a, s, n) == 1: continue found = False for j in range(0, t): if mod_exp(a, 2**j*s, n) == (n - 1): found = True break if not found: return False return True