どのくらいの人が見ているのかは分かりませんが、しかもこんなテーマの計算を確認する人がいるとは思えませんが、自分への備忘録も兼ねて今回の計算で使っているエクセルマクロを紹介しておきます。
私はプロのグラマー、もといプログラマーではないのでコードは全く洗練されていないと思います。笑ってやって下さい。
まずは 8 ビットの Xor 演算のファンクションです。
ご存知だとは思いますが、こう定義しておくとシート上で簡単に Xor 演算してくれます。
エクセル関数にも Xor はあるのですが、1 ビット、1 ビットの演算でしかも "True" か "Faulse" が返ってくるだけです。デジタルデータとして利用して行くには別に準備しなくてはいけません。
1 ビット同士ならば、= mod("Cell1" + "Cell2", 2) でいいのですが。
今回は 8 ビット同士なので文字列同士の演算として扱っています。
Function Xor8Hex(ParamA, ParamB)
If ActiveSheet.Index <> 3 Then GoTo Jmp0
If ParamA = "" Then ParamA = "00000000"
If ParamB = "" Then ParamB = "00000000"
A7 = CDec(Left(ParamA, 1))
A6 = CDec(Mid(ParamA, 2, 1))
A5 = CDec(Mid(ParamA, 3, 1))
A4 = CDec(Mid(ParamA, 4, 1))
A3 = CDec(Mid(ParamA, 5, 1))
A2 = CDec(Mid(ParamA, 6, 1))
A1 = CDec(Mid(ParamA, 7, 1))
A0 = CDec(Mid(ParamA, 8, 1))
B7 = CDec(Left(ParamB, 1))
B6 = CDec(Mid(ParamB, 2, 1))
B5 = CDec(Mid(ParamB, 3, 1))
B4 = CDec(Mid(ParamB, 4, 1))
B3 = CDec(Mid(ParamB, 5, 1))
B2 = CDec(Mid(ParamB, 6, 1))
B1 = CDec(Mid(ParamB, 7, 1))
B0 = CDec(Mid(ParamB, 8, 1))
C7 = CStr(A7 + B7)
If C7 = "2" Then C7 = "0"
C6 = CStr(A6 + B6)
If C6 = "2" Then C6 = "0"
C5 = CStr(A5 + B5)
If C5 = "2" Then C5 = "0"
C4 = CStr(A4 + B4)
If C4 = "2" Then C4 = "0"
C3 = CStr(A3 + B3)
If C3 = "2" Then C3 = "0"
C2 = CStr(A2 + B2)
If C2 = "2" Then C2 = "0"
C1 = CStr(A1 + B1)
If C1 = "2" Then C1 = "0"
C0 = CStr(A0 + B0)
If C0 = "2" Then C0 = "0"
Result = C7 + C6 + C5 + C4 + C3 + C2 + C1 + C0
Xor8Hex = Result
Jmp0:
End Function
こんな感じになります。対象セルがブランクだったら "00000000" としていますが、桁数が足りない場合の処理が入っていません。こういうところは大甘です。
使い方は簡単で、たとえば
A1 に 00001100、B1 に 00110100 を文字列で書き込んでおいて、C1 に =Xor8Hex("A1","B1") と式を書けば、C1 に 00111000 が表示されます。
次は掛け算、割り算になるわけですが、今まで何度も紹介したようにまずはガロア体のテーブルが作られていて、その中での演算になります。そのテーブルは一度こちらで紹介しました。
αを使った計算の実際>誤り訂正技術
http://blogs.yahoo.co.jp/susanoo2001_hero/11175428.html
で、このテーブルを計算で利用できる位置に置かなくてはいけないのですが、今回はこの場所になっています。

セル "B2" から始まっているのは特に意味はありません。自分のクセで最初の行と列はブランクしているだけです。
この表は途中までしか示していませんが、実際にはαが 254 まで必要です。
テーブルの作り方は、こちらを参考にして下さい。
「原始多項式の原始元」の謎に迫る?!>誤り訂正技術
http://blogs.yahoo.co.jp/susanoo2001_hero/11169219.html?type=folderlist
簡単に書いておくと、以下のような 1 ビット単位のセルを作って最初の行には 0,0,0,0,0,0,0,1 を書き込みます。

