扩展欧几里得

来源:互联网 发布:linux 进程cpu使用率 编辑:程序博客网 时间:2024/06/08 00:17

【1】欧几里得算法

任务:

  • 求a和b的最大公约数( gcd )

算法:

  • gcd( a,b )=gcd( b,a%b ),不断迭代,直到b=0,a就是最大公约数

原理:

  • a=by+p
  • a为最小公约数的倍数,b为最小公约数的倍数,故p也为最小公约数的倍数

代码模板:

int gcd(int a,int b)     {           if(a%b!=0) return gcd(b,a%b);        else return b;    }

【2】扩展欧几里得

任务:

  • 求出a,b的最大公约数,且求出x,y满足ax+by=gcd( a,b )

算法:

( a>b)
1. 当b=0时,gcd( a,b )=a。此时x=1,y=0
2. b!=0时

  • a·x1+b·y1=gcd( a,b )

  • b·x2+(a%b)·y2=gcd( b,a%b )

  • a·x1+b·y1= b·x2+(a%b)·y2

  • ax1+by1=bx2+(a-(a/b)*b)y2=bx2+ay2-(a/b)*by2 ;

  • ax1+by1=ay2+b(x2-(a/b))y2 ;

  • ∴ x1=y2;y1=(x2-(a/b))·y2

这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
上面的思想是递归定义了,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。

代码模板:

void extend_Eulid(int a,int b){    if(b == 0){        x = 1;        y = 0;        q = a;               //公约数为q    }    else{        extend_Eulid(b,a%b);   //递归        int t = x;        x = y;                 //求出x        y = t - a/b*y;         //求出y      } }

…..END

原创粉丝点击