閑話「今回のような妨害魔術は、ほぼ一様にランダムに文字を変換させる程度の妨害しかしない。だからシングルトンの限界式をつかってシンボル数の訂正限界を見積もれば、概ねリード・ソロモン符号で訂正できる」


「……ということがあったのさ」


 病室で一部始終を語り終えた俺は、一息ついてから、果物を口にして喉を潤した。とはいえ手が使えないので、あいかわらず誰かに口に運んでもらう必要はあったが。俺がひたすら語るのを、ずっとそばにいて聞いていたアイリーンは、話の最後にはすっかり呆れた顔をしていた。


「へえ……? つまり、お嬢様の胸を触っておいて、透明魔術で脅かしてお漏らしさせて、その後えっちな気分になっちゃう魔術をぶつけたんだ? そりゃリベンジマッチ申し込まれるに決まっているじゃん? 女の子に最低なことしてるって、自覚ある?」


「あれ……? そういうまとめ方されると、俺結構まずいことしてたかも……?」


 いやいやそんな馬鹿な、と自分で改めて振り返る。盗賊に襲われたところを助け出した――という功績がかなり大きな前向き要素だと考えているので気にしてなかったが、結構すごいことをしているような気がしなくもない。

 アテーマからは好意(?)を寄せられているような気がしていたが、半分対抗心を燃やしているようなそぶりがあったのも納得というものである。


「一応言っておくと、星座の話とか、暦の話とか、将来の話とか、いろいろ盛り上がったんだぜ? それに俺は、牢屋に捕まっている彼女を窮地から救ったんだ。女の子をいじめたみたいに扱われるのはちょっと語弊がある」


「ふーん、でも意地悪なことしたんだよね?」


「意地悪はしてないって。濡れ状態の定義をお話しただけだよ。しかも申し訳ないことに、厳密な議論ができないまま終わってしまった」


 アイリーンからの冷ややかな目線を感じたが、それはひとまず置いておくとして。

 この件で俺がもやもやした気持ちを抱いているのは、より厳密な濡れ状態の議論――Lucas-Washburn式に基づく毛管吸収の議論をできなかったことが原因である。


 これは、ヤングの式のように接触角ではなく、浸透速度法を使った経過時間毎の浸透力を計算する考え方である。浸透速度をハーゲン・ポアズイユの法則を使って変形し、濡れ上がり距離の変化分(dh)がゼロとなる平衡点を十分濡れきった状態である、とする。

 つまりまだ水分を吸うことができる状態ならセーフ、これ以上水分を吸収できない段階まで漏らしたらアウト、という簡明な考え方であった。


 今回のケースは非圧縮性ニュートン流体なのでこのハーゲン・ポアズイユの式を当てはめられる――というところまで説明したところで、アイリーンから「その話をしてたら多分殺されてたと思うよ?」という辛辣なコメントが飛んできた。

 中々手厳しい。


「なんだよ、とか言ってアイリーンは数式に興味津々じゃないか」


「そりゃあさ、今までの魔術理論とは全然毛色が違う話だから、興味深いんだけどさあ……それはさておき、アテーマちゃんには同情するよ?」


 果物を俺の口に運んでくれるアイリーンの手から、桃の肉を慎重に取る。こういう柔らかい果実を食べるとき、口しか使えないのは中々不便だ。


「なんだよ、お前の手も濡れてる状態なのにさ」


「ひゃっ」


 ふといたずら心が湧いて、肉球のようになっている部分を甘く噛んでみる。指をなめると、桃の甘い味がした。全く脈絡もないが、毛が濡れるから果物を剥くのは嫌だ、とかアイリーンがいつぞやか言っていたのを思い出した。


「……ねえ、やっぱり君って悪い男だよね」


「?」


 倫理の話だろうか。悪い男というのが分からない。

 ノーブ効果、ピグマリオン効果、バンドワゴン効果、ハロー効果、クレショフ効果――とにかく人の心は不確定で善悪つけにくい、何が説明変数なのかよくわからない、謎に満ちたものだ。俺は俺自身への言及が苦手だ。

 口元をもにょもにょさせているアイリーンの苦言を受けて、俺は何を返せばいいのか分からないまま、あいまいにほほ笑むだけにとどめた。






 ◇◇






