Euclid算法(欧几里得算法)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Euclid算法(欧⼏⾥得算法)
线性组合与GCD
现在我们证明⼀个重要的定理:gcd(a,b)是a和b的最⼩的正线性组合。

证明:
设gcd(a,b)为d,a和b的最⼩的正线性组合为s
∵d|a且d|b,
∴d|s。

⽽a mod s=a-[a/s]s
=a-[a/s](ax+by)
=a(1-[a/s]x)-b[a/s]y
亦为a和b的线性组合
∵a mod s<s,a mod s不能是a和b的最⼩的正线性组合
∴a mod s=0,即s|a
同理由s|b
∴s为a,b的公约数
∴s<=d
∵d|s
∴d=s。

证毕。

由这条定理易推知:若d|a且d|b,则d|gcd(a,b)
Euclid算法
现在的问题是如何快速的求gcd(a,b)。

穷举明显不是⼀个好⽅法(O(n)),所以需要⼀个更好的⽅法。

⾸先我们先提出⼀个定理:gcd(a,b)=gcd(b,a-bx)(x为正整数)。

证明:
设gcd(a,b)=d,gcd(b,a-bx)=e,则
∵d|a,d|b
∴d|a-bx
∴d|gcd(b,a-bx),即d|e
∵e|b,e|a-bx
∴e|bx+(a-bx),即e|a
∴e|gcd(a,b),即e|d
∴d=e。

证毕。

这个定理⾮常有⽤,因为它能快速地降低数据规模。

当x=1时,gcd(a,b)=gcd(b,a-b)。

这就是辗转相减法。

当x达到最⼤时,即x=[a/b]时,gcd(a,b)=gcd(b,a mod b)。

这个就是Euclid算法。

它是不是Euclid提出的我不知道,但听说是在Euclid时代形成的,所以就叫Euclid算法了。

程序⾮常的简单:
function Euclid(a,b:longint):longint;
begin
if b=0 then exit(a)
else exit(Euclid(b,a mod b));
end;
Euclid算法⽐辗转相减法好,不仅好在速度快,⽽且⽤起来也⽅便。

两种算法都有⼀个隐含的限制:a>=b。

⽤辗转相减法时,必须先判断⼤⼩,⽽Euclid算法不然。

若a<b,则⼀次递归就会转为gcd(b,a),接着就能正常运⾏了。

相关文档
最新文档