歐幾里得與擴充套件歐幾里得
阿新 • • 發佈:2019-01-15
歐幾里得:
int gcd(int a, int b)
{
return !b ? a : gcd(b, a%b);
}
int lcm(int a, int b)//最小公倍數
{
return a / gcd(a, b) * b;//先除後乘避免溢位
}
擴充套件歐幾里得:
存在整數對
推導過程:
用遞迴求解擴充套件歐幾里得,設已經求出了下一層遞迴的解,即:
又
將
(a/b)∗b)∗y1=gcd(a,b)=>ay1+b(x1−(a/b)∗y1)=gcd(a,b)
當
寫成程式碼,模板如下
int extgcd(int a, int b, int &x, int &y)
{
int d = a;
if(b != 0)
{
d = extgcd(b, a%b, y, x);
y -= (a / b) * x;
}
else x = 1, y = 0;
return d;
}
求解不定方程:
若 )=0
通過上面的方法可得到一組特解
證明:
首先
即
通解為
在所有解中最小的正整數為
所以對於方程
注意:若
int cal(int a, int b, int c)
{
int x, y;
int gcd = extgcd(a, b, x, y);
if(c % gcd != 0) return -1;
x *= c/gcd;
b /= gcd;
if(b < 0) b = -b;
int ans = x % b;
if(ans <= 0) ans += b;
return ans;
}
同餘方程:
根據上面的內容,我們可以得到: