【算法•日更•第五十六期】扩展欧几里得算法
▎裴蜀定理
这个定理很简洁,就是关于x,y(都是整数)的不定方程在下面的情况下:
必定有解。
这只是个前置知识,就不证明了(主要是小编太菜)。
▎不定方程
考虑方程ax+by=c的解的情况:
- 若c=gcd(a,b),那么依照裴蜀定理有解;
- 若c=k*gcd(a,b),先两边同除k,就会转化成标准形式,有解;
- 若c与gcd(a,b)互质,那么无解;
所以问题就是:
如何解决,只要解决了这个问题,所有解的情况就解决了。
▎问题解决
现在我们考虑怎么让这个问题更简单,思考这样一个问题,已知:
的解(x,y),那么怎么推出:
的解(x‘,y’)呢?
先抛出结论:
下面是证明过程:
知道了这个东西之后,我们就可以在算完
的时候很快推出:
这样可以层层递归下去,直到y=0,那么x=1,y=0的情况下就是a+0=gcd(a,0),此条件成立,那么再回溯回去就可以了。
▎代码实现
感觉像极了辗转相除法。
1 pair<int,int> exgcd(int a,int b) 2 { 3 if(b==0) return pair(1,0); 4 pair<int,int> sum=exgcd(b,a%b); 5 return pair<int,int>(y,x-a/b*y); 6 }