Skip to content

Unify the various versions of is_prime() #5642

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
191 changes: 4 additions & 187 deletions ciphers/rabin_miller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import random

from maths.prime_check import prime_check


def rabinMiller(num: int) -> bool:
s = num - 1
Expand All @@ -25,199 +27,14 @@ def rabinMiller(num: int) -> bool:
return True


def isPrime(num: int) -> bool:
if num < 2:
return False

lowPrimes = [
2,
3,
5,
7,
11,
13,
17,
19,
23,
29,
31,
37,
41,
43,
47,
53,
59,
61,
67,
71,
73,
79,
83,
89,
97,
101,
103,
107,
109,
113,
127,
131,
137,
139,
149,
151,
157,
163,
167,
173,
179,
181,
191,
193,
197,
199,
211,
223,
227,
229,
233,
239,
241,
251,
257,
263,
269,
271,
277,
281,
283,
293,
307,
311,
313,
317,
331,
337,
347,
349,
353,
359,
367,
373,
379,
383,
389,
397,
401,
409,
419,
421,
431,
433,
439,
443,
449,
457,
461,
463,
467,
479,
487,
491,
499,
503,
509,
521,
523,
541,
547,
557,
563,
569,
571,
577,
587,
593,
599,
601,
607,
613,
617,
619,
631,
641,
643,
647,
653,
659,
661,
673,
677,
683,
691,
701,
709,
719,
727,
733,
739,
743,
751,
757,
761,
769,
773,
787,
797,
809,
811,
821,
823,
827,
829,
839,
853,
857,
859,
863,
877,
881,
883,
887,
907,
911,
919,
929,
937,
941,
947,
953,
967,
971,
977,
983,
991,
997,
]

if num in lowPrimes:
return True

for prime in lowPrimes:
if (num % prime) == 0:
return False

return rabinMiller(num)


def generateLargePrime(keysize: int = 1024) -> int:
while True:
num = random.randrange(2 ** (keysize - 1), 2 ** (keysize))
if isPrime(num):
if prime_check(num):
return num


if __name__ == "__main__":
num = generateLargePrime()
print(("Prime number:", num))
print(("isPrime:", isPrime(num)))
print(("isPrime:", prime_check(num)))
57 changes: 11 additions & 46 deletions maths/primelib.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

Overview:

isPrime(number)
sieveEr(N)
getPrimeNumbers(N)
primeFactorization(number)
Expand Down Expand Up @@ -38,41 +37,7 @@

"""

from math import sqrt


def isPrime(number):
"""
input: positive integer 'number'
returns true if 'number' is prime otherwise false.
"""

# precondition
assert isinstance(number, int) and (
number >= 0
), "'number' must been an int and positive"

status = True

# 0 and 1 are none primes.
if number <= 1:
status = False

for divisor in range(2, int(round(sqrt(number))) + 1):

# if 'number' divisible by 'divisor' then sets 'status'
# of false and break up the loop.
if number % divisor == 0:
status = False
break

# precondition
assert isinstance(status, bool), "'status' must been from type bool"

return status


# ------------------------------------------
from prime_check import prime_check


def sieveEr(N):
Expand Down Expand Up @@ -129,7 +94,7 @@ def getPrimeNumbers(N):
# if a number is prime then appends to list 'ans'
for number in range(2, N + 1):

if isPrime(number):
if prime_check(number):

ans.append(number)

Expand Down Expand Up @@ -164,11 +129,11 @@ def primeFactorization(number):
ans.append(number)

# if 'number' not prime then builds the prime factorization of 'number'
elif not isPrime(number):
elif not prime_check(number):

while quotient != 1:

if isPrime(factor) and (quotient % factor == 0):
if prime_check(factor) and (quotient % factor == 0):
ans.append(factor)
quotient /= factor
else:
Expand Down Expand Up @@ -317,8 +282,8 @@ def goldbach(number):
isinstance(ans, list)
and (len(ans) == 2)
and (ans[0] + ans[1] == number)
and isPrime(ans[0])
and isPrime(ans[1])
and prime_check(ans[0])
and prime_check(ans[1])
), "'ans' must contains two primes. And sum of elements must been eq 'number'"

return ans
Expand Down Expand Up @@ -462,11 +427,11 @@ def getPrime(n):

# if ans not prime then
# runs to the next prime number.
while not isPrime(ans):
while not prime_check(ans):
ans += 1

# precondition
assert isinstance(ans, int) and isPrime(
assert isinstance(ans, int) and prime_check(
ans
), "'ans' must been a prime number and from type int"

Expand All @@ -486,7 +451,7 @@ def getPrimesBetween(pNumber1, pNumber2):

# precondition
assert (
isPrime(pNumber1) and isPrime(pNumber2) and (pNumber1 < pNumber2)
prime_check(pNumber1) and prime_check(pNumber2) and (pNumber1 < pNumber2)
), "The arguments must been prime numbers and 'pNumber1' < 'pNumber2'"

number = pNumber1 + 1 # jump to the next number
Expand All @@ -495,7 +460,7 @@ def getPrimesBetween(pNumber1, pNumber2):

# if number is not prime then
# fetch the next prime number.
while not isPrime(number):
while not prime_check(number):
number += 1

while number < pNumber2:
Expand All @@ -505,7 +470,7 @@ def getPrimesBetween(pNumber1, pNumber2):
number += 1

# fetch the next prime number.
while not isPrime(number):
while not prime_check(number):
number += 1

# precondition
Expand Down
Loading