扩展欧几里得算法

来源:互联网 发布:想开淘宝店,卖什么好 编辑:程序博客网 时间:2024/05/17 07:19

二.扩展欧几里得算法:

1.扩展的欧几里得算法描述:

  输入:两个非负整数a,b,且a>=b;

  输出:d=gcd(a,b)与满足ax+by=d的整数x与y.

 

  1).若b==0,则d=a,x=1,y=0,返回(d,x,y);

  2).设x2=1,x1=0,y2=0,y1=1;

  3).当b>0时,做如下操作:

3.1)mod=a%b;

3.2)r=a-mod*b,a=b,b=r;

3.3)x=x2-mod*x1,x2=x1,x1=x;

3.4)y=y2-mod*y1,y2=y1,y1=y;

  4).令d=a,x=x2,y=y2,并返回(d,x,y)。

2.代码如下

 

#include<stdio.h>
void input(int &a,int &b)
{
 int data1,data2;
 scanf("%d,%d",&a,&b);
}

void  Extend_Euclid_gcd (int max,int min,int &d,int &x,int &y)
{
 int r,temp;
 int x1,x2;
 int y1,y2;
 int mod;
 if(max<min)
 {
  temp=max;
  max=min;
  min=temp;
 }
 if(min==0)
 {
  d=max;
  x=1;
  y=0;
  return;
 }
 x2=1,x1=0;
 y2=0,y1=1;
 while(min>0)
 {
  mod=max/min;

  r=max-mod*min;max=min;min=r;

  x=x2-mod*x1;x2=x1;x1=x;

  y=y2-mod*y1;y2=y1;y1=y;
 }
 d=max,x=x2;y=y2;
}
void main()//输出的结果目标:d=gcd(a,b)与满足ax+by=d的整数x与y
{
 int a,b,d,x,y;
 printf("请输入两个非负整数数:");
 input(a,b);
 Extend_Euclid_gcd (a,b,d,x,y);
 printf("输出结果:%d=gcd(%d,%d),%d*(%d)+%d*(%d)=%d/n",d,a,b,a,x,b,y,d);
}
/*测试结果:
请输入两个非负整数数:4864,3458
输出结果:38=gcd(4864,3458),4864*(32)+3458*(-45)=38
*/

 

原创粉丝点击