学习笔记——拓展欧几里得
拓展欧几里得(exgcd)
在已知整数\(a,b\)情况下求\(ax+by=gcd(a,b)\)的一组整数解\(x,y\)
证明\(ax+by=gcd(a,b)\):(如何求x,y)
设\(ax_1+by_1=gcd(a,b)\),则\(bx_2+(a \bmod b)y_2=gcd(b,a \bmod b)\)
因为\(gcd(a,b)=gcd(b,a \bmod b)\)
所以\(ax_1+by_1=bx_2+(a \bmod b)y_2\)
\(ax_1 + by_1 = bx_2 + (a - (a/b)\times b)y_2\)
\(ax_1 + by_1 = bx_2 + ay_2 - ((a/b) \times b)y_2\)
\(ax_1 + by_1 = ay_2 + b(x_2-(a/b) \times y_2)\)
所以\(x_1=y_2,y_1=(a/b) \times y_2\)
以此类推,\(x_i,y_i\)的值可以由\(x_{i+1},y_{i+1}\)得来,且每层都在做类似于辗转相除法的操作,于是我们可以在求\(gcd\)的时候,顺便计算\(x,y\)的值,当\(ax+by=a\)时,\(x=1,y=0\)
\(code:\)
void exgcd(int a,int b,int &x,int &y){
if(b==0){x=1,y=0;return a;}
int x2,y2;
int Gcd=exgcd(b,a%b,x2,y2);
x1=y2,y1=x2-a/b*y2;
}
扩欧应用 不定方程
对于不定方程\(ax+by=c\),讨论整数解
对于\(ax+by=gcd(a,b)\),一定有解
设\(d=gcd(a,b)\),若\(a \bmod d = 0,b \bmod d = 0\),则\(gcd(a,b)\bmod d = 0\),即\((ax+by) \bmod d = 0\)
所以如果\(ax+by=c\)有解,则\(c \bmod d = 0\),否则无解
当\(c \bmod d = 0\)时,可以通过\(exgcd\)求出\(ax+by=gcd(a,b)\)的一组解\(x',y'\),则方程原来的一组解为\(x=x' \times c / d,y = y' \times c / d\)
而原方程的解有无穷多组,因为依然满足下列式子:
\(a(x + kb)+b(y-ka)=c\),\(k\)为整数
于是通解为\(x = x' \times c/d + k \times b / d,y = y' \times c /d - k \times a /d\)
扩欧应用 解模线性方程
求关于\(x\)的同余方程\(ax \equiv 1 \pmod b\)的最小正整数解
\(ax \equiv 1 \pmod b => ax \bmod b = 1 => ax - by = 1\) \(y\)为整数
根据前面定理,\(ax-by=gcd(a,b)\),又因为\(1\)必须能整除\(1/gcd(a,b)\),所以\(gcd(a,b)\)一定等于\(1\)
用\(exgcd\)处理即可
那么如何求解:\(ax \equiv b \pmod n\)
\(a \equiv b \pmod n\)含义是\(a\)和\(b\)在\(\bmod n\)意义下同余,即\(a \bmod n = b \bmod n\)
\(a \equiv b \pmod n\)充要条件为\(a-b\)是\(n\)的整数倍,即\(a-b = kn\),\(k\)为正整数
这样,\(ax \equiv b \pmod n => ax-b=ky => ax-ky=b\)
这是一个二元一次不定方程,用\(exgcd\)即可解决。
扩欧应用 乘法逆元
求乘法逆元,可以用费马小来解决,但是模数只能是质数的局限让他在有些题无法使用,我们可以用\(exgcd\)来求乘法逆元
\(ax \equiv 1 \pmod n\)的解\(x\)称为\(a\)在模\(n\)意义下的乘法逆元
通过之前的讨论,我们知道不定方程\(ax-ny=1\)要有解,\(a\)才存在逆元
所以\(1\)必须是\(gcd(a,n)\)的倍数,因为\(a,n\)要互质,即\(gcd(a,n)=1\)
在\(gcd(a,n)=1\)的前提下,\(ax \equiv 1 \pmod n\)只有唯一解。
\(code:\)
int inv(int a,int n){
int x,y;
if(exgcd(a,n,x,y)==1) return (x%n+n)%n;
return -1;
}