「アイリーンが聞きたかったのは、あの謎の指輪をどうやって乗り越えたか――魔術妨害への対策だろ?」


「! そう、それ! 私その話ずっと気になってた!」


 途端にアイリーンの目が好奇に輝いた。学びに貪欲な彼女は、こういった不思議な理論に心惹かれる傾向にあった。


 術式の妨害――それは初めてアイリーンとアネモイに出会ったときに見せた、俺の独自魔術アプリケーションの一つでもある。

 あの指輪も、原理は異なるが効果は似たようなものだ。

 相手が魔術を発動しようとして術式を構築しているその途中段階で、意味性の一部を破壊することで魔術の成立を妨害する。意味の整合性を欠損し、術者が適切に解釈できなくなった術式は、文脈を編むことができずに途中で破棄されてしまうのだ。


「ね、ね、ね、術式の妨害って、特別な才能がなくても出来るんだよね?」


「ん? まあそうだが……もしかして魔術の安定化だけじゃなくて、妨害魔術のほうにも興味があるのか?」


「もちろんだよ、どっちも知りたい。物語や知識はあらゆる可能性を教えてくれるから、私はあらゆる全てに興味があるの」


「気が合うね、俺も一緒さ。魔術に関してはね」


 鼻をふすふす鳴らして息巻いているアイリーンを見ていると、こちらもちょっと嬉しくなる。同好の士というやつだろう。いつだって魔術の探求は心躍るものである。仲間と一緒ならなおのことだ。


 話を戻すと、あの指輪の魔術妨害は、あくまで部分的な作用であった。


 後でゆっくり調べてみたところ、何から何までをごちゃごちゃにするのではなく、使用頻度の高そうな文字を無意味な文字に置き換えたり、一定の長さを超えた呪文についてランダムな一部を無意味な文字に置き換えたりする効果があった。

 少ない魔力の持ち主でも、指輪を使って術式妨害できるような工夫を凝らした結果、こうなったらしい。簡易で強力な工夫だが、誤り検出がしやすいという側面があるので対策がしやすかった。


「術式の妨害手段は複数あるが、たとえば有名なものだと詠唱阻害、呪文改ざん、魔法陣破壊などがある。大まかには二つに分けられて、術式の起動から定常状態までの立ち上がりの間に系に外乱を与えるタイプと、系に外因的な項を追加して不安定化させるタイプがある」


 アマゾネスの盗賊たちが持っていたあの魔道具の指輪は、両方の性質を持つものの基本的には前者の要素が強い。一方で、俺の妨害魔術は後者である。不安定な極を追加して不安定化させるだけ。妨害の原理が違う、といったのはこのことである。


「ね、ね、ね、その二つの妨害魔術の作り方なんだけどさ、それって原理としては――」


「おっと、それはまた今度だ。今日は妨害魔術を受けたときどうやってそれを復元するか、というお話だ」


