欧几里得算法
公式表述:gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
证明:
aaa 可以表示为 a=kb+r,r=a%ba = kb + r,r = a\%ba=kb+r,r=a%b
假设 ddd 是 (a,b)(a,b)(a,b) 的一个公约数,则有
d∣a,d∣bd|a,d|bd∣a,d∣b,而 r=a–kbr = a – kbr=a–kb,因此 d∣rd|rd∣r
所以 ddd 也是 (b,a%b)(b,a\%b)(b,a%b) 的公约数。
除了上面这个经典算法,还有 stein 算法用来求解最大公约数,只有整数的移位和加减法,比欧几里得算法在大整数上更有优势,可以去了解一下。
扩展欧几里得算法求解贝祖等式
贝祖定理(一般形式)
对于不全为 0 的自然数 a,ba,ba,b,则必然存在整数 x,yx , yx,y (不唯一)满足等式ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)
上面的等式就称做贝祖等式。
扩展欧几里得算法能够求解贝祖等式的正确性证明
设 a>ba > ba>b
- 当 b=0b = 0b=0 时,gcd(a,b)=agcd(a,b) = agcd(a,b)=a
贝祖等式即 ax=aax = aax=a,解得 x=1,yx = 1,yx=1,y 可以取 y=0y = 0y=0 - 当 b>0b > 0b>0 时,
假设 a,ba,ba,b 的贝祖等式的解为x1,y1x_1,y_1x1,y1,即a⋅x1+b⋅y1=gcd(a,b)⋯⋯1a\cdot x_1+b\cdot y_1=gcd(a,b)\cdots\cdots1a⋅x1+b⋅y1=gcd(a,b)⋯⋯1
b,a%bb,a\%bb,a%b 的贝祖等式的解为x2,y2x_2,y_2x2,y2,即b⋅x2+a%b⋅y2=gcd(b,a%b)⋯⋯2b\cdot x_2+a\%b\cdot y_2=gcd(b,a\%b)\cdots\cdots2b⋅x2+a%b⋅y2=gcd(b,a%b)⋯⋯2
由欧几里得算法可知gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
故a⋅x1+b⋅y1=b⋅x2+a%b⋅y2a\cdot x_1+b\cdot y_1=b\cdot x_2+a\%b\cdot y_2a⋅x1+b⋅y1=b⋅x2+a%b⋅y2
即a⋅x1+b⋅y1=b⋅x2+(a−⌊a/b⌋⋅b)⋅y2=a⋅y2+b⋅(x2−⌊a/b⌋⋅y2)a\cdot x_1+b\cdot y_1=b\cdot x_2+(a-\lfloor a/b\rfloor\cdot b)\cdot y_2=a\cdot y_2+b\cdot(x_2-\lfloor a/b\rfloor \cdot y_2)a⋅x1+b⋅y1=b⋅x2+(a−⌊a/b⌋⋅b)⋅y2=a⋅y2+b⋅(x2−⌊a/b⌋⋅y2)
由恒等关系可得{x1=y2y1=x2−⌊a/b⌋⋅y2\begin{cases} x_1=y_2 \\y_1=x_2-\lfloor a/b\rfloor\cdot y_2 \end{cases}{x1=y2y1=x2−⌊a/b⌋⋅y2即贝祖等式 1 的解可以由 贝祖等式 2 的解得到,这是一个递归求解的过程,并且随着对 a,ba,ba,b 进行辗转相除,贝祖等式的系数会越来越小,直至变为情况1,而情况1贝祖等式的解是有具体的值的,即 x=1,y=0x = 1,y = 0x=1,y=0。然后进行回溯计算,最终可以得到x1,y1x_1,y_1x1,y1。
C++代码如下:
\\exGcd函数返回a,b最大公约数。贝祖等式的整数解为引用参数x,y
int exGcd(int a, int b, int& x, int& y){
if(b == 0){
x = 1;
y = 0;
return a;
}
int r = exGcd(b,a%b,x,y);
int t = x;
x = y;
y = t - a/b*y;
return r;
}
贝祖定理(更原始形式)的证明
若整数 a,ba,ba,b 互质,则存在整数解 x,yx,yx,y 满足 ax+by=1ax + by = 1ax+by=1
证明:
设X,YX,YX,Y分别是使得aX+bY>0aX+bY > 0aX+bY>0的整数集合,
令s=min{aX+bY}>0s = min\{aX + bY\} > 0s=min{aX+bY}>0,假设此时 X=x1,Y=y1X=x_1,Y=y_1X=x1,Y=y1
则有ax1+by1=sax_1+by_1=sax1+by1=s
假设 aaa 除以 sss 的商为 kkk,余数为 r(0≤r<s)r(0\le r < s)r(0≤r<s)
则有r=a−ks=a−k(ax1+by1)=a(1−kx1)+b(−ky1)r=a-ks=a-k(ax_1+by_1)=a(1-kx_1)+b(-ky_1)r=a−ks=a−k(ax1+by1)=a(1−kx1)+b(−ky1)
但是因为其中1−kx1,−ky1∈Z1-kx_1,-ky_1\in Z1−kx1,−ky1∈Z,所以必须有r=0r=0r=0
否则r<sr<sr<s与假设s=min{aX+bY}>0s = min\{aX + bY\} > 0s=min{aX+bY}>0矛盾
故s∣as|as∣a,同理可得s∣bs|bs∣b
即 sss 为 a,ba,ba,b 的公约数,又 a,ba,ba,b 互质
所以有s=1s = 1s=1
即存在整数x,yx,yx,y使得a⋅x+b⋅y=1a\cdot x+b\cdot y=1a⋅x+b⋅y=1成立。