首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模逆算法

模逆算法
EN

Stack Overflow用户
提问于 2011-09-30 16:45:43
回答 1查看 1.9K关注 0票数 1

我读过关于扩展的欧几里德算法&模逆的一节,其中指出,它不仅计算GCD(n,m),而且计算a和b,这样就可以这样描述a*n+b*b=1;算法:

  1. 写了n,m,并且两个向量(1,0)和(0,1)
  2. 除以两个数字中较大的一个,称为小商q
  3. 减去q倍于较大的(即减小较大的模越小)

(这里我有一个问题,如果我们用q/m表示,那么n-q*m is不等于0?因为q= n/m;(假设n>m),那么为什么需要这样的运算呢?然后第四步

4.从较大的向量中减去对应较小向量的Q倍。重复步骤2到4,直到结果为0。

因此,我对这个问题的问题也是如何在代码中实现这个步骤?请帮助我,我不知道如何开始和从哪一点开始解决这样的问题,为了澄清结果,这个算法的一个例子应该是下面的30^(-1)(mod 53)的计算;

代码语言:javascript
复制
53           30           (1,0)                        (0,1)
53-1*30=23   30           (1,0)-1*(0,1)=(1,-1)         (0,1)
23           30-1*23=7    (1,-1)                       (0,1)-1*(1,-1)=(-1,2)
23-3*7=2      7           (1,-1)-3*(-1,2)=(4,-7)       (-1,2)
2             7-3*2=1     (4,-7)                      (-1,2)-3*(4,7)=(-13,23)
2-2*1=0       1           (4,-7)-2*(-13,23)=(30,-53)   (-13,23)

由此我们看到gcd(30, 53) =1,重新排列项,我们看到1=-13*53+23*30,因此我们得出30^(-1)=23(mod 53)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-30 17:45:37

除法被认为是带截断的整数除法。gcd(a, b)a <= b的标准EA如下所示:

代码语言:javascript
复制
 b =  a * q0 + r0
 a = r0 * q1 + r1
r0 = r1 * q2 + r2
  ...
r[N+1] = 0

现在,rN是所需的GCD。然后你回来-替代:

代码语言:javascript
复制
r[N-1] = r[N] * q[N+1]

r[N-2] = r[N-1] * q[N] + r[N]
       = (r[N] * q[N+1]) * q[N] + r[N]
       = r[N] * (q[N+1] * q[N] + 1)

r[N-3] = r[N-2] * q[N-1] + r[N-1]
       = ... <substitute> ...

直到你终于到达rN = m * a + n * b。您描述的算法会立即跟踪回溯数据,因此它的效率要高一些。

如果是rN == gcd(a, b) == 1,那么您确实找到了ab的乘法逆,即m(a * m) % b == 1

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7613516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档