您的位置:首页 > 其它

欧几里得算法及其扩展

2018-03-16 23:01 225 查看

欧几里得算法:

     欧几里得算法又称辗转相除法,是指计算两个正整数a,b的最大公约数。

  计算公式: gcd(a,b)=gcd(b,a%b);

欧几里得算法扩展:

     扩展欧几里得算法是欧几里得算法的推广,利用欧几里得算法的思想和递归求得贝祖等式a*x+b*y=gcd(a,b)不定方程中的一组x和y的解。
  原理:

当b=0时,很显然a*x=gcd(a,b)=a,所以x=1,而y为任意数,为了同一和方便我们令y=0;
当a>b>0时,设有两组等式a*x1+b*y1=gcd(a,b),b*x2+(a%b)*y2=gcd(b,a%b)。根据欧几里得算法的递归思想,a和b的gcd为t,而a=q*b+r,r=a-q*b为a,b的线性组合,又因为a%t=0,b%t=0,所以线性组合r%t=0,又有r=a%b,所以gcd(a,b)=gcd(b,a%b)。
 


   详细推理如下:

   A*x+B*y=gcd(A,B)=gcd(B,A%B);
   A=A/B*B+A%B;   //A的变形

   (A/B*B+A%B)*x+B*y;
   B*(A/B*x+y)+(A%B)*x=gcd(B,A%B);
   B*新x+(A%B)*新y=gcd(B,A%B);
   X=新y;
   A/B*x+y=新x;

   所以 y=新x-A/B*新y

   例题如下:
  从昏迷中醒来,小明发现自己被关在X星球的废矿车里。
 矿车停在平直的废弃的轨道上。
 他的面前是两个按钮,分别写着“F”和“B”。
 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。
 按F,会前进97米。按B会后退127米。
 透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。
 他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。
 或许,通过多次操作F和B可以办到。
 矿车上的动力已经不太足,黄色的警示灯在默默闪烁...
 每次进行 F 或 B 操作都会消耗一定的能量。
 小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。
 请填写为了达成目标,最少需要操作的次数。
   也就是求97x+127y=1 ,正好用到扩展欧几里得算法#include<stdio.h>
int e_gcd(int x,int y,int *xy)
{
if (y==0)
{
return x;
}

int ans = e_gcd(y, x%y, xy); //返回最大公约数
int t = xy[0];
xy[0] = xy[1];
xy[1] = t - x / y*xy[0];
return ans;
}

int main()
{
int xy[2] = {1};
int a = e_gcd(97,127,xy);
printf("%d\n",a);
printf("%d %d",xy[0],xy[1]);
return 0;
}随便求了一下两数的最大公约数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: