我试图在Python中编写Montgomery multiplication的实现,我需要一个等同于GMP的mpz_getlimbn()
用于Python的长度,但我不能为生命做准备我似乎找到了一个。
非常感谢任何帮助。
修改
我实施了以下内容,但我得到的指标超出了GMP中不会出现的肢体范围错误。
def unpack(x, b):
if gmpy2:
return [long(x) for x in gmpy2.unpack(gmpy2.mpz(x), b)]
b = 2 ** b
r = []
while x:
x, temp = divmod(x, b)
r.append(temp)
return r
答案 0 :(得分:1)
我修改了您的unpack()
,它似乎对我有用。如果仍然出现错误,请发布完整错误。
>>> import gmpy2
>>>
>>> def unpack(x, b):
... try:
... return [x for x in gmpy2.unpack(gmpy2.mpz(x), b)]
... except NameError:
... b = 2 ** b
... r = []
... while x:
... x, temp = divmod(x, b)
... r.append(temp)
... return r
...
>>> unpack(123456**7, 15)
[mpz(0), mpz(0), mpz(4096), mpz(25855), mpz(24508), mpz(31925), mpz(15111), mpz(10775)]
>>> del(gmpy2)
>>> unpack(123456**7, 15)
[0, 0, 4096, 25855, 24508, 31925, 15111, 10775]
使用gmpy2
时,我将结果保留为mpz
,以表明已使用gmpy2
。
Python的长整数类型使用存储15或30位的四肢。 sys.int_info
将为您的系统提供详细信息。
顺便说一句,我保持gmpy2
,很高兴看到有人使用unpack()
。