欧几里德算法

来源:互联网 发布:linux 安装 ftp命令 编辑:程序博客网 时间:2024/05/22 15:13

欧几里德算法
 1 欧几里德算法原始描述
   命题:给定两个正整数,求它们的最大共因子。
   设A和C是两个给定正整数;求它们的最大共因子。如果C整除A,则C就是C和A的一个共因子,因为它也整除本身。而且事实上,显然它是最大的,因为再没有比C大的数能整除C了。
   但如果C不整除A,则不断地从A,C两数中之大者减去小者,直到得出整除前一数的某个数。这种情况最终一定要发生,因为如果得到的是1,则它就整除前一个数。
   现在设E是A除以C的正余数;设F是C除以E的正余数,而且设F是E的一个因子。由于F整除E和E也整除C-F,故F也整除C-F;但它也整除本省,所以它整除C。而且C整除A-E;因此F也整除A-E,但它也整除E;因此它就整除A。于是它是A和C的一个共因子。
   现在论证它也是最大的。如果F不是A和C的最大共因子,则将有某个更大的整数整除他们。设这样一个数是G。
   现在由于G整除C而C整除A-E,故G整除A-E,但也整除A,所以它也整除余数E,但E整除C-F;因此G也整除C-F,但G也整除C,所以它整除余数F;即,一个较大的数整除一个较小的数,这是不可能的。
   因此,没有大于F的数能整除A和C,所以F是它们的最大共因子。

2 欧几里德原始算法的“意译”
    在欧几里德的讨论中,他首先提出重复地从两个现有数的大者减去小者,直到我们得到这样两个数:其中一个是令一个的倍数为止。但在证明中,它实际上依赖于一个数除以另一个数的余数;由于他没有0的简单概念,故他不能说一个数整除另一个数时的余数是什么。所以可以合理的认为,他想象每个除法都是算法的一个单一步骤,因此对他的算法的“真正的”意译可以如下。
 
欧几里德原始算法:
给定两个大于1的整数A和C,本算法求它们的最大共因子。
E1. [A可被C整除?] 如果C整除A,则此算法以C作为答案终止。
E2. [以余数代替A]  如果A mod C等于1,则给定的数互素,所以算法终止,否则,以(C,A mod C)代替(A,C)并返回步骤E1。

3  欧几里德原始算法的证明
    上面摘录的欧几里德给出的证明是特别有趣的,因为它实质上不是证明!他只是实施步骤E1一次或三次验证了这个算法的结果。由于没有用数学归纳法给出一个证明的思想,他仅仅通过对于有限情况给出了一个证明。尽管由于欧几里德在逻辑推导的技巧上所做出的巨大推进而闻名于世,但通过归纳法给出正确证明的技术直到许多世纪之后还迟迟未被发现;而且证明算法正确性的严格思想,实际上直到现在才真正搞清楚。

欧几里德的算法关键在于证明等式gcd(a,b)=gcd(b,a mod b)的正确性。
定理:a,b为正整数,则gcd(a,b)=gcd(b,a mod b)
证明:
k,r为整数,设r = a mod b,则a可以表示成a=kb+r。
假设d是{a,b}的一个公约数,则d整除a,d整除b,而r=a-kb,因此d整除r,d也是b和r的公约数。
假设d是{b,r}的一个公约数,则d整除b,d整除r,而a=kb+r,因此d整除a, d也是a和b的公约数。
因此{a,b}和{b,r}的公因子集合是一样的。特别地,{a,b}的最大共因子和{b,r}的最大公因子是一样的,即gcd(a,b)=gcd(b,a mod b)。
 
4  欧几里德原始算法的java程序代码
static int gcd(int M, int N) 

  if (N == 0) return M; 
  return gcd(N, M % N); 
}

原创粉丝点击