FiniteField[p,d]
個の元からなる有限体を与える.
FiniteField[p,f]
が
の既約多項式である有限体
を与える.
FiniteField[p,…,rep]
"Polynomial"または"Exponential"の体の元表現 rep を使う.
FiniteField
FiniteField[p,d]
個の元からなる有限体を与える.
FiniteField[p,f]
が
の既約多項式である有限体
を与える.
FiniteField[p,…,rep]
"Polynomial"または"Exponential"の体の元表現 rep を使う.
詳細
- 有限体はガロア(Galois)体としても知られている.
- 有限体は,代数計算,暗号学,符号化理論,組合せ論,代数幾何学,整数論,有限幾何学にしばしば用いられる.
- 体
は,4つの算術演算+,-,*,÷がすべてある代数系である.有限体
は,素数
と正の整数
について
個の元
を持つことができる.
番目の元
はすべての
について
となる加法の単位元で,
番目の元
はすべての
について
となる乗法の単位元を与える.- FiniteFieldElement[,k]または[k]を使って
番目の元
が入手できる.これは
と表示される.
- 同じ体にあるFiniteFieldElementオブジェクトは算術操作によって自動的に結合される.
- 有限体からの係数を持つ多項式には,PolynomialGCD,Factor,Expand,PolynomialQuotientRemainder,Resultantのような多項式操作を使うことができる.有限体からの係数を持つ有理関数には,TogetherおよびCancelを使うことができる.
- Det,Inverse,RowReduce,NullSpace,MatrixRank,LinearSolveのような線形代数操作は,有限体からの項を持つ行列に使うことができる.
- SolveおよびReduceを使って方程式系を有限体上で解くことができる.
- FiniteFieldは"Polynomial"と"Exponential"の異なる2つの表現 rep をサポートする.
- "Polynomial"表現は複素数
のデカルト表現に似た表現で,加算と減算は簡単だが乗算と除算は少々難しくなる. - 表現 次数 d の既約多項式
を使って商を持つ体を識別する: -
の各元は多項式
として表される.基底が
のベクトル
と考えることもできる.- 列挙 元は辞書的順序の逆順に列挙される.
,
,…,
,…,
- 操作
かつ
とすると以下になる.
かつ 
は
(PolynomialRemainder) を法として簡約されて次数
になる.
(
.
)で乗法の逆元
は拡張多項式の最大公約数を使って計算される.
は既約なので,
.したがって,多項式
と
について拡張多項式の最大公約数から
が得られる.
を法として簡約すると
になる.したがって
である.- "Exponential"表現は複素数の極表現
に似た表現で,乗算と除算は簡単だが加算と減算は少々難しくなる. - 表現 "Polynomial"表現におけるように,この表現も次数 d の既約多項式
を使うが,
は原始的でもなければならない.
が原始的なので,
のベキは
の中の
以外のすべての元を表す. -
が乗法について巡回群なので,この表現は巡回群表現としても知られている.- 列挙 元は指数順に列挙される.
,
,
, …,
, …, 
- 操作
かつ
とすると以下になる.
かつ 
- 反転すると
となる.加法と減法については
には
となるような簡単な規則はなく,体のサイズが
で線形な参照テーブルに格納されている.これによってデータ格納という費用はかかるが操作が速くなる.これはまた"Exponential"表現は大きい体には適していないことも意味している. - 表現間の現実的な違いは次の通りである.
- "Polynomial"の作成には時間がかからず,余分なメモリも使わない.大きい体に使えるが操作は若干遅くなる.
- "Exponential"の作成には若干時間がかかり,体の大きさに比例して余分なメモリも必要となる.小さい体に使えて操作は若干速い.
- Information[FiniteField[…], prop]は有限体の特性 prop を与える.次は指定可能な特性である.
-
"Characteristic" 有限体の標数 p "ExtensionDegree"
上の有限体の拡大次数 d"FieldSize" 体の元の数 q=pd "FieldIrreducible" 体の構築に使われた多項式関数 f "ElementRepresentation" "Polynomial"または"Exponential"
例題
すべて開く すべて閉じる例 (2)
ℱ = FiniteField[5, 1]{ℱ[3] + ℱ[4], ℱ[2] ℱ[4]}Factor[2x ^ 2 + 3x + 1, Extension -> ℱ]ℱ = FiniteField[17, 3]{a, b} = {ℱ[{1, 2, 3}], ℱ[123]}(a ^ 2 + 2b) / (5a b - 7)PolynomialRemainder[x ^ 5 - 1, a x ^ 3 + b x + a b, x]スコープ (16)
表現と特性 (4)
ℱ = FiniteField[1009, 3]Information[ℱ, "FieldIrreducible"]Information[ℱ, "ElementRepresentation"]Information[ℱ, {"Characteristic", "ExtensionDegree", "FieldSize"}]ℱ[123] - ℱ[123]ℱ[345] / ℱ[345]f = 2# ^ 4 + 57# ^ 3 + 43 # ^ 2 + 17# - 500&;IrreduciblePolynomialQ[f[x], Modulus -> 509]ℱ = FiniteField[509, f, "Polynomial"]PolynomialMod[Information[ℱ, "FieldIrreducible"][x] - f[x], 509]ℱ = FiniteField[7, 3, "Exponential"]PrimitivePolynomialQ[Information[ℱ, "FieldIrreducible"][x], 7]ℱ[21] - ℱ[21]ℱ[32] / ℱ[32]q = Information[ℱ, "FieldSize"]θ = ℱ[2]And@@Table[ℱ[ind] == θ ^ (ind - 1), {ind, q - 1}]FiniteField[11]% === FiniteField[11, 1]FiniteField[49]% === FiniteField[7, 2]算術操作 (3)
ℱ = FiniteField[3, 6];
{a, b} = {ℱ[123], ℱ[432]}{a + b, a - b, a b, a / b, a ^ 321}{a ^ (1 / 3), Sqrt[a]}Sqrt[b]ℱ = FiniteField[19, 3];
a = ℱ[123]{a + 5, 7a}a + 7 / 8a + 2 / 19Elementを使ってどの有理数が体の元と識別できるかを判定する:
{Element[7 / 8, ℱ], Element[2 / 19, ℱ]}ℱ[0] == 0ℱ[1] == 1ℱ = FiniteField[389, 2];
𝒢 = FiniteField[389, 4];ℱ[123] - 𝒢[123]ℋ = FiniteField[389, Information[ℱ, "FieldIrreducible"], "Exponential"];ℱ[123] - ℋ[123]自己同型と埋込み (2)
ℱ = FiniteField[7, 5];
a = ℱ[123]conj = Table[FrobeniusAutomorphism[a, i], {i, 0, 4}]f = MinimalPolynomial[a]f /@ conjフロベニウス(Frobenius)自己同型は
を
に写像する:
FrobeniusAutomorphism[a] == a ^ 7𝒦 = FiniteField[29, 3];
ℱ = FiniteField[29, 6];
emb = FiniteFieldEmbedding[𝒦, ℱ]emb[𝒦[123]]{a, b} = {𝒦[345], 𝒦[678]};emb[a + b] == emb[a] + emb[b]emb[a b] == emb[a]emb[b]有限体上の多項式 (2)
ℱ = FiniteField[11, 3];
f = ℱ[1]x ^ 2 + ℱ[2]x + ℱ[3];
g = ℱ[12]x ^ 5 + ℱ[21]x + ℱ[33];
h = ℱ[321]x ^ 3 + ℱ[27]x ^ 2 + ℱ[53]x + ℱ[19];fg = Expand[f g]gh = Expand[g h]gcd = PolynomialGCD[fg, gh]Cancel[gcd / g]{q, r} = PolynomialQuotientRemainder[g, h, x]Expand[g - q h - r]Factor[h]Resultant[f, g, x]Expand[(f y + g z)(h z + 1)]Factor[%]Discriminant[f y ^ 2 + g y + h, y]ℱ = FiniteField[29, 3];
f = ℱ[12]x ^ 2 + ℱ[34]x + ℱ[56];Factor[f]𝒢 = FiniteField[29, 6];
ℰ = FiniteFieldEmbedding[ℱ, 𝒢];Factor[f, Extension -> ℰ]有限体上の線形代数 (4)
a = (| | | |
| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {12}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {23}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {5, 1}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {16, 1}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {27, 1}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {9, 2}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {20, 2}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {2, 3}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {3, 3}] |);b = (| | |
| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {7, 4}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {2, 8}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {26, 11}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {21, 15}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {16, 19}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {11, 23}] |);
a.b//MatrixFormMatrixPower[a, 123456789]//MatrixForma = (| | | |
| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {12}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {23}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {5, 1}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {16, 1}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {27, 1}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {9, 2}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {20, 2}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {2, 3}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {3, 3}] |);
Det[a]Inverse[a]//MatrixForm%.a//MatrixFormCharacteristicPolynomial[a, x]CoefficientList[%, x].(MatrixPower[a, #]& /@ Range[0, 3])//MatrixFormc = (| | | | |
| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {16, 13, 1}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {25, 22, 2}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {5, 3, 4}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {14, 12, 5}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {23, 21, 6}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {3, 2, 8}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {2, 11, 9}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {27, 16, 10}] |);MatrixRank[c]NullSpace[c]//MatrixFormc.Transpose[%]//MatrixFormRowReduce[c]//MatrixForma = (| | | |
| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {12}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {23}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {5, 1}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {16, 1}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {27, 1}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {9, 2}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {20, 2}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {2, 3}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {3, 3}] |);b = (| | |
| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {7, 4}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {2, 8}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {26, 11}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {21, 15}] |
| FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {16, 19}] | FiniteFieldElement[FiniteField[29, 2 + 15*#1 + 2*#1^2 + #1^4 & , "Polynomial"], {11, 23}] |);
(x = LinearSolve[a, b])//MatrixForma.x === b{l, u, p, cn} = LUDecomposition[a]l.u === p.a三角行列の効率的な前進および後退代入を用いて解xを再構成する:
x == LinearSolve[u, LinearSolve[l, p.b]]有限体上の方程式 (1)
ℱ = FiniteField[7, 5];Solve[x ^ 5 + ℱ[123]x == ℱ[127], x]Reduce[x ^ 9 + 5 x + 3 == 0, x, ℱ]Solve[ℱ[123]x + ℱ[234]y == ℱ[345] && ℱ[321]x + ℱ[432]y == ℱ[543], {x, y}]Reduce[ℱ[1234]x + ℱ[2345]y + ℱ[3456]z == ℱ[4567] && ℱ[1]x + ℱ[2]y + ℱ[3]z == ℱ[4], {x, y, z}]Solve[x ^ 2 + y ^ 2 == 3 && x ^ 5 + y ^ 5 == 5, {x, y}, ℱ]Reduce[ℱ[123]x ^ 2 + ℱ[234]y ^ 3 + ℱ[345]z ^ 4 == ℱ[456] && ℱ[21]x + ℱ[32]y ^ 2 + ℱ[43]z ^ 3 == ℱ[54] && x y z == ℱ[1], {x, y, z}]FindInstance[x ^ 2 + y ^ 2 + z ^ 2 == 21, {x, y, z}, ℱ]FindInstance[ℱ[321]x ^ 3 + ℱ[432]y ^ 3 + ℱ[543]z ^ 3 == ℱ[654] && x ^ 2 == ℱ[333]y z + ℱ[111], {x, y, z}, 3]Resolve[Exists[z, ℱ[111]x + ℱ[222]y + ℱ[333]z == ℱ[444] && ℱ[555]x + ℱ[666]y + ℱ[777]z == ℱ[888]]]𝒦 = FiniteField[2, 5];Resolve[Exists[{y, z}, 𝒦[1]x ^ 2 + 𝒦[2]y ^ 3 + 𝒦[3]z ^ 4 == 𝒦[4] && 𝒦[5]x ^ 4 + 𝒦[6]y ^ 3 + 𝒦[7]z ^ 2 == 𝒦[8] && x y z != 𝒦[0]]]アプリケーション (8)
エラー訂正コードを実装する.
ハミングコードは
ビットのメッセージを
ビットシーケンスで符号化し,エラーを1つ修正することができる:
m = 5;
n = 2 ^ m - 1;
k = n - m;指数の元表現を使って
を元の数が
の有限体とし,
は
を構築するための既約多項式,
は
の生成元とする:
ℱ = FiniteField[2, m, "Exponential"];
f = Information[ℱ, "FieldIrreducible"][x];
θ = ℱ[{0, 1}]符号化されたメッセージは
の係数リストである.ただし,
の係数リストはもとのメッセージである:
encode[kbits_] := PadRight[Mod[CoefficientList[f(kbits.x ^ Range[0, k - 1]), x], 2], n]msg = Table[RandomInteger[], {k}]enc = encode[msg]t[nbits_, x_] := nbits.x ^ Range[0, n - 1]受信したメッセージにエラーがなければ
であり,したがって
である:
t[enc, θ]受信したメッセージの位置
にエラーが1つ含まれていれば
であり,したがって
である:
err = ReplaceAt[enc, e_ :> 1 - e, RandomInteger[{1, n}]]t[err, θ]correct[nbits_] :=
With[{ep = t[nbits, θ]},
If[ep == 0,
nbits,
ReplaceAt[nbits, e_ :> 1 - e, ep["Index"]]]]correct[err] === encdecode[nbits_] := PadRight[CoefficientList[PolynomialQuotient[nbits.x ^ Range[0, n - 1], f, x, Modulus -> 2], x], k]受信したメッセージのエラーが1つ以下の場合,復号化されたメッセージは正しい:
decode[correct[enc]] === msgdecode[correct[err]] === msg任意の素数ベキ
について,次数
の
直交ラテン方陣を構築する.次数
のラテン方陣は,各行各列が
要素中の各1要素を厳密に1回含む
配列である.2つの配列を並置して構成された
ペアがすべて異なる場合,そのラテン方陣のペアは直交すると言われる:
q = 9;
ℱ = FiniteField[3, 2];
squares = Table[Table[(ℱ[k]ℱ[i - 1] + ℱ[j - 1])["Index"] + 1, {i, q}, {j, q}], {k, q - 1}];
MatrixForm /@ squareslatinQ[a_] := Union[Sort /@ Join[a, Transpose[a]]] === {Range[q]}latinQ /@ squaresorthogonalQ[a_, b_] := Length[Union[Transpose[{Flatten[a], Flatten[b]}]]] == q ^ 2orthogonalQ@@@Subsets[squares, {2}]
のときの総和
がすべてことなっているなら,整数の有限集合
はSidon集合である.
の
個の整数のSidon集合を素数ベキ
について構築する:
sidon[q_] :=
Module[{ff, g},
ff = FiniteField[q ^ 2, "Exponential"];
g = ff[2];Prepend[Select[Range[q ^ 2 - 1], Mod[(g ^ # - g)["Index"] - 1, q + 1] == 0&], 1]]q = 27;
a = sidon[q]Length[a] == qsums = Join@@Table[a[[i]] + a[[j]], {j, q}, {i, j}];Length[sums] == Length[Union[sums]] == q(q + 1) / 2アルファベットの
文字からなる
次のde Bruijn列は,
文字の各の列が
の循環列に厳密に1回現れるようなアルファベットの
文字の循環列
である.
文字のアルファベットの
次de Bruijn列を,素数ベキ
について構築する:
deBruijn[q_, n_] :=
Module[{f1, f2, emb, s, p},
f1 = FiniteField[q, "Exponential"];
f2 = FiniteField[q ^ n, "Exponential"];
emb = FiniteFieldEmbedding[f1, f2];
s = FiniteFieldIndex[emb["Projection"][FromFiniteFieldIndex[Range[q ^ n - 1], f2]]];
p = SequencePosition[s, Table[0, {n - 1}]][[1, 1]];
Insert[s, 0, p]]q = 8;n = 3;
s = deBruijn[q, n]
が
文字のアルファベットについての次数
のde Bruijn列であることを確認する:
Sort[Partition[s, n, 1, 1]] === Tuples[Range[0, q - 1], n]
行列
のすべての成分が
か
で
なら,
はアダマール(Hadamard)行列である.任意の素数ベキ
(
)について次数
のアダマール行列を構築する:
ξ[e_] := If[Head[Sqrt[e]] === FiniteFieldElement, 1, -1]
h[0, _, _] := 1
h[_, 0, _] := 1
h[i_, j_, ff_] := If[i == j, -1, ξ[ff[j - 1] - ff[i - 1]]]q = 7 ^ 3;
ℱ = FiniteField[7, 3];
(H = Table[h[i, j, ℱ], {i, 0, q}, {j, 0, q}])//MatrixPlotUnion[Flatten[H]]H.Transpose[H] === (q + 1)IdentityMatrix[q + 1]高度暗号化標準(AES)アルゴリズムで使われている「Rijndael S-Box Step」を実装する.「Nyberg S-Box」と呼ばれる最初の部分は
における乗法の逆元を使用する:
F256 = FiniteField[2, # ^ 8 + # ^ 4 + # ^ 3 + # + 1&]NybergSbox[byte_] := Piecewise[{{(F256[byte] ^ (-1))["Index"], byte != 0}}, 0]F2 = FiniteField[2];
a = Map[F2, {{1, 0, 0, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 0, 1, 1, 1}, {1, 1, 1, 0, 0, 0, 1, 1}, {1, 1, 1, 1, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 1, 1, 1, 1, 1}}, {2}];
b = F2 /@ {1, 1, 0, 0, 0, 1, 1, 0};
affine[byte_] := FromDigits[Reverse[FiniteFieldIndex[a.Reverse[IntegerDigits[byte, 2, 8]] + b]], 2]ForwardSbox[byte_] := affine[NybergSbox[byte]]tohex[byte_] := StringJoin@@(FromCharacterCode[If[# <= 9, # + 48, # + 87]]& /@ IntegerDigits[byte, 16, 2])Table[tohex[ForwardSbox[16i + j]], {i, 0, 15}, {j, 0, 15}]//MatrixFormainv = Inverse[a];
affineinv[byte_] := FromDigits[Reverse[FiniteFieldIndex[ainv.(Reverse[IntegerDigits[byte, 2, 8]] - b)]], 2]InverseSbox[byte_] := NybergSbox[affineinv[byte]]Table[tohex[InverseSbox[16i + j]], {i, 0, 15}, {j, 0, 15}]//MatrixForm逆S-BoxがForward S-Boxの逆であることを確認する:
(InverseSbox /@ ForwardSbox /@ Range[0, 255]) === Range[0, 255]Diffie–Hellman公開鍵の暗号システムを2049ビットの素数で実装する:
p = 32317006071311007300714876688669951960444102669715484032130345427524655138867890893197201411522913463688717960921898019494119559150490921095088152386448283120630877367300996091750197750389652106796057638384067568276792218642619756161838094338476170470581645852036305042887575891541065808607552399123930385521914333389668342420684974786564569494856176035326322058077805659331026192708460314150258592864177116725943603718461857357598351152301645904403697613233287231227125684710820209725157101726931323469678542580656697935045997268352998638215525166389437335543602135433229604645318478604952148193555853611059596248443;
ℱ = FiniteField[p];g = ℱ[PrimitiveRoot[p]]SeedRandom[1234];a = RandomInteger[{2, p - 2}]g1 = g ^ ab = RandomInteger[{2, p - 2}]2048ビットのメッセージ
を送るために,2番目のユーザは
と
を送る:
m = RandomInteger[{1, 2 ^ 2048}]e = m g1 ^ bg2 = g ^ bd = e / g2 ^ ad["Index"] == mデジタル署名スキームを実装する.素数
を固定して
の原始元
を求める:
p = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224143009;
Zp = FiniteField[p];
g = Zp[PrimitiveRoot[p]]SeedRandom[1234];
h = RandomInteger[{2, p - 1}];
c = g ^ hメッセージ
のための署名は,
となるような
より小さい正の整数のペア
である.署名の計算には秘密の整数
の知識が必要である:
signature[m_] :=
Module[{k, a, b, d, r, s},
k = 2;
While[GCD[k, p - 1] != 1, k++];
{d, {a, b}} = ExtendedGCD[k, p - 1];
r = (g ^ k)["Index"];
s = Mod[a(m - h r), p - 1];
{r, s}]verify[{r_, s_}, m_] := g ^ m == c ^ r Zp[r] ^ sm = RandomInteger[{1, p - 1}];
{r, s} = signature[m]verify[{r, s}, m]特性と関係 (7)
ℱ = FiniteField[7, 10]Information[ℱ, "FieldSize"] == 7 ^ 10ℱ = FiniteField[11, 3];
{a, b} = {ℱ[123], ℱ[456]}{(a + b) ^ 11, a ^ 11 + b ^ 11}したがって,写像
はFrobeniusAutomorphismとして知られる体の自己同型である:
FrobeniusAutomorphism[a] == a ^ 11ℱ = FiniteField[109, 5];
θ = ℱ[{0, 1}]f = Information[ℱ, "FieldIrreducible"]f[θ]FrobeniusAutomorphismを使って
の残りの根を求める:
Table[FrobeniusAutomorphism[θ, k], {k, 4}]f /@ %ℱ = FiniteField[3, 5];
q = Information[ℱ, "FieldSize"]Union[x ^ q - x /. Table[{x -> ℱ[i]}, {i, 0, q - 1}]]Expand[Product[x - ℱ[i], {i, 0, q - 1}]]Coefficient[%, x, 1] == -1
上の次数
の任意の既約多項式は,
個の元がある体で
個の根を持つ:
ℱ = FiniteField[73, 6];
f = 9x ^ 6 + 54x ^ 2 + 42x + 11IrreduciblePolynomialQとModulusp を使って
上における既約性を確かめる:
IrreduciblePolynomialQ[f, Modulus -> 73]FactorとExtensionℱ を使って f が ℱ 上における線形係数の積であることを確かめる:
Factor[f, Extension -> ℱ]FiniteField[p,1]を使って素体
上で計算する:
ℱ = FiniteField[19, 1];ℱ[12] ℱ[7] + ℱ[3]Modの結果と比較する:
Mod[12 7 + 3, 19]Discriminant[ℱ[4]x ^ 3 + ℱ[5]a x + ℱ[11], x]Modulusオプションで得られた結果と比較する:
Discriminant[4x ^ 3 + 5a x + 11, x, Modulus -> 19]ToFiniteFieldを使って整数係数を有限体の素部分体の元に変換する:
ℱ = FiniteField[29, 3];
ToFiniteField[123 + 456x + 789x ^ 2 + x ^ 3, ℱ]FromFiniteFieldは係数を整数に変換し直す:
FromFiniteField[%, ℱ]ToFiniteField[(t ^ 2 + 3t + 11)x + (21t + 12)y + 3t ^ 2 - 11, ℱ, t]有限体の係数を t の多項式に変換する.ただし,t は体の生成元を表す:
FromFiniteField[%, ℱ, t]テキスト
Wolfram Research (2023), FiniteField, Wolfram言語関数, https://reference.wolfram.com/language/ref/FiniteField.html (2024年に更新).
CMS
Wolfram Language. 2023. "FiniteField." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2024. https://reference.wolfram.com/language/ref/FiniteField.html.
APA
Wolfram Language. (2023). FiniteField. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/FiniteField.html
BibTeX
@misc{reference.wolfram_2026_finitefield, author="Wolfram Research", title="{FiniteField}", year="2024", howpublished="\url{https://reference.wolfram.com/language/ref/FiniteField.html}", note=[Accessed: 10-October-2026]}
BibLaTeX
@online{reference.wolfram_2026_finitefield, organization={Wolfram Research}, title={FiniteField}, year={2024}, url={https://reference.wolfram.com/language/ref/FiniteField.html}, note=[Accessed: 10-October-2026]}