6

これらの2つの関数は拡張ユークリッドアルゴリズムを実行し、乗法逆関数を求めます。注文は正しいと思われますが、シドニーのUのhttp://magma.maths.usyd.edu.au/calc/からこのツールに期待しているものでは戻ってこないので、これはGF(2)有限体で行われているので、ベース10からこのフィールドに移動します。GF(2)有限体でのPython乗法逆

これはテストされ、ベース10で処理されましたが、バイナリ係数を持つ多項式を取り込むことはここでは不可能かもしれません。だから私の質問は、Pythonのどの部分が、GF(2)でこれを行うことができるために関数が基底10で可能であったかを示すことができない// floorなど、このアルゴリズムに間違って適用されます。

ツールは、上記のようにテストすることができます。私はこのような多項式ではなく、もちろんのバイナリ形式でテストしてきた

def extendedEuclideanGF2(self,a,b): # extended euclidean. a,b are values 10110011... in integer form 
    inita,initb=a,b; x,prevx=0,1; y,prevy = 1,0 
    while b != 0: 
     q = int("{0:b}".format(a//b),2) 
     a,b = b,int("{0:b}".format(a%b),2); 
     x,prevx = (int("{0:b}".format(prevx-q*x)), int("{0:b}".format(x,2))); y,prevy=(prevy-q*y, y) 
    print("Euclidean %d * %d + %d * %d = %d" % (inita,prevx,initb,prevy,a)) 
    return a,prevx,prevy # returns gcd of (a,b), and factors s and t 

def modular_inverse(self,a,mod): # a,mod are integer values of 101010111... form 
    a,mod = prepBinary(a,mod) 
    bitsa = int("{0:b}".format(a),2); bitsb = int("{0:b}".format(mod),2) 
    #return bitsa,bitsb,type(bitsa),type(bitsb),a,mod,type(a),type(mod) 
    gcd,s,t = extendedEuclideanGF2(a,mod); s = int("{0:b}".format(s)) 
    initmi = s%mod; mi = int("{0:b}".format(initmi)) 
    print ("M Inverse %d * %d mod %d = 1"%(a,initmi,mod)) 
    if gcd !=1: return mi,False 
    return mi # returns modular inverse of a,mod 

p = "x**13 + x**1 + x**0" 
q = "x**12 + x**1" 

R<x>:=PolynomialRing(GF(2)); 
p:=x^13+x+1; q:=x^12+x; 
g,r,s:=XGCD(p,q); 

g eq r*p+s*q; 

g,r,s; 

機能

+0

また、関数の定義の一部を表示することもできます。 prepBinary?ありがとう。 –

答えて

3

すべてのコンバージョンがint("{0:b}".format(x))にあるため、ベース10でテストしたときに機能しましたxには影響しません。x:

37 == int("{0:b}".format(37), 2) # >>> True 

数字オブジェクトはすべてベース10です。数字をバイナリ文字列に変換してから整数に戻すことは効果がありません。ここでは、abで基数10のintとして機能し、バイナリ形式で返す関数の代替バージョンがあります。 bin()関数を削除して、基数10の数値を返すか、lambda x: int("%d".format(x))のようなものを使用して、関数の最初の行でabを2進数から10進数に変換することができます。

def extendedEuclideanGF2(a, b): # extended euclidean. a,b are values 10110011... in   integer form 
    inita, initb = a, b # if a and b are given as base-10 ints 
    x, prevx = 0, 1 
    y, prevy = 1, 0 
    while b != 0: 
     q = a//b 
     a, b = b, a%b 
     x, prevx = prevx - q*x, x 
     y, prevy = prevy - q*y, y 
    print("Euclidean %d * %d + %d * %d = %d" % (inita, prevx, initb, prevy, a)) 
    i2b = lambda n: int("{0:b}".format(n)) # convert decimal number to a binary value in a decimal number 
    return i2b(a), i2b(prevx), i2b(prevy) # returns gcd of (a,b), and factors s and t 

、このような関数でラムダを使用していないと述べたことすべて - 私はあなただけの界面でのバイナリに/から変換することによって行うことができます完全にバイナリを使用して回避するために、あなたのプログラムを書くことをお勧めしたいですソースデータを持つプログラム。

+0

ありがとう。私は有限のフィールド内の除算でこれを使用しようとしています。これが正しいかどうかは分かりませんが、 'return self *(mi%min(other、self))%min(other、self)'ここで、miはselfとotherのmod_inverseです。どう思いますか? – stackuser

+0

私は実際の問題をここで見ています.GF2の算術ルールは整数のルールと同じではありません。 Pythonの演算子はGF2演算に従わず、キャリー演算を実行します。 GF2クラスを記述することでGF2のように動作させることができますが、GF2で除算を実行しようとすると、GF2クラスで '//'と '%'を実装するのはあまり意味がありません。 –

関連する問題