跳到主要内容

2023/04/裴蜀定理、扩展欧几里得及其证明

· 阅读需 2 分钟
小鱼干
干饭人

定理​

裴蜀定理(贝祖定理)是一个关于最大公约数的定理。

裴蜀定理说明了对任何整数a,b和它们的最大公约数d,关于未知数x和y的线性不定方程:若a,b是整数,且gcd(a,b)=dgcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别的,一定存在整数x,y使ax+by=d成立。

重要推论​

a、b互质的充分必要条件是存在整数x,y使ax+by=1ax+by=1。

证明​

设d=gcd(a,b)d=gcd(a,b),则d∣a,d∣bd\mid a,d\mid b。由整除性质可得,∀x,y∈N\forall x,y\in \mathbb{N},有d∣(ax+by)d\mid(ax+by)。

设ss为ax+byax+by的最小正值⋯⋯(1)\cdots\cdots(1)。

令 a ÷ s=q⋯ra\ \div\ s=q\cdots r,则q=⌊as⌋q=\lfloor \frac{a}{s}\rfloor。

r=a−q⋅s=a−q⋅(ax+by)=a−a⋅qx−b⋅qyr=a-q\cdot s=a-q\cdot(ax+by)=a-a\cdot qx-b\cdot qy。

r=a(1−qx)+b(−qy)r=a(1-qx)+b(-qy),故r也为a,b的线性组合。⋯⋯(2)\cdots\cdots(2)

∵r=a mod s\because r=a\ mod\ s,故0≤r<s0\leq r < s。⋯⋯(3)\cdots\cdots(3)

∴(1)(2)(3)⇒r=0\therefore (1)(2)(3) \Rightarrow r=0

∴a÷s=q\therefore a\div s=q

∴s∣a\therefore s\mid a

同理可证s∣bs|b

∵{s∣as∣bd=gcd(a,b)\because \left\{\begin{aligned} s|a\\ s|b\\ d=gcd(a,b) \end{aligned}\right.

∴d≥s\therefore d\ge s

∵d∣a,d∣b\because d\mid a,d\mid b,且s是a与b的一个线性组合

∴d∣s\therefore d\mid s

∵d∣s,s>0\because d\mid s,s > 0

∴d≤s\therefore d\leq s

∵d≥s,d≤s\because d\ge s,d\leq s

∴d=s\therefore d=s

∴ax+by=d\therefore ax+by=d

证毕。

求不定方程的解​

设d=gcd(a,b)d=gcd(a,b)

根据裴蜀定理可得到等式(贝祖等式):ax+by=dax+by=d

令a÷b=⌊ab⌋⋯ra\div b=\lfloor\frac{a}{b}\rfloor\cdots r ,故r=a−⌊ab⌋⋅br=a-\lfloor\frac{a}{b}\rfloor\cdot b

根据欧几里得算法,gcd(a,b)=gcd(b,a%b)=gcd(b,r)=dgcd(a,b)=gcd(b,a\%b)=gcd(b,r)=d

当b=0b=0,可得到一组特殊解:x=1,y=0x=1,y=0

当b≠0b\neq 0,根据裴蜀定理:

bx′+ry′=dbx'+ry'=d

=bx′+(a−⌊ab⌋⋅b)y′=d=bx'+(a-\lfloor\frac{a}{b}\rfloor\cdot b)y'=d

=bx′+ay′−b⋅⌊ab⌋y′=d=bx'+ay'-b\cdot\lfloor\frac{a}{b}\rfloor y'=d

=ay′+b(x′−⌊ab⌋y′)=d=ay'+b(x'-\lfloor\frac{a}{b}\rfloor y')=d

∵\because

{ay′+b(x′−⌊ab⌋y′)=dax+by=d\left\{\begin{aligned} ay'+b(x'-\lfloor\frac{a}{b}\rfloor y')=d\\ ax+by=d \end{aligned}\right.

∴\therefore

{x=y′y=x′−⌊ab⌋y′\left\{\begin{aligned} x&=y' \\ y&=x'-\lfloor\frac{a}{b}\rfloor y' \end{aligned}\right.

即可发现x,y更新规律。

扩展欧几里得算法代码实现​

int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int z=x;x=y;y=z-y*(a/b);
return d;
}