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

逆计算器模Python
EN

Stack Overflow用户
提问于 2021-05-06 19:38:36
回答 2查看 85关注 0票数 1

在mod 543中154的inverse是67,我的代码告诉我它是58。这是我的Python代码:

代码语言:javascript
复制
def inverse(modulo, number):
    ri1 = number
    ri2 = modulo
    ti1 = 1
    ti2 = 0
    qi = 0
    ti = 0
    qi = 0
    ri = 0
    while ri1 != 0:
        ri = ri2 % ri1
        qi = (ri2 - ri) / ri1
        ti = ti2 - (qi * ti-1)
        ri2 = ri1
        ri1 = ri
        ti2 = ti1
        ti1 = ti
    return ti1
print(inverse(543, 154))
EN

回答 2

Stack Overflow用户

发布于 2021-05-06 21:15:23

嗨,我想你的代码中有一个拼写错误,也许你没有尽可能好地实现算法。

在我下面的回答中,我将遵循this page上的伪代码。

它看起来像这样:

代码语言:javascript
复制
function extended_gcd(a, b)
    (old_r, r) := (a, b)
    (old_s, s) := (1, 0)
    (old_t, t) := (0, 1)
    
    while r ≠ 0 do
        quotient := old_r div r
        (old_r, r) := (r, old_r − quotient × r)
        (old_s, s) := (s, old_s − quotient × s)
        (old_t, t) := (t, old_t − quotient × t)
    
    output "Bézout coefficients:", (old_s, old_t)
    output "greatest common divisor:", old_r
    output "quotients by the gcd:", (t, s)

我已经更新了下面的代码,但你方法中的关键“缺陷”是你返回的是t而不是s。

代码语言:javascript
复制
def inverse(modulo, number):
    ri1 = number # a
    ri2 = modulo # b
    ti1 = 0 # old_t
    ti2 = 1 # t
    ti = 0
    
    si1 = 1 # old_s
    si2 = 0 # s
    ti = 0
    
    ri = 0 
    while ri1 != 0:
        ri = ri2 % ri1
        qi = (ri2 - ri) / ri1
        ti = ti2 - (qi * ti1)
        si = si2 - (qi * si1)
        ri2 = ri1
        ri1 = ri
        ti2 = ti1
        ti1 = ti
        si2 = si1
        si1 = si
            
    print(f"Bézout coefficients: ({si1}, {ti1})")
    print(f"greatest common divisor: {ri2}")
    print(f"quotients by the gcd: ({ti2}, {si2})")
    print(f"modulo inverse {si2}")
print(inverse(543, 154))

我们可以简化这段代码,只获得值si2,如下所示:

代码语言:javascript
复制
def inverse(modulo, number):
    ri1 = number # a
    ri2 = modulo # b
    ri = 0 
    
    
    si1 = 1 # old_s
    si2 = 0 # s
    
    while ri1 != 0:
        ri = ri2 % ri1
        qi = (ri2 - ri) / ri1
        si1, si2 = si2 - (qi * si1), si1
        ri2 = ri1
        ri1 = ri
            
    return si2
print(inverse(543, 154))

这就起作用了。

票数 1
EN

Stack Overflow用户

发布于 2021-05-06 21:14:25

下面的代码可以工作:

代码语言:javascript
复制
def inverse(modulo, number):
    ri1 = number
    ri2 = modulo
    ti1 = 1
    ti2 = 0
    qi = 0
    ti = 0
    ri = 0
    while ri2 != 0:
        qi = ri1 // ri2
        ti = ri2
        ri2 = ri1 % ri2
        
        ri1 = ti
        ti = ti2
        ti2 = ti1-qi*ti2
        ti1 = ti
    
    if (ti1 < 0):
        ti1 = ti1 + modulo

    return ti1
print(inverse(543, 154))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67417361

复制
相关文章

相似问题

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