歐幾里德算法:
也叫輾轉相除法,用於計算兩個正整數 a ,b 的最大公約數。
公式 gcd(a, b) = gcd (b ,a%b);
擴展歐幾里德算法:
對於不完全爲0的整數 a b ,必存在 x 和 y 使得 a*x + b*y = gcd(a,b);
代碼:
void extend_eulid(long long a,long long b)
{
if(b==0)
{
x=1;
y=0;
q=a;
}
else
{
extend_eulid(b,a%b);
int temp=x;
x=y;
y=temp-a/b*y;
}
}
把這個實現和歐幾里德的遞歸實現相比,發現多了下面的x,y賦值過程,這就是擴展歐幾里德算法的精髓。
可以這樣思考:
對於a' = b, b' = a % b 而言,我們求得 x, y使得 a'x + b'y = Gcd(a', b')
由於b' = a % b = a - a / b * b (注:這裏的/是程序設計語言中的除法)
那麼可以得到:
a'x + b'y = Gcd(a', b') ===>
bx + (a - a / b * b)y = Gcd(a', b') = Gcd(a, b) ===>
ay +b(x - a / b*y) = Gcd(a, b)
因此對於a和b而言,他們的相對應的p,q分別是 y和(x-a/b*y)
補充:關於使用擴展歐幾里德算法解決不定方程的辦法
對於不定整數方程pa+qb=c,若 c mod Gcd(p, q)=0,則該方程存在整數解,否則不存在整數解。
上面已經列出找一個整數解的方法,在找到p * a+q * b = Gcd(p, q)的一組解p0,q0後,p * a+q * b = Gcd(p, q)的其他整數解滿足:
p = p0 + b/Gcd(p, q) * t
q = q0 - a/Gcd(p, q) * t(其中t爲任意整數)
至於pa+qb=c的整數解,只需將p * a+q * b = Gcd(p, q)的每個解乘上 c/Gcd(p, q) 即可