「ぶう、いけずめ」


 どうせなら両方一気に教えてくれ、とばかりにアイリーンが口をとがらせていた。俺としては別に両方教えてもいい。だがそれでは、アイリーンが昼からの授業に間に合わなくなってしまう。


 また今度な、と彼女をなだめつつも話を続ける。




 今回のようなタイプの妨害からの術式復元であれば、リード・ソロモン符号を使って誤り訂正を行えばいい。


 大雑把に言えば、まずはリード・ソロモン符号をガロア体で生成し、送りたい情報を符号化した情報多項式、および生成多項式を作ってそれを"術式設計図"とする。

 形相に質料を流し込む――その術式を"投影出力する"際に、ピーターソン法を用いて、誤りを含むシンボルの数、誤りを含むシンボルの位置を計算して補正多項式を足し合わせ、エラーを訂正する。

 この二段階の操作で、誤りの訂正が実行できるのだった。


 リード・ソロモン符号では、まず連続するrビットを一つのシンボルとする。rビットの連続した固まりを一つのシンボルとして、N個のシンボルをひとまとまりの符号語とする――N個のうちK個のシンボルが実質的に送付できる情報で、残りの (N-K)個のシンボルが後述する符号化で生成される冗長シンボルとなる。


 一つのシンボルを構成するrビットの組み合わせパターンは2^r個なので、シンボルは全部で2^r種類存在することになる。


 一般によく用いられるリード・ソロモン符号のシンボルは、8ビットであるため、シンボルへの変換は2^8個 = 256個の元をそろえる必要がある。

 2^8個の元を作るには、8次の原始多項式から拡大ガロア体を定義する。


 原始多項式は複数ある(オイラーのトーシェント関数φをつかって、合計でφ(2^n -1)/n個と表せる)が、ここでは代表的な例として

 x^8⊕x^4⊕x^3⊕x^2⊕x^0 =0

 を置く(排他的論理和を⊕としてある)。


 方程式の根をαとおくと、

 α^8⊕α^4⊕α^3⊕α^2⊕α^0 =0

 となるため、

 α^8 = α^4⊕α^3⊕α^2⊕α^0

 となる。


 これを利用して、αのべき乗とビットの表現を以下に対応させる。

 α^0 = 1 ⇔ 00000001

 α^1 ⇔ 00000010

 α^2 ⇔ 00000100

 ……

 α^7 ⇔ 10000000

 α^8 = α^4⊕α^3⊕α^2⊕α^0 ⇔ 00011101

(※αのべき乗が増えるとビットが一つずれて、α^8で一回巡回するイメージになる)


 これにより、α^0~α^254までの255個を重なりなく表現することができる。0 ⇔ 00000000を加えると元はこれで256個そろう。


 次に、送る情報K×rビットを符号化する。

 K×rビットをシンボル化することで、K-1次の多項式I(x)が生成される(これを情報多項式という)。


 ここから、訂正したいシンボル数をもとにして生成多項式を作る。生成多項式は、訂正したいシンボル数tと適当な整数bで

 G(x) = (x - α^b)・(x - α^(b+1) )・…・(x - α^(2t+b-1))

 で作ることができる。簡便のためb=0、t=2とすれば

 G(x) = (x - α^0)(x - α^1)(x - α^2)(x - α^3)

 である。


 最終的に送付する符号語C(x)は、x^(N-K) × I(x)と、x^(N-K) × I(x)のmodをG(x)で計算したもの(除算の余り)を足し合わせたものになる。

 式で表すと、

 C(x) = x^(N-K) × I(x) + P(x)(ただしP(x)≡x^(N-K) × I(x) mod G(x))

 となる。


 この符号語C(x)が一部情報を改変されたとして、Y(x)になったとする。複号の際は、誤りE(x)を以下のように考慮する。

 Y(x) = C(x) + E(x)

 C(x) が G(x) で割り切れるので、G(x)の根を代入して計算する。

 今回はG(x) = (x - α^0)(x - α^1)(x - α^2)(x - α^3)より、根がα^0、α^1、α^2、α^3ですぐに求まるのでこれを代入する。


 このようにY(x)のxに根を代入してゼロとならないものを見つける行為をシンドロームの算出という。

 S_i = Y( α^(i+b-1) )

 今回は簡便のためb=0なので、S_i = Y( α^(i-1) )である。


 そして、シンドロームS_iを並べた行列式から誤りの数を推定する。


 たとえば、誤りの数が2つであると推定すれば、以下の行列式を作って

 | S_2 S_1 |

 | S_3 S_2 |

 これがゼロに一致するかを確かめる。上記の行列式がゼロのときは誤り数が2である。


 誤りの数が3つだと推定したならば同様に

 | S_3 S_2 S_1 |

 | S_4 S_3 S_2 |

 | S_5 S_4 S_3 |

 がゼロになるかを計算で確かめる。


 誤りの数jを計算で求めた後は、シンドロームS_iから生成した以下の誤り位置多項式σ(x)を計算する。

 σ(x) = 1 + σ_1 × x^1 + σ_2 × x^2 + σ_3 × x^3 + … + σ_j × x^j


 σ(x)にα^0からα^(N-2)までを代入したとき、必ずj箇所でσ(x) = 0となるので、その時の根の逆元が誤りのある位置となる。


 誤りの位置検出の結果、次数m_1, ... , m_jに誤りがあったとすると、シンドロームを使って以下の連立方程式を置くことができる。


 α^(m_1 × b) e_1 + α^(m_2 × b) e_2 + … + α^(m_j × b) e_j = S_1

 α^(m_1 × (b+1)) e_1 + α^(m_2 × (b+1)) e_2 + … + α^(m_j × (b+1)) e_j = S_2

 ……


 連立方程式を解いて、e_1, e_2, …… , e_jを求めた後、

 C(x) = Y(x) - E(x) = Y(x) + x^m_1 e_1 + x^m_2 e_2 + … + x^m_j e_j

 とすることで誤りが復元できる。これがピーターソン法による復元である。




