examples/prime.py
author Eugen Sawin <sawine@me73.com>
Tue, 08 Mar 2011 21:14:18 +0100
changeset 13 eaa3e0198a89
permissions -rw-r--r--
Added complete fs.
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()