欧几里得算法
欧几里得算法:
算法:\(\gcd(a,b) = \gcd(b,a \mod b)\)
证明如下:
令 \(r= a\mod b\),设 \(d\) 为\(a,b\) 的一个公约数。
可得:\(r = a - bk\),\(a = dx\),\(b = dy\)
继而推出:\(r = dx - kdy = d(x - ky)\)
因此,\(d\) 为 \(r\) 的一个因数,得证。
int gcd(int a,int b){
if(b == 0){
return a;
}
return gcd(b,a % b);
}
扩展欧几里得算法:
功能:可以在知道 \(a,b\) 的情况下求解 \(ax+by=\gcd(a,b)\) 的一组 \(x,y\) 的解。
证明如下:
已知有方程 \(ax_0+by_0=\gcd(a,b)\),由欧几里得算法可得,存在\(bx_1 + (a \mod b)y_1=\gcd(b,a \mod b)\)
由欧几里得算法得\(ax_0+by_0=bx_1+(a - kb)y_1\)
移项,得:\(ax_0+by_0=ay_1 + b(x_1-ky_1)\)
易得:\(\begin{cases}x_0=y_1\\y_0=x_1-ky_1\\k=a/b \end{cases}\)
int x,y;
void ex_gcd(int a,int b){
if(b == 0){
x = 1;
y = 0;
return;
}
ex_gcd(b,a % b);
int t = x;
x = y;
y = t - (a/b)*y;
}
应用:
- 判断不定方程 \(ax+by=c\) 是否有解:
有解的条件:\(c \mod \gcd(a,b)= 0\) - 得出不定方程的通解:
\(\begin{cases}x=x_0+b/\gcd(a,b)\\y=y_0-a/\gcd(a,b)\end{cases}\) - 模线性方程 \(a\times x\equiv b(\mod n)\) 的解
由方程可得:\((a \times x - b)\mod n = 0\)
于是设出方程 \(a \times x - n \times y = b\)
由第二条即可解出