From 29104cdf4d747e5acfc3c036944e6a476738f3e3 Mon Sep 17 00:00:00 2001 From: aryan1165 Date: Sun, 1 Oct 2023 13:57:34 +0530 Subject: [PATCH 1/3] Removed ciphers/rabin_miller.py as it is already there maths/miller_rabin.py --- ciphers/rabin_miller.py | 223 ---------------------------------------- 1 file changed, 223 deletions(-) delete mode 100644 ciphers/rabin_miller.py diff --git a/ciphers/rabin_miller.py b/ciphers/rabin_miller.py deleted file mode 100644 index 410d559d4315..000000000000 --- a/ciphers/rabin_miller.py +++ /dev/null @@ -1,223 +0,0 @@ -# Primality Testing with the Rabin-Miller Algorithm - -import random - - -def rabin_miller(num: int) -> bool: - s = num - 1 - t = 0 - - while s % 2 == 0: - s = s // 2 - t += 1 - - for _ in range(5): - a = random.randrange(2, num - 1) - v = pow(a, s, num) - if v != 1: - i = 0 - while v != (num - 1): - if i == t - 1: - return False - else: - i = i + 1 - v = (v**2) % num - return True - - -def is_prime_low_num(num: int) -> bool: - if num < 2: - return False - - low_primes = [ - 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 low_primes: - return True - - for prime in low_primes: - if (num % prime) == 0: - return False - - return rabin_miller(num) - - -def generate_large_prime(keysize: int = 1024) -> int: - while True: - num = random.randrange(2 ** (keysize - 1), 2 ** (keysize)) - if is_prime_low_num(num): - return num - - -if __name__ == "__main__": - num = generate_large_prime() - print(("Prime number:", num)) - print(("is_prime_low_num:", is_prime_low_num(num))) From 5db6b329367c05e2005ad2e2efbc9df29285ff9a Mon Sep 17 00:00:00 2001 From: aryan1165 Date: Sun, 1 Oct 2023 14:26:42 +0530 Subject: [PATCH 2/3] Renamed miller_rabin.py to rabain_miller.py --- maths/{miller_rabin.py => rabin_miller.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename maths/{miller_rabin.py => rabin_miller.py} (100%) diff --git a/maths/miller_rabin.py b/maths/rabin_miller.py similarity index 100% rename from maths/miller_rabin.py rename to maths/rabin_miller.py From 19e4b135e6384d58b676903e6d1bff32dce60fe8 Mon Sep 17 00:00:00 2001 From: aryan1165 Date: Sun, 1 Oct 2023 15:34:26 +0530 Subject: [PATCH 3/3] Restore ciphers/rabin_miller.py and removed maths/rabin_miller.py --- ciphers/rabin_miller.py | 223 ++++++++++++++++++++++++++++++++++++++++ maths/rabin_miller.py | 51 --------- 2 files changed, 223 insertions(+), 51 deletions(-) create mode 100644 ciphers/rabin_miller.py delete mode 100644 maths/rabin_miller.py diff --git a/ciphers/rabin_miller.py b/ciphers/rabin_miller.py new file mode 100644 index 000000000000..410d559d4315 --- /dev/null +++ b/ciphers/rabin_miller.py @@ -0,0 +1,223 @@ +# Primality Testing with the Rabin-Miller Algorithm + +import random + + +def rabin_miller(num: int) -> bool: + s = num - 1 + t = 0 + + while s % 2 == 0: + s = s // 2 + t += 1 + + for _ in range(5): + a = random.randrange(2, num - 1) + v = pow(a, s, num) + if v != 1: + i = 0 + while v != (num - 1): + if i == t - 1: + return False + else: + i = i + 1 + v = (v**2) % num + return True + + +def is_prime_low_num(num: int) -> bool: + if num < 2: + return False + + low_primes = [ + 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 low_primes: + return True + + for prime in low_primes: + if (num % prime) == 0: + return False + + return rabin_miller(num) + + +def generate_large_prime(keysize: int = 1024) -> int: + while True: + num = random.randrange(2 ** (keysize - 1), 2 ** (keysize)) + if is_prime_low_num(num): + return num + + +if __name__ == "__main__": + num = generate_large_prime() + print(("Prime number:", num)) + print(("is_prime_low_num:", is_prime_low_num(num))) diff --git a/maths/rabin_miller.py b/maths/rabin_miller.py deleted file mode 100644 index 9f2668dbab14..000000000000 --- a/maths/rabin_miller.py +++ /dev/null @@ -1,51 +0,0 @@ -import random - -from .binary_exp_mod import bin_exp_mod - - -# This is a probabilistic check to test primality, useful for big numbers! -# if it's a prime, it will return true -# if it's not a prime, the chance of it returning true is at most 1/4**prec -def is_prime_big(n, prec=1000): - """ - >>> from maths.prime_check import is_prime - >>> # all(is_prime_big(i) == is_prime(i) for i in range(1000)) # 3.45s - >>> all(is_prime_big(i) == is_prime(i) for i in range(256)) - True - """ - if n < 2: - return False - - if n % 2 == 0: - return n == 2 - - # this means n is odd - d = n - 1 - exp = 0 - while d % 2 == 0: - d /= 2 - exp += 1 - - # n - 1=d*(2**exp) - count = 0 - while count < prec: - a = random.randint(2, n - 1) - b = bin_exp_mod(a, d, n) - if b != 1: - flag = True - for _ in range(exp): - if b == n - 1: - flag = False - break - b = b * b - b %= n - if flag: - return False - count += 1 - return True - - -if __name__ == "__main__": - n = abs(int(input("Enter bound : ").strip())) - print("Here's the list of primes:") - print(", ".join(str(i) for i in range(n + 1) if is_prime_big(i)))