この関数は、リスト 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 の回答が完全に正確であるように見え、さらに、参照されたオンライン ツールでエラーを見つけたことを明確にしておきたいと思います。現在表示されているように、この方法で有限体演算を行う場合、ビルトインが優先されます。これに遭遇した人は誰でも、請求書を支払うための鋭い観察スキルに投票することを彼に示すことを間違いなく検討する必要があります.