欧几里得算法和扩展欧几里得算法
欧几里得算法和扩展欧几里得算法
欧几里得算法
说白了就是辗转相除算法
我们在求a和b的gcd的时候
首先我们会发现
那么我们不停地迭代就发现
然后我们就可以不停地迭代下去
当小的数等于0的时候答案就是大的那个数
最后写出来就是
int gcd(int a,int b){
if(!b)return a;
return gcd(b,a%b);
}
扩展欧几里得
然后我们需要求的从变成了
也就是不定方程求解
然后考虑一个不定方程
有解的充要条件就是
即,我们想求出满足的解
然后惊讶的发现
然后我们用和代替和
发现
又因为(这里是整除)
所以
整理一下
又惊讶地发现:
然后就可以利用exgcd的过程进行求解了
void exgcd(int a,int b,int &x,int &y){
if(!b)x=1,y=0;
else{
exgcd(b,a%b,y,x);
y-=(a/b)*x;
}
}
但是问题又来了
我们怎么求出最小的正整数解呢
首先我们还原一下式子,把同时乘上
又因为通解可以表示成:
所以x的最小正整数解就是