什么是扩展gcd
- ax+by=gcd(a,b),a,b不全为0,且x,y都为整数解,求解
来了解一下什么是贝祖定理
因为gcd(a,b)=d,那么对于任意的ax+by都等于d的倍数,则一定有解使得ax+by=d
所以可以得出若ax+by=d,则d%gcd(a,b)=0
推导过程
举个栗子理解一下关于整数解的问题
比如36和24得最大公约数为12
那么gcd(36,24)=12,则它的整数解有1*36+(-1)*24=12,
则当x=1,y=-1时,有ax+by=gcd(a,b),
当然整数解不止这一对
再举个例子理解一下推导过程与代码步骤意思
比如36和24
36 * x+24 * y=gcd;
36 / 24=1……12;此时,x=1,y=-1;
24 * x+12 * y=gcd;
24 / 12=2……0;此时,x=1,y=-1;
12 * x+0 * y=gcd;此时,x=1,y=0;
然后可以根据x=1,y=0,向上推,利用x1=y2与y1=x2-a/b*y
板子
ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
ll d = exgcd(b, a % b, x, y);
ll t = x;
x = y;
y = t - (a / b) * y;
return d;
}
注释:return a与return d是两个数的最大公约数
若要求最小正整数
if(x <= 0)
x = x % b1 + b1;
else
x = x % b1;
ps:任意整数和0的公约数是该整数的所有约数
它们的最大公约数为该整数本身
因为0被所有非0整数整除,所以任意非零的整数都是0的约数