diff --git a/src/prime.py b/src/prime.py index eb284d3df6445c162664a5132ccd2f2863a7fc62..0315465a6f940ec43ff9b584cd7e551636922b85 100644 --- a/src/prime.py +++ b/src/prime.py @@ -1,9 +1,8 @@ -from math import * - -"""Check wether a number is prime or not +def is_prime_number(number): + """Check wether a number is prime or not Bruteforcing method -""" -def isPrimeNumber(number): + """ + from math import floor, sqrt if number == 1: # 1 is not prime return False if number == 2: # 2 is a prime number @@ -17,3 +16,36 @@ def isPrimeNumber(number): return True +def is_probably_prime(n, k): + """ Check wether a number is probably prime + Miller Rabin Primality Test + V2 + """ + from random import randint + + if n == 1: # 1 is not prime + return False + if n == 2: # 2 is a prime n + return True + if not n & 0x01: # even numbers are not prime + return False + + # Get the number of witness we need + # Number of trailing zeroes in the binary representation of n-1 + # n - 1 = 2**n * n + s = ((n - 1) & -(n - 1)).bit_length() - 1 + d = int((n - 1) / 2**s) + + for i in range(1, n): + x = 2 + randint(1, n-4) + y = pow(x, d, n) + if y != 1 and y != n - 1: + for r in range(1, s - 1): + y = pow(y, 2, n) + if y == n - 1: + break + + if y != 1: + return False + return True # Probably Prime +