GF(2)域中的Python乘法

2024-06-02 23:32:24 发布

您现在位置:Python中文网/ 问答频道 /正文

这个函数返回了列表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的回答似乎完全准确,而且他在引用的在线工具中发现了一个错误。从现在看来,当以这种方式处理有限域数学时,内置的是优先考虑的。任何遇到这种情况的人都应该考虑对那些敏锐的观察能力表现出一票的热爱来付账。在


Tags: 文件函数in列表def二进制bitmultiply
2条回答

在GF(2)中乘法不是有点明智吗?所以你就不能:

x = int("1001",2)
y = int("1010",2)
z = x&y
print "{0:b}".format(z)

你错了enumerate。它从MSB开始,所以

for i, bit in enumerate('110'):
     print (i, bit)

会产生(0, 1), (1, 1), (2, 0),而不是{}。在

除此之外,还有一些风格建议:

  • Please avoid using ^{} in python。在页面上搜索Compound statements
  • Use list comprehensions if possible
  • 或者注释是错误的,或者您忘记了您multiply对列表进行操作。如果是前者-删除它,这是非常混乱。如果是后者-您现有的代码根本无法工作,因为列表上没有定义<<运算符。在

因此,multiply编写和修复更好:

^{pr2}$

另外,作为最后一个建议,为什么不允许python为您做这些事情呢?它内置了对任意长整数的支持,因此所有的示例都等价于a*b,或者,如果您希望结果是二进制形式"{0:b}".format(a*b)

相关问题 更多 >