1

バイナリ行列 A( と のみ)1と、ガロア体 (256)0のベクトルがあります。DベクトルCは次のように計算されます。

  C = (A^^-1)*D

ここで、A^^-1は の行列の逆行列を表しAGF(2)*乗算演算です。結果ベクトルCは にある必要がありますGF(256)。Matlabでやってみました。

A= [ 1     0     0     1     1     0     0     0     0     0     0     0     0     0;
     1     1     0     0     0     1     0     0     0     0     0     0     0     0;
     1     1     1     0     0     0     1     0     0     0     0     0     0     0;
     0     1     1     1     0     0     0     1     0     0     0     0     0     0;
     0     0     1     1     0     0     0     0     1     0     0     0     0     0;
     1     1     0     1     1     0     0     1     0     1     0     0     0     0;
     1     0     1     1     0     1     0     0     1     0     1     0     0     0;
     1     1     1     0     0     0     1     1     1     0     0     1     0     0;
     0     1     1     1     1     1     1     0     0     0     0     0     1     0;
     0     0     0     0     1     1     1     1     1     0     0     0     0     1;
     0     1     1     1     1     0     1     1     1     0     1     1     1     0;
     0     0     0     1     0     0     0     1     0     0     0     0     0     0;
     0     0     1     0     0     0     0     1     0     0     0     0     0     0;
     1     1     1     1     0     0     0     0     0     0     0     0     0     0]

D=[0;0;0;0;0;0;0;0;0;0;103;198;105;115]
A=gf(A,1);
D=gf(D,8); %%2^8=256
C=inv(A)*D
%% The corrected result must be
%%C=[103;187;125;210;181;220;161;20;175;175;187;187;220;115]

ただし、上記のコードでは、期待した結果を達成できません

C=[103;187;125;210;181;220;161;20;175;175;187;187;220;115]

次のようなエラーが発生します

Error using  *  (line 14)
Orders must match.

期待した結果を達成するのを手伝ってもらえますか?

4

2 に答える 2

6

エラー

* の使用エラー (14 行目)
注文は一致する必要があります。

+これは、Matlab が標準の数学演算 ( 、*.*、など) を次数の異なるガロア体に適用することをサポートしていないために.^発生します。逆の操作は有効な操作であり、@ Ander Biguriで示されているように単独で実行すると、成功して inの逆を生成します。乗算しようとすると、これらのガロア体の次数が一致しないため、計算が失敗します。\GF(2)GF(256)inv(A)AGF(2)inv(A)D

この例では、での乗算が で行われるAため、次数 2 のガロア体として明示的に定義する必要はありません。それはです。GF(2)GF(256)GF(2)1 + 1 = 0

このようにガロア体を作成するコードを変更するとA

A = gf(A, 8);

その後、実行できます

C = inv(A)*D

生産する

C = GF(2^8) array. Primitive polynomial = D^8+D^4+D^3+D^2+1 (285 decimal)

Array elements = 

         103
         187
         125
         210
         181
         220
         161
          20
         175
         175
         187
         187
         220
         115

CしたがってGF(256)、期待される結果が得られます。

于 2015-11-04T18:10:48.227 に答える
3

どっちもあるらしい

A) 計算の理論上の誤り、または

B) MATLAB がサポートしていないもの。

ガロア体算術のドキュメントに従って(強調鉱山):

セクションの概要。次の表に示す一般的な MATLAB 演算子を使用して、ガロア配列の算術演算を実行できます。 ガロア配列のペアを操作するときはいつでも、両方の配列が 同じガロア体になければなりません。

そして、あなたの行列はそうではありません。

ガロア体がどのように機能するのかわからないので、どれがどれなのかわかりません

于 2015-11-04T17:45:38.900 に答える