Euclid算法(欧几里得算法)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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),接着就能正常运⾏了。