參考資料:https://www.cnblogs.com/haveyoueverbeen/p/4612753.html
求方程 ax+by=c(x,y∈Z) 的解
擴展歐幾里得算法是一種用來求關於 x,y 的方程 ax+by=gcd(a,b)(x,y∈Z) 的一組解的算法.
考慮方程 ax+by=gcd(a,b)(a>b)(方程 (1)),
1. b=0 時,gcd(a,b)=a,(1,0) 是該方程的一組解;
2. 設 (x1,y1) 是方程 bx+(amodb)y=gcd(b,amodb)(方程 (2)) 的一組解,
所以 bx1+(amodb)y1=gcd(b,amodb).
由 gcd(a,b)=gcd(b,amodb),
得 bx1+(amodb)y1=gcd(a,b),
bx1+(a−⌊ba⌋b)y1=gcd(a,b),
ay1+b(x1−⌊ba⌋y1)=gcd(a,b).
所以 (y1,x1−⌊ba⌋y1) 是該方程的一組解.
因此要(yào)求方程 (1)的一組解,我們先考慮 b,如果 b=0,方程 (1)的一組解就是 (1,0),否則遞歸求方程 (2) 的一組解,然後利用方程2的一組解得到方程 (1) 的一組解。
代碼:
template<typename T>
pair<T, T> exgcd(const T a, const T b)
//exgcd(x,y):返回關於 x,y 的方程 ax+by=gcd(a,b) 的一組解
{
if(b == 0)
return pair<T, T>(1, 0);
pair<T, T> tmp = exgcd(b, a % b);
return pair<T, T>(tmp.sec, tmp.fir - (a / b) * tmp.sec);
}
通過這個算法,我們得到了方程 (1) 的一組解,可以由這組特解寫出它的通解:x=x1+kb,y=y1−ka.