defCRT(k, a, r): n = 1 ans = 0 for i inrange(1, k + 1): n = n * r[i] for i inrange(1, k + 1): m = n // r[i] b =y=0 exgcd(m, r[i], b, y) # b * m mod r[i] = 1 exgcd是另一个用来求逆元的自定义函数未标 ans = (ans + a[i] * m * b % n) % n return (ans % n + n) % n
当然了上述代码可能更多用于算法题中,密码学里python有很多强大的库可以直接调用CRT
1 2 3 4
from sympy.ntheory.modular import crt a_list=[a1,a2,a3,····ak] n_list=[n1,n2,n3,····nk] x,n=crt(n_list,c_list) //crt会返回一个元组(x,N)其中x就是我们所需要的通解,n就是所有模数(n1,n2等)的乘积