扩展欧几里得小感

扩展欧几里得

今天弄了个扩欧。还好吧(也许并未深入理解。。。)

 

前置知识:裴蜀定理。

ax+by=gcd(a,b)  必定存在x,y的整数解。(证明也没必要,能感性理解的吧)

应用:已知a, b,求解一组x,y,使它们满足等式: ax+by =gcd(a, b)

下面:

设 a>b,那么当 b=0 时, gcd(a,b)=a, ax=a,则 x=1,y=0 

设 ax1+by1=gcd(a,b) , bx2+(a%b)y2=gcd(a,b)   因为 gcd(a,b)==gcd(b,a%b)  , 所以  ax1+by1=bx2+(a-a/b*b)y2  -->  ax1+by1=bx2+ay2-a/b*b*y2 

根据多项式恒等定理(两边的a,b一样):

x1=y2 , y1=x2-a/b*y2  (这两句话很重要,求解的核心!!!)

这样我们可以通过不断递归,直到 b=1, 求出解后返回来。

奇妙啊!

 

上代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a,b,x,y;
 4 inline int exgcd(int a,int b,int &x,int &y)
 5 {
 6     if (b==0)
 7     {
 8         x=1,y=0;
 9         return a;
10     }
11     int gcd=exgcd(b,a%b,x,y);
12     int x1=x,y1=y;
13     x=y1;
14     y=x1-a/b*y1;
15     return gcd;
16 }
17 int main()
18 {
19     scanf("%d%d",&a,&b);
20     cout<<exgcd(a,b,x,y)<<endl;
21     return 0;
22 }
View Code

 

 

 

加油加油加油!!!fighting fighting fighting!!!

 

posted on 2018-08-07 16:01  Frank-King  阅读(151)  评论(0编辑  收藏  举报