RosettaCodeData/Task/Chinese-remainder-theorem/Python/chinese-remainder-theorem-2.py

30 lines
545 B
Python
Raw Permalink Normal View History

2019-09-12 10:33:56 -07:00
# Python 3.6
from functools import reduce
2015-11-18 06:14:39 +00:00
def chinese_remainder(n, a):
sum = 0
prod = reduce(lambda a, b: a*b, n)
for n_i, a_i in zip(n, a):
2019-09-12 10:33:56 -07:00
p = prod // n_i
2015-11-18 06:14:39 +00:00
sum += a_i * mul_inv(p, n_i) * p
return sum % prod
2019-09-12 10:33:56 -07:00
2015-02-20 09:02:09 -05:00
def mul_inv(a, b):
b0 = b
x0, x1 = 0, 1
if b == 1: return 1
while a > 1:
2019-09-12 10:33:56 -07:00
q = a // b
2015-02-20 09:02:09 -05:00
a, b = b, a%b
x0, x1 = x1 - q * x0, x0
if x1 < 0: x1 += b0
return x1
2019-09-12 10:33:56 -07:00
2015-02-20 09:02:09 -05:00
if __name__ == '__main__':
n = [3, 5, 7]
a = [2, 3, 2]
2019-09-12 10:33:56 -07:00
print(chinese_remainder(n, a))