CompilerTech

导航

欧几里德算法与扩展的欧几里德算法

欧几里德算法:
           给定的两个整数m,n,求它们的最大公因子。

            算法很简单,使用碾转相除法

描述:
       E1 r=m%n
       E2 if r= 0

          return n(即为最大公因数)

        else
            m = n;n = r;返回 E1

平均比较次数Tn=(12*ln2)/pi^2)*lnn

扩展的欧几里德算法:

给定的两个正整数a,b,计算它们的最大公因子d和两个整数a和b,使得ax+by=d

要证明这个定理,首先需给出一个定理

带余除法:

若a,b是两个整数,其中b>0,则存在两个整数q,r,使得

               a = b*q + r  0<=r<b

,并且q和r是唯一的。

这个定理证明是简单的,有了这个定义,我们就来证明欧几里德算法
              

a = q0*b + r0
b = q1*r0 + r1
r0= q2*r1 + r2
 ...
rn-3=qn-1*rn-2 + rn-1
rn-2 = qn * rn-1 + rn(rn = 0)

这里rn-1就是最大公约数。
现在就需要反推回去,可以得到r可以用a,b线性表示

Ri=(Xi-2-Qi*Xi)*a-(Yi-2-Qi*Yi-1)*b

下一步就是求x,y的值。

Xi=Xi-2-Qi*Xi-1
Yi=Yi-2-Qi*Yi-1

而我们很容易得到x0,y0,x1,y1的值,那么递推,我们就可以得到x,y的值

算法描述


E1 x0=0,y0=1;x1=1,y0=0,c=a,d=b
E2 q<-c/d r<-c%d
E3 if r=0
    return
   else E4
E4
    x=x0-q*x1
    x0=x1;x1=x
    y=y0-q*y1
    y0=y1;y1=y


 http://blogold.chinaunix.net/u/32610/showart_353805.html

posted on 2011-04-14 17:44  compilerTech  阅读(236)  评论(0编辑  收藏  举报