from functools import reduce
def chinese_remainder(n, a):
sum = 0
prod = reduce(lambda a, b: a*b, n)
for n_i, a_i in zip(n,a):
p = prod/n_i
sum += a_i * mul_inv(p, n_i) * p
return sum % prod
def mul_inv(a, b):
b0 = b
x0, x1 = 0,1
if b == 1:
return 1
while a > 1:
q = a // b
a , b = b, a%b
x0, x1 = x1 -q*x0, x0
if x1 < 0:
x1 += b0
return x1
a = [2,3,5]
n = [5,11,17]
print(chinese_remainder(n,a))
ZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQoKZGVmIGNoaW5lc2VfcmVtYWluZGVyKG4sIGEpOgogICAgc3VtID0gMAogICAgcHJvZCA9IHJlZHVjZShsYW1iZGEgYSwgYjogYSpiLCBuKQogICAgZm9yIG5faSwgYV9pIGluIHppcChuLGEpOgogICAgICAgIHAgPSBwcm9kL25faQogICAgICAgIHN1bSArPSBhX2kgKiBtdWxfaW52KHAsIG5faSkgKiBwCiAgICByZXR1cm4gc3VtICUgcHJvZAogICAgCmRlZiBtdWxfaW52KGEsIGIpOgogICAgYjAgPSBiCiAgICB4MCwgeDEgPSAwLDEKICAgIGlmIGIgPT0gMToKICAgICAgICByZXR1cm4gMQogICAgd2hpbGUgYSA+IDE6CiAgICAgICAgcSA9IGEgLy8gYgogICAgICAgIGEgLCBiID0gYiwgYSViCiAgICAgICAgeDAsIHgxID0geDEgLXEqeDAsIHgwCiAgICBpZiB4MSA8IDA6CiAgICAgICAgeDEgKz0gYjAKICAgIHJldHVybiB4MQoKYSA9IFsyLDMsNV0KbiA9IFs1LDExLDE3XQoKCnByaW50KGNoaW5lc2VfcmVtYWluZGVyKG4sYSkp