その4今回はC1からです。Qubitの量子オラクルを実装せよ。autoでadjointが生成できなければならない。解答C問題シリーズは量子オラクルを実装するものです。量子オラクルというのは、このあたりに詳しいです。なる$O$を実装せよというものです。0101010...か101010...のような、1と0が交互に現われるものの2通りしかありません。Qubitの量子オラクルを実装せよ。全ての$i\in[0,N-P-1]$に対して$x_i=x_{i+P}$であるようなものである。$P$は$N$を割り切らなくても良い。"01010"は$P=2$でperiodicである。解答いいんですかねこんなので。通ってしまったものは仕方が無い。Qubitの量子オラクルを実装せよ。$\vec{x}$中の立っているビットの数が3で割り切れるなら$f(\vec{x})=1$、それ以外なら$f(\vec{x})=0$解答C2と同様にテーブルでやってみたところ、サイズが大きくて時間がかかりTLEになりました。立っているビットの数を数えるには、加算器を実装します。加算結果は最大で9になるので、4ビット必要です。4ビット+1ビットの加算器を実装することになります。bとなります(桁上がりするにはそれより前の桁が全部1になっていないといけないので)。auto;}このようになります。カウントができれば、あとはこれが3の倍数かどうかチェックする関数を書きます。入力のレンジが0~9なので、べた書きすればよいでしょう。auto;}となりますが、usingブロックの終了時点で確保したQubitはゼロ状態に戻しておかなければならないので、Countの逆操作を行う必要がります。autoで自動で作る機能がありますし、しかも今回の問題はそれを要求されているので、それを使えばよさそうです。auto;}ところで、こういう何らかの操作Aを行って、別の操作Bを行って、それからAで行った操作を元に戻す、という一連の操作はよく出てくるみたいなので、それを行うためのWithAという関数が用意されています。これを使えば、全体のコードを次のように書けます(WithAを使うためにCountとCheckの引数をそろえています)。auto;}今回は割と簡単でした。一行追加するだけで関数をメモ化するマクロを作った。その3前回の続きでB1からになります。writeup月別アーカイブはてなブログをはじめよう!tanakhさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。