Python --- GF(2)字段中的乘法

时间:2013-06-27 16:18:01

标签: python python-2.7 polynomial-math finite-field

此函数返回列表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的答案似乎是完全准确的,而且他在引用的在线工具中发现错误。从现在看来,当以这种方式使用有限域数学时,内置函数是优先的。任何发生这种事情的人都应该考虑让他对那些敏锐的观察技巧表达一些投票的热情 - 付账单。

2 个答案:

答案 0 :(得分:2)

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

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

会产生(0, 1), (1, 1), (2, 0),而不是(0, 0), (1, 1), (2, 1)

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

  • Please avoid using ; in python。在页面上搜索Compound statements
  • Use list comprehensions if possible
  • 评论错误,或者您忘记提及您multiply在列表上操作。如果是前者 - 删除它,它会非常混乱。如果是后者 - 由于列表中没有定义<<运算符,您的现有代码根本无法运行。

所以,multiply更好地编写和修复:

def multiply(a,b):
    bitsa = reversed("{0:b}".format(a))
    g = [(b<<i)*int(bit) for i,bit in enumerate(bitsa)]
    return reduce(lambda x,y: x+y,g)    

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

答案 1 :(得分:-2)

在GF(2)中是不是正好乘以?所以你不能这样做:

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