1. 程式人生 > >【數論】中國剩餘定理

【數論】中國剩餘定理

問題:給定a1a2...an, 和m1,m2...mnmi之間兩兩互質,求一個x,使得x/ai=mi

構造方法:

先求出M=ni=1mi, 對於每個mi,求出M / mi, 然後和mi利用拓展歐幾里得演算法求出M/mip+miq=1時的值,取ni=1(paiM/mi)就是答案。

證明:

證明參考了wiki
由於mi之間兩兩互質,所以gcd(mi,mj)=1,gcd(mi,Mi)=1, 求出數論倒數ti使得Miti%mi=1,這就是上面利用擴充套件歐幾里得演算法求出的p值,aipM%mi=ai, 又由於M中包含了其他所有的mj, 所以aipM%mj=0, 因此

ni=1(paiM/mi)%mi=ai得證

程式碼:

for (int i = 0; i < 3; i++) {
    int x, y, w = M / m[i];
    gcd(m[i], w, x, y);
    ans = (ans + p[i] % m[i] * w * y) % M;
}