次の n 行にはこの場合ですと、
M : =N(n-1)
N : =O(n-1)
O : =P(n-1)
P : =mod(Q(n-1)+M(n-1),2)
Q : =mod(R(n-1)+M(n-1),2)
R : =mod(S(n-1)+M(n-1),2)
S : =T(n-1)
T : =M(n-1)
こうやっておいて、それぞれのセルを文字列扱いにして加算した行を作ります。その行を 254 行コピペで作れば 8 ビットのガロア体が完成します。
掛け算割り算をするときは、当該 8 ビット文字列を C 列から探し出して、それに相当するαべき乗を B 列から拾うことから始まります。で、べき乗値を足す引くした後、得たべき乗値を B 列から探し出して、C 列の 8 ビット文字列を返すという形になります。
文字列からべき乗を取得するファンクション
Function FindExp8(Param)
If ActiveSheet.Index <> 3 Then GoTo Jmp0
If Param = "00000000" Then
FindExp8 = ""
GoTo Jmp0
Else
End If
' Cells(10, 4).Activate
i = 0
A = 0
Do Until Cells(3 + i, 3) = Param
A = Cells(4 + i, 2)
i = i + 1
' If A = "" Then GoTo jmp001
Loop
FindExp8 = A
Jmp0:
End Function
べき乗から文字列を取得するファンクション
Function FindBin8(Param)
If ActiveSheet.Index <> 3 Then GoTo Jmp0
If Param = "" Then
A = "00000000"
GoTo jump0
Else
End If
If Param >= 255 Then Param = Param - 255
If Param >= 255 Then Param = Param - 255
' Cells(10, 4).Activate
A = "00000001"
i = 0
Do Until Cells(3 + i, 2) = Param
A = Cells(4 + i, 3)
i = i + 1
' If A = 0 Then GoTo jump0
Loop
jump0:
FindBin8 = A
Jmp0:
End Function
センスのかけらもないコードだと思いますが、こんなものかということで我慢して下さい。なお先ほどのテーブルにない値を参照するとしばらく応答がなかったりするので、実用的には入力された値が適切な範囲にあるかどうかの判断を入れて下さい。
使い方は簡単でワークシート上で、
A1 に 00001010 と書いて、B1 に =FindExp8(A1) と書くと、B1 に 51 が表示されます。さらに C1 に =FindBin8(B1) と書くと C1 に 00001010 が現れます。
掛け算、割り算をする場合は、A1 に 00001010、 B1 に 00110100 を入れたとして、
掛け算
C1: =FindBin8(mod(FindExp8(A1)+FindExp8(B1),255))
割り算
D1: =FindBin8(mod(255+FindExp8(A1)-FindExp8(B1),255))
とすると、C1 に 1101001、D1 に 00011100 が現れます。これらを組み合わせて多項式に値を代入して計算していくわけです。
私はプロのグラマー、もといプログラマーではないのでコードは全く洗練されていないと思います。笑ってやって下さい。
まずは 8 ビットの Xor 演算のファンクションです。
ご存知だとは思いますが、こう定義しておくとシート上で簡単に Xor 演算してくれます。
エクセル関数にも Xor はあるのですが、1 ビット、1 ビットの演算でしかも "True" か "Faulse" が返ってくるだけです。デジタルデータとして利用して行くには別に準備しなくてはいけません。
1 ビット同士ならば、= mod("Cell1" + "Cell2", 2) でいいのですが。
今回は 8 ビット同士なので文字列同士の演算として扱っています。
Function Xor8Hex(ParamA, ParamB)
If ActiveSheet.Index <> 3 Then GoTo Jmp0
If ParamA = "" Then ParamA = "00000000"
If ParamB = "" Then ParamB = "00000000"
A7 = CDec(Left(ParamA, 1))
A6 = CDec(Mid(ParamA, 2, 1))
A5 = CDec(Mid(ParamA, 3, 1))
A4 = CDec(Mid(ParamA, 4, 1))
A3 = CDec(Mid(ParamA, 5, 1))
A2 = CDec(Mid(ParamA, 6, 1))
A1 = CDec(Mid(ParamA, 7, 1))
A0 = CDec(Mid(ParamA, 8, 1))
B7 = CDec(Left(ParamB, 1))
B6 = CDec(Mid(ParamB, 2, 1))
B5 = CDec(Mid(ParamB, 3, 1))
B4 = CDec(Mid(ParamB, 4, 1))
B3 = CDec(Mid(ParamB, 5, 1))
B2 = CDec(Mid(ParamB, 6, 1))
B1 = CDec(Mid(ParamB, 7, 1))
B0 = CDec(Mid(ParamB, 8, 1))
C7 = CStr(A7 + B7)
If C7 = "2" Then C7 = "0"
C6 = CStr(A6 + B6)
If C6 = "2" Then C6 = "0"
C5 = CStr(A5 + B5)
If C5 = "2" Then C5 = "0"
C4 = CStr(A4 + B4)
If C4 = "2" Then C4 = "0"
C3 = CStr(A3 + B3)
If C3 = "2" Then C3 = "0"
C2 = CStr(A2 + B2)
If C2 = "2" Then C2 = "0"
C1 = CStr(A1 + B1)
If C1 = "2" Then C1 = "0"
C0 = CStr(A0 + B0)
If C0 = "2" Then C0 = "0"
Result = C7 + C6 + C5 + C4 + C3 + C2 + C1 + C0
Xor8Hex = Result
Jmp0:
End Function
こんな感じになります。対象セルがブランクだったら "00000000" としていますが、桁数が足りない場合の処理が入っていません。こういうところは大甘です。
使い方は簡単で、たとえば
A1 に 00001100、B1 に 00110100 を文字列で書き込んでおいて、C1 に =Xor8Hex("A1","B1") と式を書けば、C1 に 00111000 が表示されます。
次は掛け算、割り算になるわけですが、今まで何度も紹介したようにまずはガロア体のテーブルが作られていて、その中での演算になります。そのテーブルは一度こちらで紹介しました。
αを使った計算の実際>誤り訂正技術
http://blogs.yahoo.co.jp/susanoo2001_hero/11175428.html
で、このテーブルを計算で利用できる位置に置かなくてはいけないのですが、今回はこの場所になっています。

