昨年公開され12月にDVDになった劇場版アニメ「コードギアス 復活のルルーシュ」で、数式が出てくる部分で少し協力させていただきました。エンドロールでも名前が出ました↓
SF業界の人脈を通じ、アニメーションの設定考証などをなさっている白土晴一さん(エンドロールにも出てらっしゃいます)から、このお話を依頼されました。
天才キャラがノートPCでカタカタやってて、それがなにかというと「暇つぶしにP≠NP問題を解こうとしている」という設定で、その画面というお話でした。うはー。無理。数学屋じゃないですし。
なんか適当な論文をキャプって、とか考えましたが、著作権もあるしそれも難しいことが分かりました。うーむ。
で、最初は「無理っす」とお返事したんですが、何日か通勤電車でぼんやり考えて、「量子コンピュータを使って逆にP=NPを示そうとしてることにすれば、それっぽいもの作れるかも」と思い至り、それでお返事しました。あることが「できない」証明というのはとても難しいですが、「できる」証明というのは一つだけやり方を示せばそれで終わりです。具体的には、「NP完全問題」と呼ばれる、解くのにすげー時間かかる問題のうち、一番やりやすい問題について高速に解くアルゴリズムを見つければ、それを使ってすべてのNP完全問題を高速に解けるので、そのアルゴリズムを書いてる、ということにすればいいな、ということです。
一般的に、「一番やりやすい」問題は、3-SAT問題という、充足可能問題がターゲットにされることが多いです。「真」か「偽」かの値をとる変数がたくさんあって、さらにそれらを AND や ORでたくさんつなげた命題がたくさんある場合に、全ての命題を「真」にするような変数の値はあるや、なしや、という問題です。今のところ、全て総当たりでやるしか方法は見つかっていません。
で、イーガンのSFとかでよく出てくるんですが、多世界に量子的に倍々に分岐してそれぞれでそれぞれの場合を計算し、最後にうまくいった分岐が観測されて出てくるという、実際には相当難しいけどできなくはないかもしれない、という筋にしてみました。それぞれの分岐で計算する、てのはまあ簡単ですが、うまくいったのだけを選ぶ、てのが超絶技巧を必要とするわけで、ショアのアルゴリズムによる因数分解とか、天才じゃないと思いつかない話です。でもやってるキャラが天才という設定だから、ちょうどいいわけで。
というわけで作ってみたのが以下の画面
「それぞれの分岐で計算する」をやってる部分になります。後半の「うまくいったのだけを選ぶ」についてはガン無視。とはいえ、単純な論理演算でも量子コンピュータでやろうとすると色々面倒で、たとえばビットをコピーするということができません。"no-cloning theorem"と呼ばれている制約です。充足可能問題では一つの変数が複数の命題に現れるので、コピーが必要になります。そのへんを余分なビットを用意してゴチャゴチャとやってる、というようなことをやってるコードになります。言語はCとかそのへんを想定してます。なので「//」で始まる部分はすべてコメントで、数式がコメントとして記述してあります。で細かい面倒な部分はすでにサブルーチンで組んであって、それを呼んでいるというコードです。
もっと基本的な量子ゲートに関しては、冒頭でオープンソースのライブラリを読み込んでいるという設定です。
DVDをサンライズ様からご恵贈いただきましたが、家のプレイヤーが古くてまだ再生できません。あう。
内容のほうはチケットをご恵贈いただいて映画館で観ました。アマゾンプライムで予習しつつ。ストーリーの核となるアイディアがすごく好みだったので面白かったです。