欧几里德最大公约数算法正确性的一次简单分析
2012-06-17 13:32
253 查看
依旧先摆出算法代码:
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
欧几里德求最大公约数的原理为:
计A,B两数最大公约数为Gcd(A,B),则Gcd(A,B)=Gcd(B,AModB)=Gcd(AModeB,BMod(AModB))…公式(1)
intget_common_divisor(inta,intb)
{
intx=a;
inty=b;
intm=0;
while(y>0)
{
m=x%y;
x=y;
y=m;
}
returnx;
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
欧几里德求最大公约数的原理为:
计A,B两数最大公约数为Gcd(A,B),则Gcd(A,B)=Gcd(B,AModB)=Gcd(AModeB,BMod(AModB))…公式(1)
即两数的最大公约等于第二数和两数余数的最大公约,其值为公式(1)循环最后余数为0之前的那次余数值。
现在给出命题:
求证欧几里德求最大公约数的正确性。
证明:
只讨论A>B的情形,因为B>A时将在第一次模运算之后(line9)将二者位置翻转,仍然变成符合x>y的情形。
一种很明显的情形是A是B的倍数,则B显然是最大公约数,这符合Gcd(A,B)=Gcd(B,0)=B,这里利用了一个定理:任何数都是0的公约数。
现把A与B的求余运算改成形式A=Bk+m,显然此处默认B>m求k>=1.记为公式(2)
不妨取A,B最大公约数存在且为G.则A,B分别可以写成含最大公约数的因式A=G*T1,B=G*T2;记为公式(3)
公式(3)代入公式(2),A=Bk+m推导出G*T1=G*T2*k+m,m=G*(T1-T2*k);显然我们得出一个结论:余数m必然包含最大公约数G,
而每一次循环求余都将导致下一次的余数在不断减小,这是一个必然的事实,而另一个事实是余数若不呗整除则必然是正整数并渐小,而正整数的余数渐小若一直没有被整除则必然趋于1,而1能被任何数整除也是任何数的公约数,如果该减小的余数在某一步被整除了,则这个余数恰是自己和被除数的最大公约数,也即A,B的最大公约数。
不妨另循环求余中所有的余数取值为{m1,m2,…,mk,0},很显然由上述推理mk就是我们所要求的最大公约数。
相关文章推荐
- 算法分析与设计实验——最大公约数
- 最大公约数的欧几里德[辗转相除]算法及其扩展
- [算法设计与分析]4.1.1递推法(兔子繁殖+最大公约数3种方法)
- 最大公约数的简单算法
- [算法设计与分析]3.4.2最大公约数的应用(循环移动数组元素)
- 菜鸟学算法--简单的交换和最大公约数算法入门篇
- 入门级算法——最大公约数 最小公倍数 快速幂 简单并查集 排列组合
- 算法分析---求最大公约数 gcd(int x,int y) (greatest common divisor )
- Euclide(欧几里德)算法求最大公约数
- 最大后验概率估计算法(简单,通俗易懂)
- 【算法题】题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 求总共有多少总跳法,并分析算法的时间复杂度
- 简单的高效算法分析初步?
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 【算法分析】最大概率选择到“最好女孩”的算法
- 一个简单算法的设计(一个数组中连续区间和的最大值)
- 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 求总共有多少总跳法,并分析算法的时间复杂度
- 【慢慢学算法】:求最大公约数
- 九度 Online Judge 算法 刷题 题目1056:最大公约数
- 最大公约数算法(转)
- [算法]求最大公约数