欧几里得算法及其扩展
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;
}随便求了一下两数的最大公约数。
相关文章推荐
- 欧几里得算法及其扩展
- 欧几里得算法及其扩展以及运用
- 扩展欧几里得算法及其应用
- 扩展欧几里得算法及其应用——学习(复习)笔记
- 欧几里得算法及其扩展
- 欧几里得算法及其扩展形式
- 扩展欧几里得算法及其应用
- 关于欧几里得算法及其扩展
- ACM 进阶学习第一课----同余相关之欧几里得算法及其扩展(2)
- hdu4021——N数码问题及其扩展
- 扩展欧几里得算法
- 扩展欧几里得算法
- 欧几里得算法及其应用
- 扩展欧几里得算法
- 从倒水问题到欧几里得算法扩展
- 张宴:Tokyo Cabinet数据库及其扩展应用
- 在 OSX 10.9.4 上编译安装 FastDFS 及其 PHP 扩展
- Spring中Bean的生命周期及其扩展点
- 扩展欧几里得算法
- 深入理解JS原型及其扩展