【问题标题】:Inverse calculator modulo Python逆计算器模Python
【发布时间】:2021-07-28 17:22:29
【问题描述】:

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

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))

【问题讨论】:

  • 现在可以使用 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 * ti1) ri2 = ri1 ri1 = ri ti2 = ti1 ti1 = ti 返回 ti2

标签: python modulo inverse inverse-transform


【解决方案1】:

您好,我认为您的代码中存在拼写错误,可能您还没有尽可能地实现算法。

在下面的回答中,我将按照this page 上的伪代码进行操作。

看起来像这样:

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。

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,如下所示:

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))

这有什么诀窍。

【讨论】:

    【解决方案2】:

    以下代码有效:

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2011-10-05
      • 2013-12-20
      相关资源
      最近更新 更多