算法學習筆記1.2.2 擴展歐幾裏得
阿新 • • 發佈:2018-08-23
基礎 調用 輸入 擴展歐幾裏得 引用 class 最大 urn 方程
任務
求出A,B的最大公約數,且求出X,Y滿足AX + BY = GCD(A, B)。
說明
要求X,Y,滿足:
- AX + BY = GCD(A,B)。
當 B = 0 時,有X=1,Y=0時等式成立。
當 B > 0 時,在歐幾裏得算法的基礎上,已知:
- GCD(A,B) = GCD(B, A mod B)
先遞歸求出 X‘,Y‘ 滿足:
- BX‘ + (A mod B)Y‘ = GCD(B, A mod B) = GCD(A, B)
然後可以回推,我們將上式化簡得:
- BX‘ + (A - A/B x B)Y‘ = GCD(A, B)
- AY‘ + BX‘ - (A/B) x BY‘ = GCD(A, B)
這裏除法指整除。把含B的因式提取一個B,可得:
- AY‘ + B(X‘ - A/B x Y‘) = GCD(A, B)
故 X=Y‘, Y= X‘ - A/B x Y‘。
接口
int extend_gcd(int a, int b, int &x, int &y);
復雜度:O(logN), 其中N和a,b同階。
輸入:
- a,b 兩個整數
- &x, &y 引用,ax + by = GCD(a,b)的一組解
輸出:a和b的最大公約數
調用後x,y滿足方程ax+by=GCD(a,b)。
代碼
int extend_gcd(int a, int b, int &x, int &y) { if (b == 0) { x = 1; y = 0; return a; } else { int r = extend_gcd(b, a%b, y, x); y -= x * (a / b); return r; } }
使用範例
POJ1006,POJ2115。
算法學習筆記1.2.2 擴展歐幾裏得