这个函数返回了列表g中不寻常的值。它应该返回32774655481048768,但是它的值更像是把整个二进制文件当作一个大的slinky,只是将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)
我正在测试的是:
^{pr2}$现在只有x1,y1有效,其他没有。 这是最后一次输入的完整方程式:
100000000000011
1000110
---------------------
100000000000011
100000000000011
100000000000011
---------------------
100011000000011001010
因此,如您所见,要获得产品,两个二进制文件都需要检查其索引是否为1,然后基于1进行追加。我不确定如何将该部分放入,以及如何使它返回正确的值。试着理解为什么x1,y1起作用而其他的不起作用
编辑:
我只想弄清楚,J0HN的回答似乎完全准确,而且他在引用的在线工具中发现了一个错误。从现在看来,当以这种方式处理有限域数学时,内置的是优先考虑的。任何遇到这种情况的人都应该考虑对那些敏锐的观察能力表现出一票的热爱来付账。在
在GF(2)中乘法不是有点明智吗?所以你就不能:
你错了
enumerate
。它从MSB开始,所以会产生}。在
(0, 1), (1, 1), (2, 0)
,而不是{除此之外,还有一些风格建议:
Compound statements
multiply
对列表进行操作。如果是前者-删除它,这是非常混乱。如果是后者-您现有的代码根本无法工作,因为列表上没有定义<<
运算符。在因此,
^{pr2}$multiply
编写和修复更好:另外,作为最后一个建议,为什么不允许python为您做这些事情呢?它内置了对任意长整数的支持,因此所有的示例都等价于
a*b
,或者,如果您希望结果是二进制形式"{0:b}".format(a*b)
相关问题 更多 >
编程相关推荐