LL CRT(int k, LL* a, LL* r) { LL n = 1, ans = 0; for (int i = 1; i <= k; i++) n = n * r[i]; for (int i = 1; i <= k; i++) { LL m = n / r[i], b, y; exgcd(m, r[i], b, y); // b * m mod r[i] = 1 ans = (ans + a[i] * m * b % n) % n; } return (ans % n + n) % n;}
Python
def CRT(k, a, r): n = 1 ans = 0 for i in range(1, k + 1): n = n * r[i] for i in range(1, k + 1): m = n // r[i] b = y = 0 exgcd(m, r[i], b, y) # b * m mod r[i] = 1 ans = (ans + a[i] * m * b % n) % n return (ans % n + n) % n
证明
我们需要证明上面算法计算所得的 x 对于任意 i=1,2,⋯,k 满足 x≡ai(modni)。
1234567Chinese Remainder Algorithm cra(v,m):Input: m=(m0,m1,…,mn−1), mi∈Z+∧gcd(mi,mj)=1 for all i=j,v=(v0,…,vn−1) where vi=xmodmi.Output: xmod∏i=0n−1mi.for i from 1 to (n−1) doCi←(∏j=0i−1mj)−1modmix←v0for i from 1 to (n−1) dou←(vi−x)⋅Cimodmix←x+u∏j=0i−1mjreturn (x)