「うーん、オイラーのトーシェント関数とかはよくわかんないんだけど……」


 ちんぷんかんぷん、とばかりに眉間にしわを寄せたアイリーンは、そのままゆっくりと、かみ砕くように言葉をつづけた。


「送りたい情報があって、それをビット列に変換するんだよね。

 で、ビット列を最大8ビットでひとまとまりにしたいときは、1シンボルという単位でくくってあげるんだよね。

 1シンボルを構成する8ビットは、2^8 = 256個の組み合わせパターンがあるから、αを使って代数的に表現するなら256個の元を用意する必要があって、それは8次の原始多項式とガロア体をつかったら操作的に見つかりますよ、ということかな」


「そういうことだ。だから別に1シンボルの元を代数的に求めなくてもいいんだけど、符号化したあとの符号語C(x)にα~α^254を代入したら0になる、という性質が誤り検出の際に非常に楽だからこんな風に計算してある」


 アイリーンのまとめ方はかなりシンプル化されていて、個人的には好感を覚えた。


 改めてまとめなおしになるが、情報シンボル数K(符号化を行う情報の単位で、K×8ビット)および訂正シンボル数t(誤り訂正可能なシンボル数)から、符号シンボル数Nは以下のように自動的に決まる。


 N = K+2×t

(符号化で生成される冗長シンボルは2tに等しい)


 あとは送る情報量Kと誤り訂正の可能なシンボル数tについて、シングルトン限界を使って計算すれば事足りる話だ。


「今回のような妨害魔術は、ほぼ一様にランダムに文字を変換させる程度の妨害しかしない。だからシングルトンの限界式をつかってシンボル数の訂正限界を見積もれば、概ねリード・ソロモン符号で訂正できる」


「……へえ、だから君は、魔術を妨害する指輪があってもその影響を殆ど受けずに自由に魔術が使えたんだね」


 感心したようにうなずくアイリーンに、俺は一言だけ補足をいれた。

 ここまで延々と議論してきたことを覆すような、少々申し上げにくい事実だが、きちんと伝えないといけないだろう。


「……実は、この話にはオチがあってだな」


「え? なんかあるの? 見落としてた?」


「符号化した俺の術式処理速度が速すぎてだな、指輪の呪術妨害が間に合わずにそのまんま魔術アプリケーションが発動できてしまったんだ。……だから、今回はぶっちゃけそんなにリード・ソロモン符号を有効活用できてない」


「えっ」


 虚を突かれたのか、間抜けな表情をしたアイリーンの手元が狂い、びゅっ、とミカンの汁が俺と彼女の顔にかかった。






 ◇◇






 その後、果汁で顔がべたつくといけない、ということで風呂に入ることになったのは御存じの通りである。

 それは秋風がさらさらと木の枝葉をゆらすころの出来事であった。

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る