阅读(2633) (9)

密码学 中国剩余定理

2020-07-29 15:58:23 更新

简介

中国剩余定理(Chinese remainder theorem, CRT)一般指孙子定理

孙子定理是中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称中国余数定理。一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。

《孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。

(S): ⎧x≡a1(mod m1) ⎪x≡a2(mod m2) ⎪⋮ ⎨⋮ ⎪x≡an(mod mn) ⎩

有解的判定条件,并用构造法给出了在有解情况下解的具体形式。

中国剩余定理说明:假设整数m1,m2,...,mn 其中任两数互质,则对任意的整数:a1,a2,...,an,方程组(S)有解

实现

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


if __name__ == '__main__':
   n = [3, 5, 7]
   a = [2, 3, 2]
   print(chinese_remainder(n, a))

运行结果为23.