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)ます。

それとは別に、いくつかのスタイルの提案:

したがって、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、結果をバイナリ形式にしたい場合は、すべての例が , or と同等です"{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 に答える