秘密計算百合
※これは百合SS Advent Calendar 2017の5日目として書かれた文章です。 PEZを用いた秘密計算についてご教授頂きました、品川様に謝辞を申し上げます。 adventar.org
背景
「秘密計算をしましょう」
と、先輩は提案した。
秘密計算。当然ながら私にとっては聞きなれない単語だ。
部活に励む高校生も、帰宅を始めるであろう逢魔が時 ―― ブラインドから漏れ出した黄昏は、私と先輩、私達女子数学部員の表情に縞々を浮かびあげていた。
私は椅子に腰掛けながら読書に一念していたが、どうやら先程から先輩は、隣の机に腰掛けながら暇を持て余していたらしい。
「秘密計算……ですか?」
私は読みかけのページを開いたまま、視線だけ先輩の方に向けた。
「そう、秘密計算」
「何ですか、それは?」
「またの名をマルチパーテーコンピュテェション」
先輩が任意の専門用語を英語で言い換えた時は、大概の場合口が回らなくてカタカナ英語になっている。 こういうところは普段の大人ぶった態度に反し、年相応で可愛いらしい。
「例えば秘密投票。自分が誰に票を投じたという情報を秘密にしたまま、最終的に何票集まったかという結果だけが公開される。これもある意味では秘密計算の一種よ」
「へぇ」
「このように参加者が自分の入力を秘密にしたまま、各参加者の入力同士で計算処理を行い、最終的に何らかの計算結果を共有する。これが秘密計算」
「それをこれからやるんですか?」
「その通り」
「2人で?」
「そう、たった2人で」
人差し指をピッと立ててから喋る先輩のクセは、さいとう・たかを作品から影響を受けたのだろうか。
「これからうら若き乙女2人が放課後の教室で、自身の秘めたる思いを相手に明かすこと無く秘密計算に明け暮れるの。 それって青春の1ページとして、とても素敵な事だとは思わない?」
「別に」
「でしょ…………えっ?」
「……」
「……」
「……分かりましたよ。先輩のいつもの思いつきだったら、いくらでも付き合ってあげますから」
「本当に?」
「ええ」
ちょっと意地悪をしてから優しくしてやると、先輩はすぐに取り上げられたおもちゃが返って来たような表情を浮かべる。 思春期を迎えたウチの妹よりも反応が分かりやすい。
それから先輩は何事もなかったかのように、表情筋をいつものクールなそれに戻した。
「それじゃあ順々に定義していくわね」
そう言いながら先輩は、ホワイトボードに残留する数式の死骸を喜々として消し始めた。
定義
「まず肝となる秘密計算を行うツールね。本来は大規模な計算サーバだったり、特殊な暗号技術が必要だったりするんだけども、 実はANDとOR程度の簡易な計算でよければ、身近な物でも秘密計算を実現できるの」
「一体どうやるんですか?」
「これを使うの」
そういって先輩は鞄から棒状の物体を取り出し、私の目の前に掲げた。 その先端には気味の悪い生物の生首が取り付けられている。
「何ですか、これ?」
「何って、ジャー・ジャー・ビンクスのPEZよ」
「ジャージャーって?」
「貴女ジャー・ジャー・ビンクスを知らないの?スター・ウォーズに登場する愛され不人気キャラよ。私は大好きだけど」
「じゃあペッツは?」
「PEZはキャンディー菓子。このディスペンサー(容器)のヘッドにはありとあらゆる人気キャラクターの頭部が取り付けられているんだけど、 スター・ウォーズの登場人物にちなんだものも数多く存在するわ。 これはこの前ビレバンで買ってきたの」
「ヴィレヴァンですか」
「こうやってPEZ後ろの首根っこのところを押し出してやると……」
ジャージャーなる生物の生首が後ろにもげ、中からキャンディー菓子が1つ姿を表した。
「うへぇ、ぶっさいく」
「こうやって1回押すと、1個だけキャンディー菓子を取り出す操作ができるの。逆にキャンディー菓子を押し込んで容器に入れることも可能だわ」
「なるほど」
「この性質からPEZは、外部に中身を見せない【スタック】を構成している事が分かるかしら」
「スタック?」
「そうね……簡単に言うと『物を取り出す時、最後に入れたものが最初に出てくるような入れ物』のこと」
「あんまり馴染みがないですね」
「そんな事はないわ。例えば洗濯物のカゴを思い出してみて頂戴。 洗濯物を取り出そうとすると、必ず最後に入れた洗濯物が最初に出てくるじゃない。 あれもスタックよ」
「あっ、確かに……」
「一般にスタックにはものを詰める【プッシュ】と、ものを取り出す【ポップ】という2つの操作が存在するわ。 PEZで考えると『キャンディー菓子1つを容器に押し戻す操作』がプッシュ、『キャンディー菓子1つを取り出す操作』がポップ。 実際に触って動作を確認してみると理解が深まるわ。さん、ハイ」
「プッシュ、ポップ、プッシュ、ポップ……」
「今回の秘密計算プロトコルは、この中身を見ることができないスタックを用いて構成するわ。さて、次にキャンディー菓子ね」
そう言って先輩はPEZから取り出したキャンディー菓子を1つ拾い上げると、そいつの表面全体を舌先でペロリ、と妙に艶かしくなぞった。
「せっ、先輩……?」
「あぁ、これはキャンディー菓子にビット情報を付加したの。舐められて表面がボロボロになったキャンディー菓子を1、そうでないキャンディー菓子を0と定義するわ」
「何で舐めたんですか?」
「印がつけば何でもよかったわよ。かと言ってマーカーで印なんか点けたら後で食べられないじゃない。もったいないわ」
「先輩が舐めたキャンディー菓子は、可食の部類に含めるんですか?」
「さて、これで秘密計算をする準備が整ったわよ」
スルーされてしまった。
論理積演算
先輩はPEZの中身を一旦空にし、0と1に対応するキャンディー菓子をお菓子の受け皿の上に並べた。
「ではまずANDの計算プロトコルを実行しましょう」
「アンド?」
「論理積の事。つまり貴女と私が1を入力した場合のみに限って、結果として1を出力するような演算よ」
「1かける1は1、ってことですね」
「いかにも。じゃあまずは事前準備ね。中身が空のPEZに1のキャンディー菓子を1個プッシュしてから、0のキャンディー菓子を参加者の数、つまり2個プッシュする。 そうするとPEZの中身はどのように表現されるかしら?」
「えっと、先頭を頭の方として[0, 0, 1]ってことですか?」
「イグザクトリィ」
先輩のこういうところは、たまにイラッとする。
「ではお互いのアクションについて説明するわ。 まずYes/Noで答えられるような質問を2人で共有する。 この場合はYesが1、Noが0に対応すると考えて」
「ふむふむ」
「次に私は貴女にPEZを見られないよう隠したまま
『質問内容についてYesならば1回ポップ、Noならば何もしない』
を実行し、その後PEZを貴女に渡して同じ事を実行する」
「ふむ」
「これでプロトコルは終了よ」
「なんと、あっという間ですね」
「そう、秘密計算はあっという間に終わるの。最後に1回ポップして、その出力が演算結果ということになるわ」
「本当に計算されてるんですか?」
「頭のなかで考えてみればいいじゃない。貴女も数学部員なんだから」
「ええっと、どちらもポップした場合PEZの中身は[1]になるから、最後の出力は1。どちらかがポップしなかったらまだ頭に0が残ってるんで、最後の出力は0。 ……あ、確かに上手いこと計算されてますね」
「そうなの。上手いことできてるのよ。じゃあ実際にやってみましょ。質問内容は……そうね。せっかく秘密計算なんだし、題材は恋バナにしましょう」
「え?恋バナ?」
自称硬派気取りの先輩の口からそういった単語が飛び出すのは意外だった。
「そうね、『想い人が居るか否か』なんていうのはどうかしら。別にプロトコルの練習だから正直に答えなくてもいいわよ」
「先輩って意外と乙女ですよね」
「秘密計算は女の子を少しだけ大胆にするツールなのよ。さ、まずは私から操作させてもらうわ」
先輩は何らかの操作を実行した後、私にPEZを投げて寄越した。 質問内容は想い人が存在するかどうか。 正直に答えてもそうでなくてもいいとは思うが、せっかくなので私は面白い方の答えを選んだ。
「では結果を出力しましょう」
先輩がPEZをポップすると、表面のざらついたキャンディー菓子が零れ落ちた。
「……」
「……」
「つまりは、そういうことね。へぇ、ふぅん、そう、意外ね。貴女にそんな相手がいるなんてね」
「先輩だってお互い様じゃないですか。っていうよりこれじゃ、秘密計算の意味無いじゃないですか」
「じゃあ次はORの計算ね」
「無視しないでくださいよ、先輩」
論理和演算
「貴方は授業でド・モルガンの法則を勉強したかしら」
「確か数学Aで少し齧りましたね」
「じゃあ問題ないわ。 と が等価である性質を、先程のANDの計算プロトコルにそのまま当てはめれば完成よ」
「……つまり?」
「PEZへの初期入力として0, 1, 1の順でキャンディー菓子をプッシュして、各参加者の行動は
『質問内容についてYesならば何もしない、Noならば1回ポップ』
とすれば、先程と同様にしてORが計算できるわ」
「うーん、まぁ確かに多分上手くいきそうな気持ちはありますね」
「じゃ、早速やってみましょ。質問内容は……」
「先輩、待ってください」
「何かしら」
「その質問内容、私に考えさせてくれませんか?」
「えっ……ま、まぁいいけど」
「そうですね、題材が恋バナですからね。……こういうのはどうですか?『自分の想い人はこの部屋に居る』」
先輩の表情が僅かに変化したのを、私は見逃さなかった。
「どうしたんですか?ちゃんとYes/Noで答えられますよね。あ、別に正直に答えなくてもいいんでしたっけ」
「え、ええ、そうね、それでいきましょう。じゃあ私からね」
見るからに先輩の視線はおぼつかないし、顎を人差し指の腹で何度もなぞり始めている。
何故彼女が突如秘密計算を提案し、不慣れにも乙女の会話を始めてしまったのか? 私には早くも答えが分かり始めてきた。
「どうぞ」
先程よりも熟考していた様子が、手渡されたPEZの手汗からうかがえる。 だが私の入力、というより行動は既に決まっていた。
「それじゃあ、結果を出力しましょう」
私がそのままPEZをポップすると、表面のツルツルとしたキャンディー菓子が零れ落ちた。
「っ!?馬鹿な……っ!」
「……先輩。今『馬鹿な』、って言いましたよね?」
「うっ……」
「先輩は質問に対しYesの行動を実行した。なので出力結果は必ず1になるはず。そういう驚きですよね?」
「そうか貴女……わざと2回ポップしたのね……!まさかこの短時間で、相手の入力を探るためにマリシャスな手段を思いつくとは……」
「もっと褒めてもいいんですよ、先輩」
先輩を一枚出し抜いた、という優越感は最高の快楽だ。
「さて、そうなると先輩は質問に対してYesを選択しましたね。どうしてですか?」
「い、言ったじゃない。質問に対してなら別に正直に答えても答えなくても……」
「いいえ、理由は明白。何故なら貴女は私の答えに確信を持てなかったから」
「ぐっ……」
「仮に先輩がNoを選択し、私がNoを選択してしまうと、先程のようにどちらもNoを選択したという情報が両者に共有されてしまいます。 これは私への恋愛感情を悟って欲しいと願っている先輩にとって不利益ですし、何より私から先輩に対する恋愛感情の有無が明白になってしまうんです。 いくら真贋を問わない質問だとしても、白黒がはっきりしてしまう事態だけは避けたい。真実から目を背けたかった。 だから先輩は私の選択に依存せず、出力が1となるようなYesを選んだ。どうですか?」
「えぇ、そうね、そうよ、その通り……」
手の内を晒され、しかも恋慕の情までもが公に晒されてしまった先輩はもはや見る影もない。 彼女は一見涼やかさを装っては居るが、顔を背け、視線を逸し、頬は赤み、しきりに冷や汗をハンカチで拭き取っている。
私は立ち上がり、改めて先輩に向かい合った。
「それじゃ、次の質問です」
「次も何も、プロトコルはもうこれで……」
「先輩は、私が何故2回ポップしたか分かりますか?」
「何故、って……」
「私もです」
「え?」
「私も、先輩の今の考えが知りたかったからです」
そう言って私は先輩の顎に右手をそっと添え、少し強引に引き寄せてから、自身の唇をその柔らかな頬に吸い寄せた。
参考文献
- Jozsef Balogh, Janos A. Csirik, Yuval Ishai, Eyal Kushilevitz, Private computation using a PEZ dispenser, Theoretical Computer Science Volume 306, Issues 1–3, 5 September 2003, Pages 69-84 http://www.sciencedirect.com/science/article/pii/S030439750300210X