欧几里得算法,扩展欧几里德算法与裴属定理 (gcd,exgcd)
欧几里得算法,扩展欧几里德算法与裴属定理 (gcd,exgcd)
欧几里得算法
我们有$$gcd(a,b)=gcd(b,a \bmod b)$$
同时,我们有$$gcd(a,0)=a$$
所以,我们可以通过欧几里得算法求两个数的最大公约数.
ll gcd(ll a,ll b) {
if(!b) return a;
return gcd(b,a%b);
}
扩展欧几里得算法 (exgcd)
我们先对$$ax+by=gcd(a,b)$$求解
考虑归纳
-
当\(b=0\)时, 显然,此时方程的解为\(x_1=1,x_2=0\)
-
当\(b\neq0\)时
我们考虑求解$$ax+by=gcd(a,b)$$ $$=gcd(b,a \bmod b)$$$$=bx_o+(a \bmod b)y_0$$ $$=bx_0+(a-\lfloor \frac{a}{b} \rfloor b)y_0$$ $$=bx_0+ay_0-\lfloor \frac{a}{b} \rfloor b y_0$$ $$=b(x_0-\lfloor \frac{a}{b} \rfloor y_0)+ay_0$$
综上,$$x=y_0,y=(x_0-\lfloor \frac{a}{b} \rfloor y_0)$$
ll exgcd(ll a,ll b,ll &x,ll &y) {
if(!b) {
x=1,y=0;
return a;
}
ll tmp=exgcd(b,a%b,x,y);
ll tmpy=x-ll(a/b)*y,tmpx=y;
x=tmpx,y=tmpy;
return tmp;
}
裴属定理
我们要求解不定方程$$ax+by=c$$
根据裴属定理,当且仅当$$gcd(a,b)|c$$时,方程有解
即$$方程有解 \Leftrightarrow gcd(a,b)|c$$
求不定方程的解.
我们要求$$ax+by=c$$的解.
显然,你得先拿裴属定理判断一下是否有解.
诺有解,我们可以先求出$$ax+by=gcd(a,b)$$的解.\(x_0,y_0\).
然后显然,我们需要通过乘倍数将\(gcd(a,b)\)与\(c\)的差补上. 设$$k=\frac{c}{gcd(a,b)}$$, 那么我们得到了这个方程的一个特解$$x'=kx_0,y'=ky_0$$
然后显然不定方程的整数解是不止一个的.
然后我们考虑通过这个特解求出其他解.
由于我们现在已经有$$ax'+by'=c$$
那么如果我们要让\(x,y\)变化后这个式子任然等于\(c\),那么我们必须让\(ax,by\)的变换量相互抵消.,即
即
那么显然,两边的都是\(lcm(a,b)\)的倍数.
那么显然,\(\Delta x\)是\(\frac{lcm(a,b)}{a}\)的倍数,,\(\Delta y\)是\(\frac{lcm(a,b)}{b}\)的倍数
推式子:
\(\Delta y\)同理:
然后对于一对通过特解计算而来的解,\(t\)是相同的.这显然

浙公网安备 33010602011771号