0

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

4

2 回答 2

2

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

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

会屈服(0, 1), (1, 1), (2, 0),不会(0, 0), (1, 1), (2, 1)

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

  • 请避免;在 python中使用。Compound statements在页面上搜索
  • 尽可能使用列表推导
  • 要么评论错误,要么您忘记提及您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 为你做这些事情?它具有对任意长整数的内置支持,因此您的所有示例都等效于 just a*b,或者,如果您希望结果为二进制形式"{0:b}".format(a*b)

于 2013-06-27T16:38:06.833 回答
-2

GF(2)中的乘法不是有点明智吗?所以你不能这样做:

x = int("1001",2)
y = int("1010",2)
z = x&y
print "{0:b}".format(z)
于 2013-06-27T16:34:22.267 回答