提问人:howl 提问时间:11/17/2023 更新时间:11/17/2023 访问量:58
差值 inverse(), Python 中的 %
difference inverse(), % in python
问:
我不知道 python 中 inverse() 和 % 的区别。例如,,结果是一样的,不是吗?(Inverse() 是属于 Crypto.Util.number 的函数。inverse(a, q)
a%q
如果你能告诉我其中的区别,我将不胜感激。
答:
1赞
mozway
11/17/2023
#1
不,这显然是不一样的。
123%45
# 33
inverse(123, 45)
# 41
你可以检查 inverse
的源代码(python 2 代码):
def inverse(u, v):
"""inverse(u:long, v:long):long
Return the inverse of u mod v.
"""
u3, v3 = long(u), long(v) # python 3: u3, v3 = u, v
u1, v1 = 1L, 0L # u1, v1 = 1, 0
while v3 > 0:
q=divmod(u3, v3)[0]
u1, v1 = v1, u1 - v1*q
u3, v3 = v3, u3 - v3*q
while u1<0:
u1 = u1 + v
return u1
如果你在最近的替换库 pycrytodome
的源代码中检查等效函数,就会有一个明确的解释,即这是在计算多项式最大公约数:
def inverse(self):
"""Return the inverse of this element in GF(2^128)."""
# We use the Extended GCD algorithm
# http://en.wikipedia.org/wiki/Polynomial_greatest_common_divisor
if self._value == 0:
raise ValueError("Inversion of zero")
r0, r1 = self._value, self.irr_poly
s0, s1 = 1, 0
while r1 > 0:
q = _div_gf2(r0, r1)[0]
r0, r1 = r1, r0 ^ _mult_gf2(q, r1)
s0, s1 = s1, s0 ^ _mult_gf2(q, s1)
return _Element(s0)
评论
0赞
howl
11/17/2023
我试图按照你告诉我的那样实现它来检查它,但有一个错误。错误是 1L、0L 中的“无效十进制文字”。1L和0L是什么意思?
0赞
mozway
11/17/2023
@howl正如我在回答中所评论的那样,这是 Python 2 代码,这是使用代码中导入的兼容性工具实现的。否则,python 3 中的语法无效。 在 Python 2 中表示,这在 Python 3 中不存在,因为整数可以具有任意长度。您应该能够删除并“转换”到 python 3。1L
long
long
L
0赞
President James K. Polk
11/17/2023
第二种算法不能替代第一种算法。第一个是专门针对整数的。第二种算法是针对多项式逆的,正如它所说。两者都基于扩展的欧几里得算法。在现代 python(从 3.8 版开始)中,可以使用内置的 pow() 函数来计算逆向。请参阅 github.com/Legrandin/pycryptodome/blob/...
评论