Skip to content

Added binary exponentiaion with respect to modulo #1428

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

Merged
merged 11 commits into from
Dec 24, 2019
28 changes: 28 additions & 0 deletions maths/binary_exp_mod.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
def bin_exp_mod(a, n, b):
"""
>>> bin_exp_mod(3, 4, 5)
1
>>> bin_exp_mod(7, 13, 10)
7
"""
# mod b
assert not (b == 0), "This cannot accept modulo that is == 0"
if n == 0:
return 1

if n % 2 == 1:
return (bin_exp_mod(a, n - 1, b) * a) % b

r = bin_exp_mod(a, n / 2, b)
return (r * r) % b


if __name__ == "__main__":
try:
BASE = int(input("Enter Base : ").strip())
POWER = int(input("Enter Power : ").strip())
MODULO = int(input("Enter Modulo : ").strip())
except ValueError:
print("Invalid literal for integer")

print(bin_exp_mod(BASE, POWER, MODULO))
50 changes: 50 additions & 0 deletions maths/miller_rabin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
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(n, prec=1000):
"""
>>> from .prime_check import prime_check
>>> all(is_prime(i) == prime_check(i) for i in range(1000))
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 i 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(i)))