【问题标题】:Python --- multiplication in GF(2) fieldPython --- GF(2) 域中的乘法
【发布时间】:2013-06-27 16:18:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你把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 对列表进行操作。如果是前者 - 删除它,它会非常混乱。如果是后者 - 您现有的代码根本无法工作,因为列表上没有定义 &lt;&lt; 运算符。

    所以,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)

    【讨论】:

    • 谢谢,评论现在应该是正确的。你是对的,我打算使用内置的,但似乎这不适用于 x1,y1 组合,因此似乎有问题。需要 min,max 语句(我认为是因为它正在迭代最大值)。最后一种情况还是不行,参考这个 unb.edu 计算器(预设为测试值),也请检查这个计算器的 x1,y1 看看内置和这个之间的区别---- ee.unb.ca/cgi-bin/tervo/…
    • 恐怕您使用的工具弄错了,在示例中它错过了从第 3 位到第 4 位的结转。是否应该如此忽略结转?此外,如果它应该对列表进行操作 - 您现在拥有的 multiply 不会这样做,因为列表上没有定义 &lt;&lt; 运算符。
    • x1*y1 给出 1001,并且带有结转应该是 1101。但这仍然不是内置给出的 10101。那么这也是错误的 --- ee.unb.ca/cgi-bin/tervo/… ---- 在内置 print "{0:b}".format(x/y),"{0:b}".format(x%y ) 返回 11101010 111,所以内置的权利和这个工具似乎没有正确处理每个测试示例的二进制文件?
    • 是的,看起来那个工具刚刚坏了。
    【解决方案2】:

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

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

    【讨论】:

    • 不,不是,它本质上是一种产品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    相关资源
    最近更新 更多