セル "B2" から始まっているのは特に意味はありません。自分のクセで最初の行と列はブランクしているだけです。
この表は途中までしか示していませんが、実際にはαが 254 まで必要です。
テーブルの作り方は、こちらを参考にして下さい。
「原始多項式の原始元」の謎に迫る?!>誤り訂正技術
http://blogs.yahoo.co.jp/susanoo2001_hero/11169219.html?type=folderlist
簡単に書いておくと、以下のような 1 ビット単位のセルを作って最初の行には 0,0,0,0,0,0,0,1 を書き込みます。

次の n 行にはこの場合ですと、
M : =N(n-1)
N : =O(n-1)
O : =P(n-1)
P : =mod(Q(n-1)+M(n-1),2)
Q : =mod(R(n-1)+M(n-1),2)
R : =mod(S(n-1)+M(n-1),2)
S : =T(n-1)
T : =M(n-1)
こうやっておいて、それぞれのセルを文字列扱いにして加算した行を作ります。その行を 254 行コピペで作れば 8 ビットのガロア体が完成します。
掛け算割り算をするときは、当該 8 ビット文字列を C 列から探し出して、それに相当するαべき乗を B 列から拾うことから始まります。で、べき乗値を足す引くした後、得たべき乗値を B 列から探し出して、C 列の 8 ビット文字列を返すという形になります。
文字列からべき乗を取得するファンクション
Function FindExp8(Param)
If ActiveSheet.Index <> 3 Then GoTo Jmp0
If Param = "00000000" Then
FindExp8 = ""
GoTo Jmp0
Else
End If
' Cells(10, 4).Activate
i = 0
A = 0
Do Until Cells(3 + i, 3) = Param
A = Cells(4 + i, 2)
i = i + 1
' If A = "" Then GoTo jmp001
Loop
FindExp8 = A
Jmp0:
End Function
べき乗から文字列を取得するファンクション
Function FindBin8(Param)
If ActiveSheet.Index <> 3 Then GoTo Jmp0
If Param = "" Then
A = "00000000"
GoTo jump0
Else
End If
If Param >= 255 Then Param = Param - 255
If Param >= 255 Then Param = Param - 255
' Cells(10, 4).Activate
A = "00000001"
i = 0
Do Until Cells(3 + i, 2) = Param
A = Cells(4 + i, 3)
i = i + 1
' If A = 0 Then GoTo jump0
Loop
jump0:
FindBin8 = A
Jmp0:
End Function
センスのかけらもないコードだと思いますが、こんなものかということで我慢して下さい。なお先ほどのテーブルにない値を参照するとしばらく応答がなかったりするので、実用的には入力された値が適切な範囲にあるかどうかの判断を入れて下さい。
使い方は簡単でワークシート上で、
A1 に 00001010 と書いて、B1 に =FindExp8(A1) と書くと、B1 に 51 が表示されます。さらに C1 に =FindBin8(B1) と書くと C1 に 00001010 が現れます。
掛け算、割り算をする場合は、A1 に 00001010、 B1 に 00110100 を入れたとして、
掛け算
C1: =FindBin8(mod(FindExp8(A1)+FindExp8(B1),255))
割り算
D1: =FindBin8(mod(255+FindExp8(A1)-FindExp8(B1),255))
とすると、C1 に 1101001、D1 に 00011100 が現れます。これらを組み合わせて多項式に値を代入して計算していくわけです。