Python 位移位以获得128位乘积

Python 位移位以获得128位乘积,python,bit-manipulation,bitwise-operators,Python,Bit Manipulation,Bitwise Operators,首先,我知道Python在不使用位运算符的情况下可以很好地处理这个问题,第三行代码应该说明这一点。我最终尝试在C中为赋值做这件事——在一个不支持uint€U的架构上实现RSA(因此代码中有p、q和n个变量);我只是更擅长Python,并尝试使用它来理解。编辑:在没有上述支持的情况下,存储total0(128位)是它自己的问题,但是这个概念证明应该允许我了解其余的问题 我发现在Motorola68000 CPU上讨论64位产品时,我试图用Python实现这一点,但增加了一倍。我把上面的32位弄对了

首先,我知道Python在不使用位运算符的情况下可以很好地处理这个问题,第三行代码应该说明这一点。我最终尝试在C中为赋值做这件事——在一个不支持uint€U的架构上实现RSA(因此代码中有p、q和n个变量);我只是更擅长Python,并尝试使用它来理解。编辑:在没有上述支持的情况下,存储total0(128位)是它自己的问题,但是这个概念证明应该允许我了解其余的问题

我发现在Motorola68000 CPU上讨论64位产品时,我试图用Python实现这一点,但增加了一倍。我把上面的32位弄对了,但是剩下的96位是不正确的(好吧,最后的16位也是正确的,但是它们根本没有移位,所以这并不奇怪)

为了防止我在计算位时出现数学错误,我尝试了一个蛮力for/for/for循环,在范围(0,81)内运行total1/total2/total3。没有对手

p = 10259632476918722477
q = 17757547285565901767
n = p*q

big_mask =    0xffffffff
small_mask =      0xffff

p_lo = p & big_mask
p_hi = p >> 32
q_lo = q & big_mask
q_hi = q >> 32

p_lo_q_lo = p_lo * q_lo
p_lo_q_hi = p_lo * q_hi
p_hi_q_lo = p_hi * q_lo
p_hi_q_hi = p_hi * q_hi

p_lo_q_lo_UPPER = p_lo_q_lo >> 16
p_lo_q_lo_LOWER = p_lo_q_lo & small_mask
p_lo_q_hi_UPPER = p_lo_q_hi >> 16
p_lo_q_hi_LOWER = p_lo_q_hi & small_mask
p_hi_q_lo_UPPER = p_hi_q_lo >> 16
p_hi_q_lo_LOWER = p_hi_q_lo & small_mask
p_hi_q_hi_UPPER = p_hi_q_hi >> 16
p_hi_q_hi_LOWER = p_hi_q_hi & small_mask

# Original, incorrect implementation
#total0 = p_hi_q_hi_UPPER
#total1 = (p_lo_q_hi_UPPER + p_hi_q_lo_UPPER + p_hi_q_hi_LOWER)
#total2 = (p_lo_q_lo_UPPER + p_lo_q_hi_LOWER + p_hi_q_lo_LOWER)
#total3 = p_lo_q_lo_LOWER
#total = total0 << 80 | total1 << 33 | total2 << 14 | total3 << 0

# Corrected implementation
total0 = p_hi_q_hi_UPPER << 80
total1 = p_hi_q_hi_LOWER << 64
total2 = (p_lo_q_hi_UPPER + p_hi_q_lo_UPPER) << 48
total3 = (p_lo_q_hi_LOWER + p_hi_q_lo_LOWER) << 32
total4 = p_lo_q_lo_UPPER << 16
total5 = p_lo_q_lo_LOWER

total = total0 + total1 + total2 + total3 + total4 + total5

print("\n")
if (n==total):
  print("Match!")
else:
  print("No match.")
print("\n")
print("Actual:   " + str(n))
print("Computed: " + str(total))

print("\n")
# Strip '0b' off of the binary string so the list groupings display logically
hex_n = hex(n)[2:]
hex_total = hex(total)[2:]
print("Actual:   ", end="")
print("\t" + str([hex_n[i:i+4] for i in range(0, len(hex_n), 4)]))
print("Computed: ", end="")
print("\t" + str([hex_total[i:i+4] for i in range(0, len(hex_total), 4)]))
p=1025963247696918722477
q=17757547285565901767
n=p*q
大屏蔽=0xffffffff
小屏蔽=0xffff
p_lo=p&big_面罩
p_hi=p>>32
q_lo=q&big_遮罩
q_hi=q>>32
p_lo_q_lo=p_lo*q_lo
p_lo_q_hi=p_lo*q_hi
p_hi_q_lo=p_hi*q_lo
p_hi_q_hi=p_hi*q_hi
p_lo_q_lo_UPPER=p_lo_q_lo>>16
p_lo_q_lo_LOWER=p_lo_q_lo&小屏蔽
p_lo_q_hi_UPPER=p_lo_q_hi>>16
p_lo_q_hi_LOWER=p_lo_q_hi&small_遮罩
p_hi_q_lo_UPPER=p_hi_q_lo>>16
p_hi_q_Low_LOWER=p_hi_q_lo&small_遮罩
p_hi_q_hi_UPPER=p_hi_q_hi>>16
p_hi_q_hi_LOWER=p_hi_q_hi&小_面罩
#原始的、不正确的实现
#总计0=p_hi_q_hi_UPPER
#总计1=(p_lo_q_hi_UPPER+p_hi_q_lo_UPPER+p_hi_hi_UPPER)
#总计2=(p_lo_q_lo_UPPER+p_lo_q_hi_Lou UPPER+p_hi_q_Lou Lou UPPER)
#总计3=p_lo_q_lo_lo_LOWER

#total=total0我认为在最后创建
total
值时,您的移位量是关闭的。以下是各种中间值的移位量:

p_lo         0
p_hi        32
q_lo         0
q_hi        32

p_lo_q_lo    0
p_lo_q_hi   32
p_hi_q_lo   32
p_hi_q_hi   64

p_lo_q_lo_UPPER    16
p_lo_q_lo_LOWER     0
p_lo_q_hi_UPPER    48
p_lo_q_hi_LOWER    32
p_hi_q_lo_UPPER    48
p_hi_q_lo_LOWER    32
p_hi_q_hi_UPPER    80
p_hi_q_hi_LOWER    64
对最终集进行排序:

p_hi_q_hi_UPPER    80
p_hi_q_hi_LOWER    64
p_lo_q_hi_UPPER    48
p_hi_q_lo_UPPER    48
p_lo_q_hi_LOWER    32
p_hi_q_lo_LOWER    32
p_lo_q_lo_UPPER    16
p_lo_q_lo_LOWER     0

所以有6个不同的最终移位量,而不是4个。通过在末尾创建6个
total
变量,并将它们与上面显示的移位量相加,应该很容易解决问题。

就是这样,再加上需要相加,而不是逻辑或结果。代码被编辑以显示。非常感谢。对,结果需要添加到最后。很高兴它现在起作用了
p_lo_q_lo
是一个64位的量。将其分解为低16位
p_lou q_lou lou lower
和高48位
p_lou q_lou lou up
的原因是什么?你确定你不想要一个简单的32位/32位分割吗?展示你的作品真是太棒了@马克·迪金森32/32也会起作用;我想,由于最初的80位移位,我一直在想我需要48位移位,然后从那里向后工作。@JohnSzakmeister谢谢,我讨厌含糊不清的帖子。如果谷歌让我失望了,我会尽可能的具体,并表明我不仅仅是在找人给我答案。