代码改变世界

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

2022-03-19 11:56  没有波澜的天空  阅读(125)  评论(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

与条件矛盾

得证