代码改变世界

辗转相除法求两数最大公约数的正确性证明

  没有波澜的天空  阅读(135)  评论(0编辑  收藏  举报

等同于证明两个问题(下面的变量都是整数)

1、求解的结果是两数的公约数

2、求解的结果是公约数里最大的

先来证明1,相当于证明:

如果a/b=c余d(条件1)且b/d=m(条件2)

那么a/d=n(也就是a=d*n)

 

把条件1转化一下为a=c*b+d

把条件2转化一下为b=d*m

把条件2带入条件1为a=c*d*m+d 进一步转化为a=d*(c*m+1)

c*m+1肯定也是一个整数,相当于a=d*n

得证

 

然后来证明2,可以用反证法

如果a/b=c余d(条件1)且b/d=m(条件2),那么在(d,b)开区间内不可能存在这样一个数x

使得a/x=t且b/x=s

加入存在这样一个数

那么有a=t*x(条件3)且b=s*x(条件4)

把条件1转化一下为a=c*b+d

把条件2转化一下为b=d*m

我们需要证明在条件3和条件4的情况下,条件1和条件2是矛盾的

将条件3和条件4代入条件1

t*x=c*s*x+d  -> s=(t*x-d)/c*x

将条件3和条件4代入条件2

s*x=d*m  ->s=d*m/x

得到(t*x-d)/c*x=d*m/x  ->(t*x-d)/c=d*m  ->(t*x-d)=d*m*c ->tx=d(m*c+1)

由于x>d必然有t>m*c+1

而m=b/d

c=(a-d)/b

得到t>(a-d)/d+1  ->t>a/d  

因为t=a/x

那么a/x>a/d

x<d

与条件矛盾

得证

 

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示