Processing math: 100%

芯有所想

精益求精

Extended Euclid Algorithm

扩展欧几里德算法用来计算在模a乘法域下b的倒数。 算法描述尽可能用利于数字设计的方式,而不是程序设计的角度。

a,b为两个互素的正整数,不妨设 a>b, 如果不满足此条件,则交换a、b顺序

方法1

初始化:

r(1)=a;r(0)=bc(1)=1;c(0)=0d(1)=0;d(0)=1flag=1

迭代过程:从 n=1 开始

flag=flagq=r(n2)/r(n1)r(n)=r(n2) mod r(n1)c(n)=c(n2)+qc(n1)d(n)=d(n2)+qd(n1)x=flagc(n1)y=flagd(n1)

结束条件: r(n)==0

输出: r(n1),x,y 输出满足条件:

gcd(a,b)=r(n1)x(n1)a+y(n1)b=r(n1)

方法2

原始算法

x(1)=1;y(1)=0u(1)=0;v(1)=1r(1)=b;r(2)=a0q=r(n2)/r(n1)r(n)=r(n2) mod r(n1)x(n)=u(n1)y(n)=v(n1)u(n)=x(n1)qu(n1)v(n)=y(n1)qv(n1)r(n)==0r(n1),x(n),y(n)gcd(a,b)=r(n1)x(n)a+y(n)b=r(n1)

迭代算法改进:去掉 x,y

u[n],u[n+1]=1,0v[n],v[n+1]=0,1r[n],r[n+1]=a,bq=a/b:u[n],u[n+1]=u[n+1],u[n]qu[n+1]v[n],v[n+1]=v[n+1],v[n]qv[n+1]r[n],r[n+1]=r[n+1],r[n] mod r[n+1]q=r[n]/r[n1]r[n+1]==0:r[n],u[n],v[n]gcd(a,b)=r[n]u[n]a+v[n]b=r[n]

方法2的结构图如下:

u(n)的计算结构

python源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def ext_euclid(a, b):
    if a < b:
        a, b = b, a
    # 初始化条件:
    r_n2, r_n1 = a, b
    u_n2, u_n1 = 1, 0
    v_n2, v_n1 = 0, 1
    while True:
        # combinational calculcation
        q = r_n2/r_n1
        u_n = u_n2 - q*u_n1
        v_n = v_n2 - q*v_n1
        r_n = r_n2 % r_n1
        if r_n == 0 : break
        # update clocked data into DFF
        r_n1, r_n2 = r_n, r_n1
        u_n1, u_n2 = u_n, u_n1
        v_n1, v_n2 = v_n, v_n1
    return a, b, r_n1, u_n1, v_n1

Gitalking ...