# パズル感覚で楽しむ量子回路(解答編) ※この記事は[茨大 Advent Calender 2020](https://adventar.org/calendars/5043) 16日目の記事です。 <br/> <br/>**皆様、お待たせいたしました!** 全世界待望の「パズル感覚で楽しむ量子回路」の答え合わせのお時間がやって参りました。 なにその記事、まだ読んでないよって方は[こちらのリンク](https://hackmd.io/@man-in-pajamas-of-prisoner/Bk5TKfyhD)からどうぞ。 <br/> <br/>…んん?そちらの方は? 何? <span style="font-size: 150%;"><strong>「読んだけど解くの面倒だから答えだけ教えろ」</strong></span> …ですって?? <br/> <br/>……うん。だよね。 まぁ、ここに書く解答例で実際に機能するかどうか、もしよろしければ後で確認してみてくださいませ。 </br> ## お題のおさらい <center> <img src="https://i.imgur.com/JE8ZeKv.png" height="500mm"> </center> </br>この置換表に従って、入力X(4ビット)に対応する出力P(4ビット)を、出力用のビットに格納する量子回路を作れというのがお題でした。 使う道具は「CNOTゲート」と「CCNOTゲート」と「Xゲート」の3つ。 ゲートの役割をよく理解し、入力の状態を操作するテクニックを用いることで、 <center> <img src="https://i.imgur.com/4gLG2Pa.png" width="800mm"> </center> </br>使用するビット数を抑えつつ、回路(の一部)を構成できるということを書きました。前回は*p1*の回路を作りましたので、この回答編では*p2*~*p4*のそれぞれの場合について考えてみましょう。 </br> ## 解答例 * ***p2*の場合** <center> <img src="https://i.imgur.com/CvsxIpv.png" width="800mm"> </center></br> * ***p3*の場合** <center> <img src="https://i.imgur.com/H1hWrXr.png" width="800mm"> </center></br> * ***p4*の場合** <center> <img src="https://i.imgur.com/SzzqH0l.png" width="800mm"></center></br> </br>**多分これらが一番楽だと思います。** CCNOTゲートとXゲートだけで作れました。それでも回路図がカツカツだぁ…。 使うゲートの数で言うと、多分…上に挙げた回路で最適化できているんじゃないかと。 正解は1つだけではないので、CNOTゲートと組み合わせた方もいると思います。ひとまず通したいものだけがきちんと通っていれば大丈夫です。 え、解答例よりもっと楽な方法が見つかったって? ……そんな方はコッソリ教えていただけると助かります。 </br> ## よくわかる解説 ### *p2*の前半 <center> <img src="https://i.imgur.com/bltXr9B.png" width="800mm"></center> </br>考えるのは**入力{"0000","0001","0100","0111"}の4パターン**。 既に白玉の行が1つできていますから、もう1行作れそうなところを見ますと、"0111"の*x3*が白玉になればよさそうだと分かります。 なので、青枠で囲ったCCNOTゲートを置いて3行目を白玉の行にした後、*x1*と*x3*を制御ビットとするCCNOTゲートで*p2*を反転させればOKとなります。 </br> ### *p2*の後半 <center> <img src="https://i.imgur.com/cboP7K9.png" width="800mm"> </center> </br>考えるのは**入力{"1000","1001","1100","1110"}の4パターン**。 状態を変化させて黒玉、または白玉の行を作れそうな候補は3行目と4行目ですが、"1110"の*x3*を白玉にしようとCCNOTゲートを置いても、"1001"の*x4*をやはり白玉にしようとCCNOTゲートを置いても、他のパターンが邪魔をしてしまいます。 そんな時でも大丈夫。考え方としては、「**CCNOTゲートを2個使って、1個目のゲートで対象を絞り込んでから2個目のゲートで白玉の行を作る**」というものです。 <center> <img src="https://i.imgur.com/iCaprM6.png" width="800mm"> </center> </br>まず、青枠で囲ったCCNOTゲートを置きます。すると、この条件に合致するパターンは"1001"のみなので、"1001"の*x3*が反転します。 <center> <img src="https://i.imgur.com/vDc5wlV.png" width="800mm"> </center> </br>上図は反転後のイメージです。さて、これで**各パターンの*x2*と*x3*の組がバラバラになった**ことに気がつきましたか?これが「対象の絞り込み」です。 後は、下図の緑枠で囲ったCCNOTゲートを置けば… <center> <img src="https://i.imgur.com/2GxOl9b.png" width="800mm"> </center> </br>これで4行目がすべて白玉になったので、*x1*と*x4*を制御ビットとするCCNOTゲートで*p2*を反転させましょう。 後は、前半と後半(**各パートの処理後に入力を元に戻すゲートを付けるのを忘れずに**)を合体させれば、*p2*の回路が完成となります。 </br> ### *p3*の前半 <center> <img src="https://i.imgur.com/jInfzlL.png" width="800mm"> </center> </br>考えるのは**入力{"0000","0101","0111","1001"}の4パターン**。 一番考えることが多いパートですが、*p2*でやったことをそのまま適用できるので問題ありません。 見た感じだと1行目と3行目を白玉の行にできそうなので、どんなゲートを置けばいいのか考えてみます。 <center> <img src="https://i.imgur.com/WW1ezhF.png" width="800mm"> </center> </br>まずは分かりやすいところから、1行目を白玉の行にしましょう。 青枠で囲ったCCNOTゲートを置いて、"1001"の*x1*を白玉に反転させます。 <center> <img src="https://i.imgur.com/453CNtr.png" width="800mm"> </center> </br>続いて緑枠のCCNOTゲート。これを置くと、"0101"の*x4*だけが白玉に反転します。そうすると**各パターンの*x2*と*x4*の組がバラバラになる**ので、下準備はこれでOK。 <center> <img src="https://i.imgur.com/UCQwrHu.png" width="800mm"> </center> </br>赤枠で囲ったCCNOTゲートを置いた後に、*x1*と*x3*を制御ビットとするCCNOTゲートで*p3*を反転させれば、前半の処理は完了です。 </br> ### *p3*の後半 </br>実のところ、***p3*の前半まで終われば後はウイニングランみたいなもの**です。 追加で解説しないといけない要素はないし、ゲートもそんなに置かずにクリアできるし。 <center> <img src="https://i.imgur.com/DhCCbWB.png" width="800mm"> </center> </br>考えるのは**入力{"1010","1100","1101","1111"}の4パターン**。 既に1行目に黒玉が並んでいて、*x3*と*x4*の組がバラバラになっているので、ここまで来た皆さんであればどんなCCNOTゲートを置けばよいかもすぐに分かるはずです。 図の通りにすれば後半の処理もお終い、あとは合体させるだけ。 </br> ### *p4*の前半 <center> <img src="https://i.imgur.com/DvP2RBJ.png" width="800mm"> </center> </br>考えるのは**入力{"0001","0100","0110","0111"}の4パターン**。 いや、もう解説することはありませんね。まんま。学部生の頃の私は*p2*や*p3*のような「下準備」が必要なパターンでてこずっていた記憶があります。 その時だけちょっと頭を使わないといけませんが、それ以外であれば楽です、楽。 </br> ### *p4*の後半 <center> <img src="https://i.imgur.com/a7DTzbo.png" width="800mm"> </center> </br>考えるのは**入力{"1010","1011","1100","1111"}の4パターン**。 考えることは*p4*の前半と一緒、回路を作ったら前半と後半を合体させれば*p4*の回路が完成です! あとは*p1*から*p4*の回路をひとつに繋げばいいのですが…そこまで図は作りません!**面倒くさい!** </br> ## おわりに うまく回路は作れましたか? 置換表(出力)の中身を変えることで、今回のお題とは違った回路を組むことができます。 興味のある方は色んなパターンを試してみてください。 こういうパズル、ゲーム化してみると意外と面白いかもしれませんね。 どなたか作ってみません(他力本願)? 私が研究している「**量子情報科学**」(量子力学や量子コンピュータについて、数学的アプローチで研究するということ…分かりそうで分からない)の分野において、量子回路を組むことはメインではないのですが、「こういったのをかたわらでやっているのだ」ということを何となーく理解していただけたなら幸いです。