欧几里得算法又名辗转相除法
形式
gcd(a,b) = gcd(b,a mod b)
证明
1.设
a=kb+r,r=amodb=a−kb
2.设
d
为
记作
d|a、d|b
3.
r=a−kb
由2得,
rd
是一个整数,所以
d|r
因此
d
也是
所以
(a,b)
的所有可能的公约数
d
都是
所以
gcd(a,b)=gcd(b,r)
扩展
裴蜀定理
对于整数k,关于x,y的不定方程 ax+by=k∗gcd(a,b) 有无数组解。
反过来,若 ax+by=c 这个不定方程中,c不被gcd(a,b)整除,那么这个不定方程无解。
换而言之,对于整数a,b,所有的整数对(x,y),总有ax+by|gcd(a,b)
规则
1,显然当 b=0,
gcd(a,b)=a
。此时 x=1,y=0;
2,当a>b>0时,由朴素欧几里得算法得知,
gcd(a,b)=gcd(b,amodb)
;
即
ax1+by1=gcd(a,b)=gcd(b,amodb)=bx2+(amodb)y2
(
(x1,y1)
(x2,y2)
是这两个方程所对应的解
即
ax1+by1=bx2+(a−a/b∗b)y2
(这里的除法是整除)
将等式右边化简
bx2+(a−a/b∗b)y2
=bx2+ay2−a/b∗b∗y2
=ay2+b(x2−a/b∗y2)
又等于原式
=ax1+by1
根据恒等定理(恒等的两多项式满足最高次数相同,且对应次数项的系数相同.)得
x1=y2
y1=(x2−a/b∗y2)
CODE
var tmp,x,y:longint
function exgcd(a,b):longint;
begin
if b=0
begin
x=1; y=0;
exit(a);
end
else
begin
t=exgcd(b,a mod b);
tmp=x;
//因为x2会被覆盖掉所以存了一下
x=y;
y=tmp-a div b*y;
exit(t);
end;
end;
扩展的应用
应用1.解 ax+by=t 形式的不定方程。
1.用扩展gcd求出
ax′+by′=gcd(a,b)
的一组解
x0,y0
2.检查充要条件
t
3.回代解,因为我们解出来实际上是
ax′+by′=gcd(a,b)
的一组特解
x′,y′
,都乘上t/gcd(a,b).
4.调整为所需解(重要)
这样123做下来我们获得了
ax+by=t
的一组特解。
但我们可能要求的是最小整数解等,所以需要通解。
我们假设通解
x=x0+p,y=y0−q
那么
(ax0+ap)+(by0−bq)=c
设
k=ap=bq
显然必须满足
a|k,b|k
。
要表示出通解则k要能尽量小所以k的“最小单位”是
lcm(a,b)
所以
k=t∗lcm(a,b),t为任意整数
(ax0+t∗lcm(a,b)+by0−t∗lcm(a,b))=c
那么再提走a,b,得到
a(x0+t∗lcm(a,b)a)+b(..)=c
这样就得出满足的通解
x=x0+t∗lcm(a,b)a,y=y0−t∗lcm(a,b)b
t∗lcm(a,b)a=t∗bgcd(a,b) ,在lcm(a,b)较大的情况下适用。
Tricks
1.若存在ax+by=c,c必然有因数(a,b),(a,y),(x,b),(x,y)。将原方程看作以选定两个数为系数的不定方程可得。
反过来,当c没有因数(a,y)时,必定不存在x,b满足ax+by=c
这个结论在一些数论题中用于容斥。
2.特解x0,
设
k=t∗b/gcd(a,b)
那么最小整数解
x1=(x0modk+k)modk
若x0>=0显然,若x0<0则在c++中x0modk等价于x0不断加k直到下一次加k就大于等于0.