QCoder QPC001 A4問題で考えたこと
「Qiskitなんもわからん」状態で QCoder Programming Contest 001 に参加してみました。
とても楽しく、同じようなわからん状態の方にも参加してみてほしいと思ったので、どのようにA4問題を考えたかをまとめてみます。
A4問題
A1, A2, A3問題では、XGateとその制御版であるCXGate、そしてHGateというゲートを学びました。また、ここまでの流れからCHGateもありそうだと予想できました(そして確かに存在しました)。
A4問題ではこれらのゲートを用いて、ゼロ状態から |11>
を除くすべての状態を生成するような2量子ビットの量子回路を設計します。
このあとのA5問題では複素振幅まで揃える必要がありますが、A4問題では任意です。
問題文には以下のコードが提示されており、この中の Write your code here:
から return
までの間を埋めることになります。
from qiskit import QuantumCircuit
def solve() -> QuantumCircuit:
qc = QuantumCircuit(2)
# Write your code here:
return qc
フロー検討
|11>
を生成させないためには、状態数が3以下のままとなるようにすればよさそうだ考えました。状態数3さえ満たされていれば、例えその内訳が |00>
, |10>
, |11>
だとしても、各種ゲートの組み合わせで |11>
を除けるからです。
A4問題では複素振幅は任意なので、
|00>
と|10>
に分ける|10>
のみ、|10>
と|11>
に分ける
とすれば、状態数はちょうど3になります。
今回は |11>
を生成させたくないので、最後に |11>
と |01>
を入れ替えることにします。
まとめると、以下のようなフローになります。
適当なゲートを選んでいく
上述のフローを実現するために、適当なゲートを選んでいきます。
|00>
を |00>
と |10>
に分けるところは、HGateを使えばよいです。
これは、短く
qc.h(0)
と書けます。
次の処理は、「|00>
はそのまま、|10>
のみ |10>
と |11>
に分ける」という制御が必要です。
input | output |
---|---|
\|00> |
\|00> |
\|10> |
\|10> , \|11> |
これはCHGateで実現できます。
第0量子ビットを制御量子ビット、第1量子ビットをターゲット量子ビットとしてCHGateを適用します。
qc.ch(0, 1)
最終段階は、|00>
と |10>
はそのままで、|11>
を |01>
に変換できればよいです。
input | output |
---|---|
\|00> |
\|00> |
\|10> |
\|10> |
\|11> |
\|01> |
これはCXGateを使い、第1量子ビットを制御量子ビット、第0量子ビットをターゲット量子ビットとして適用すると実現できます。
qc.cx(1, 0)
完成したもの
最終的には、以下のようになります。
from qiskit import QuantumCircuit
def solve() -> QuantumCircuit:
qc = QuantumCircuit(2)
# Write your code here:
qc.h(0)
qc.ch(0, 1)
qc.cx(1, 0)
return qc
提出結果
https://www.qcoder.jp/contests/QPC001/submissions/b785b910-d166-438f-8655-e7a183e56b1a
- 結果: AC
- 実行時間: 806 ms
- メモリ: 91 MiB
さいごに
本当になんもわからん状態で始めたので、Qiskitのドキュメント の他、QCoder推奨の教材リストやChatGPTなど様々なものに頼りまくりました。
大変でしたが、新しいものを学ぶのはわくわくしますね。
量子プログラミングを手軽に始め、自動採点してもらってLive解説まで聞けるQCoderは、とても良い環境だと思いました。