sawine@2
|
1 |
isProbPrime = True
|
sawine@2
|
2 |
|
sawine@2
|
3 |
import sys
|
sawine@2
|
4 |
from math import log
|
sawine@2
|
5 |
from random import randint
|
sawine@2
|
6 |
|
sawine@2
|
7 |
def main():
|
sawine@2
|
8 |
args = parse_args()
|
sawine@2
|
9 |
n = args.n
|
sawine@2
|
10 |
if args.s:
|
sawine@2
|
11 |
if safe_is_prime(n):
|
sawine@2
|
12 |
print "%i is most probably a prime number." % n
|
sawine@2
|
13 |
else:
|
sawine@2
|
14 |
print "%i is not a prime number." % n
|
sawine@2
|
15 |
return
|
sawine@2
|
16 |
elif args.a:
|
sawine@2
|
17 |
a = args.a
|
sawine@2
|
18 |
else:
|
sawine@2
|
19 |
a = randint(2, n-1)
|
sawine@2
|
20 |
if is_prime(n, a):
|
sawine@2
|
21 |
print "%i is probably a prime." % n
|
sawine@2
|
22 |
else:
|
sawine@2
|
23 |
print "%i is not a prime." % n
|
sawine@2
|
24 |
|
sawine@2
|
25 |
def safe_is_prime(n):
|
sawine@2
|
26 |
aset = set()
|
sawine@2
|
27 |
while len(aset) < int(log(n)):
|
sawine@2
|
28 |
aset.add(randint(2, n-1))
|
sawine@2
|
29 |
for a in aset:
|
sawine@2
|
30 |
if not is_prime(n, a):
|
sawine@2
|
31 |
return False
|
sawine@2
|
32 |
return True
|
sawine@2
|
33 |
|
sawine@2
|
34 |
def is_prime(n, a=None):
|
sawine@2
|
35 |
if not a:
|
sawine@2
|
36 |
a = randint(2, n-1)
|
sawine@2
|
37 |
global isProbPrime
|
sawine@2
|
38 |
isProbPrime = True
|
sawine@2
|
39 |
#print "Prime Test for %i with a = %i:" % (n, a)
|
sawine@2
|
40 |
r = power(a, n-1, n)
|
sawine@2
|
41 |
if r != 1 or not isProbPrime:
|
sawine@2
|
42 |
#print "=> %i is not a prime." % n
|
sawine@2
|
43 |
return False
|
sawine@2
|
44 |
else:
|
sawine@2
|
45 |
#print "=> %i is probably a prime." % n
|
sawine@2
|
46 |
return True
|
sawine@2
|
47 |
|
sawine@2
|
48 |
def power(a, p, n):
|
sawine@2
|
49 |
global isProbPrime
|
sawine@2
|
50 |
if p == 0:
|
sawine@2
|
51 |
return 1
|
sawine@2
|
52 |
x = power(a, p/2, n)
|
sawine@2
|
53 |
r = (x*x)%n
|
sawine@2
|
54 |
#print "power(%i, %i, %i)" % (a, p, n)
|
sawine@2
|
55 |
#print "result = %i" % r
|
sawine@2
|
56 |
if r == 1 and x != 1 and x != n-1:
|
sawine@2
|
57 |
isProbPrime = False
|
sawine@2
|
58 |
#print "isProbPrime = False"
|
sawine@2
|
59 |
if p%2 == 1:
|
sawine@2
|
60 |
r = (a*r)%n
|
sawine@2
|
61 |
#print "updated result = %i" % r
|
sawine@2
|
62 |
return r
|
sawine@2
|
63 |
|
sawine@2
|
64 |
from argparse import ArgumentParser
|
sawine@2
|
65 |
|
sawine@2
|
66 |
def parse_args():
|
sawine@2
|
67 |
parser = ArgumentParser(description='Applies the randomised prime number test.')
|
sawine@2
|
68 |
parser.add_argument('n', type=int, help='number to be tested')
|
sawine@2
|
69 |
parser.add_argument('-a', type=int, help='provide a yourself')
|
sawine@2
|
70 |
parser.add_argument('-s', action='store_true', help='multiple tests to minimise probability of failure')
|
sawine@2
|
71 |
return parser.parse_args()
|
sawine@2
|
72 |
|
sawine@2
|
73 |
if __name__ == "__main__":
|
sawine@2
|
74 |
main()
|