①:b == 0 立即推 => x = 1 , y = 0 ;
②:a && b 设a * x1 + b * y1 = gcd ( a , b ) ; 设b * x2 + ( a % b ) * y2 = gcd ( b , a % b ) ;
已知:gcd ( a , b ) == gcd ( b , a % b ) (欧几里得)
立即推 => a * 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 ) ;
可得: x1 = y2 ; y1 = x2 – ( a / b ) * y2 ;
应用:ax ≡ b ( mod m )
ax mod m=b mod m;
ax = k1m+n;
b = k2m+n;
ax-b=my;
ax+my=b;
ax+by=c;
拓展欧几里德:
void exgcd(ll a,ll b,ll &gcd,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
gcd=a;
}
else
{
exgcd(b,a%b,gcd,y,x);
y-=x*(a/b);
}
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll r = exgcd(b,a%b,y,x);
y-=x*(a/b);
return r;
}
求逆元:
求法一:
费马小定理: 假如m是质数 , 且 gcd( a , m ) = 1 ;
那么 a ^ ( m – 1 ) ≡ 1 ( mod m ) 。
( 逆元 :a * x ≡ 1 ( mod m ) )
由此可以得到,逆元为 a ^ ( m – 2 ) 。
求法二: 扩展欧几里得( a , m 互质 ,且m不是质数时也可使用)
解同余方程 ax + my = 1
求得唯一解x 即为逆元。
if(c%gcd!=0)
{
return false;
}
else
{
x=x*c/gcd;
int t=b/gcd;
if(x>=0)
x=x%t;
else
x=x%t+t;
}
为什么要求逆元:
(A/B)%C!=(A%C)/(B%C);
(A/B)%C=A乘以B的逆元模上C;