2


私はこの連立方程式を持っています
1=x⊕y⊕z
1=x⊕y⊕w
0=x⊕w⊕z
1=w⊕y⊕zここ

説明されているように、このシステムを解決するためにガウス消去法を実装しようとしています。除算、減算、乗算を XOR に置き換えますが、間違った答えが返されます。正しい答えは (x,y,z,w)=(0,1,0,0)です。

public static void ComputeCoefficents(byte[,] X, byte[] Y)
    {
        int I, J, K, K1, N;
        N = Y.Length;
        for (K = 0; K < N; K++)
        {
            K1 = K + 1;
            for (I = K; I < N; I++)
            {
                if (X[I, K] != 0)
                {
                    for (J = K1; J < N; J++)
                    {
                        X[I, J] /= X[I, K];
                    }
                    //Y[I] /= X[I, K];
                    Y[I] ^= X[I, K];

                }
            }
            for (I = K1; I < N; I++)
            {
                if (X[I, K] != 0)
                {
                    for (J = K1; J < N; J++)
                    {
                        X[I, J] ^= X[K, J];
                    }
                    Y[I] ^= Y[K];
                }
            }
        }
        for (I = N - 2; I >= 0; I--)
        {
            for (J = N - 1; J >= I + 1; J--)
            {
                //Y[I] -= AndOperation(X[I, J], Y[J]);
                Y[I] ^= (byte)(X[I, J]* Y[J]);

            }
        }
    } 
4

1 に答える 1

4

これにガウス消去mod 2を適用しようとしていると思います。

一般に、方程式が次の形式の場合、ガウス消去法 mod k を実行できます。

a_1 * x + b_1 * y + c_1 * z = d_1
a_2 * x + b_2 * y + c_2 * z = d_2
a_3 * x + b_3 * y + c_3 * z = d_3
a_4 * x + b_4 * y + c_4 * z = d_4

Z2 では * はand+ でxorあるため、ガウスの消去法を使用して次の形式の方程式を解くことができます。

x (xor) y (xor) z   = 1
x (xor) y (xor) w   = 1 
x (xor) z (xor) w   = 0
y (xor) z (xor) w   = 1

手でガウス消去法を使用してこの方程式を実行しましょう。

対応する拡張行列は次のとおりです。

 1 1 1 0 | 1
 1 1 0 1 | 1
 1 0 1 1 | 0
 0 1 1 1 | 1

 1 1 1 0 | 1
 0 0 1 1 | 0   (R2 = R2 + R1)
 0 1 0 1 | 1   (R3 = R3 + R1)
 0 1 1 1 | 1

 1 1 1 0 | 1
 0 1 1 1 | 1   (R2 = R4)
 0 1 0 1 | 1   
 0 0 1 1 | 0   (R4 = R2)

 1 0 0 1 | 0   (R1 = R1 + R2)
 0 1 1 1 | 1   
 0 0 1 0 | 0   (R3 = R3 + R2)   
 0 0 1 1 | 0   

 1 0 0 1 | 0
 0 1 0 1 | 1   (R2 = R2 + R3)  
 0 0 1 0 | 0      
 0 0 0 1 | 0   (R4 = R4 + R3)

 1 0 0 0 | 0   (R1 = R1 + R4)
 0 1 0 0 | 1   (R2 = R2 + R4)  
 0 0 1 0 | 0      
 0 0 0 1 | 0 

(x,y,z,w) = (0,1,0,0) の解を与えます。

しかし、これには行のピボットが必要です-これはあなたのコードではわかりません。

コード内には、おそらく存在する必要のない乗算と除算がいくつかあります。コードは次のようになると思います: (TODO を修正する必要があります)。

public static void ComputeCoefficents(byte[,] X, byte[] Y) {
  int I, J, K, K1, N;
  N = Y.Length;

  for (K = 0; K < N; K++) {
    //First ensure that we have a non-zero entry in X[K,K]
    if( X[K,K] == 0 ) {
      for(int i = 0; i<N ; ++i ) { 
        if(X[i,K] != 0 ) {
             for( ... ) //TODO: A loop to swap the entries
             //TODO swap entries in Y too
           }
      }
    if( X[K,K] == 0 ) {
       // TODO: Handle the case where we have a zero column 
       //      - for now we just move on to the next column
       //      - This means we have no solutions or multiple 
       //        solutions
       continue
    }

    // Do full row elimination.
    for( int I = 0; I<N; ++I)
    {
       if( I!=K ){ //Don't self eliminate
         if( X[I,K] ) { 
           for( int J=K; J<N; ++J ) { X[I,J] = X[I,J] ^ X[K,J]; }
           Y[J] = Y[J] ^ Y[K];
         }
       }
    }
  }

  //Now assuming we didnt hit any zero columns Y should be our solution.

}

于 2012-07-18T07:06:24.617 に答える