此函数返回列表 g 中的异常值。它应该返回 32774、65548、1048768,但它的值更像是把整个二进制文件当作一个大紧身裤,只是将 LSB 移向 MSB,而不是实际移动。
这是功能:
def multiply(a,b): #a,b are values like 1101010001....
a = min(a,b); b = max(a,b)
g = []; bitsa = "{0:b}".format(a) #returns product of 2 polynomials in gf2
[g.append((b<<i)*int(bit)) for i,bit in enumerate(bitsa)]
return reduce(lambda x,y: x+y,g)
这就是我正在测试的:
x = int(str(100000000000011),2)
y = int(str(1000110),2)
x1 = int(str(111),2)
y1 = int(str(11),2)
x2 = int(str(0001),2)
y2 = int(str(1111),2)
print "multiply: ",multiply(x,y)
print "multiply: ",multiply(x1,y1)
print "multiply: ",multiply(x2,y2)
现在只有 x1,y1 有效,其他无效。这是最后一个输入的整个方程:
100000000000011
1000110
---------------------
100000000000011
100000000000011
100000000000011
---------------------
100011000000011001010
如您所见,要获得产品,两个二进制文件都需要检查其索引是否为 1,然后基于该值进行附加。我不知道如何适应该部分,以及如何做到这一点,以便它返回正确的值。试图理解为什么 x1,y1 有效而其他无效。
编辑:
我只是想明确一点,J0HN 的答案似乎是完全准确的,而且他在所引用的在线工具中发现了一个错误。从现在看来,以这种方式处理有限域数学时,内置的优先。任何发生在这件事上的人都应该考虑向他展示对那些敏锐的观察技能支付账单的投票热爱。