量子コンピュータ初心者がIBM Quantum Challenge 2021をクリアするまで

本格的に勉強を始めてから数か月-1年程度でも、そこそこの成果が残せることを伝えたい。
![スクリーンショット 2021-06-01 195147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/9c67550b-2ed3-b838-1432-6876e2d506b1.png)



# はじめに: 記事の目的
- 量子コンピュータに興味を持っているが本格的な勉強を始められていない方に、量子コンピュータの勉強はそこまで障壁が高くないことを伝え、本格的な一歩を踏み出して頂きたい。
- 勉強をはじめているが行き詰まり感を感じている方の、行き詰まり感を打破する一助になりたい。
- あわせて目標の選択肢の一つとして、IBM Quantum Challengeのことを伝えたい。

# IBM Quantum Challengeとは
簡潔に説明すると、IBMが主催する量子コンピュータープログラミングコンテストです。初心者にとっては、自分の実力を試すことのできるよい機会です。

イベントの詳しい説明については、以下の記事など参考にされると良いかと思います。
https://qiita.com/Ayumu_walker/items/bf4d2f98d1860a3409c3

# Quantum Challenge 2021挑戦までの流れ
## 2019年まで
遠い昔、偶然読んだブルーバックスの本で量子コンピュータのことを知る。

ただしこのころまで、特に勉強しようと思わなかった(実用化はまだ遠い未来だと思っている節があった)。
2019年の後半ごろから量子コンピュータのニュースが耳に入るようになり、思ったより実用化が近いのかもしれないと思い始めた。


## 2020年前半
きっかけは定かでないが、ふと量子コンピュータをもう少し勉強しようと思い始めた。
独学で勉強してみたり、あるコミュニティに参加してみたが、初心者にはハードルが高く挫折気味。
話を聞いても「難しいことを話しているのは分かるが、言っていることを理解できない」という感じ。(現在でもやはり難しい)


## 2020年後半
Quantum Challenge 2020が終わった後くらいに存在を知る。
年末に解いてみたところ、時間をかければ最初の1問くらいは解けたが後は手が出ず。


## 2021年前半
上記とは別のコミュニティ活動で、比較的敷居の低い量子コンピュータ関連の活動の存在を知り参加することにした。結果的にはこれが転機となる。
自分を含め初心者の方も多く、一方で経験者の方もアドバイザーに付いてくださったため勉強が非常に捗った。
なお活動の前半では[qiskit textbook](https://qiskit.org/textbook/ja/preface.html)を使った輪読会を実施した。
…正直に書くならば、無料なのはありがたいが初心者には少し難しいかもしれない。

またここでIBM Quantam Challenge 2021の開催を知り、挑戦することにした。


# Quantam Challengeクリアに効果があったと思う勉強など

## 状態ベクトル、ゲートの行列表現を理解する
正直、最初は状態ベクトルも行列表現も拒否反応が出て理解しようという気が起きませんでした。
しかし慣れれれば、ゲートや回路を理解するうえで非常に強力なツールです。


筆者は勉強を始めたころ、自作の回路が正しいか確認するため「測定」をしていました。もしかしたら、今同じことをやっている方がいらっしゃるかもしれません。
しかし、測定にはデメリットがあります。
一つは効率的ではないこと。入力値一つ一つ変えて検証する必要があります。
そしてもう一つ、実は必ずしも回路の正しさを証明してくれないことです。測定では振幅の絶対値しか分からないため、本来と異なる位相が付与されていても測定では気づけないのです。

かわりにunitary_simulatorで行列表現したほうが速いですし、確実です。
回路によって状態ベクトルがどう操作されるか、一目で理解できます。
3量子ビット程度までなら行列の要素数は64個(しかも大半の要素は0)ですから、そこまで無理はないでしょう。


## 自習した内容はノートに残す
他の分野にも通じることではあるのですが、量子コンピュータの場合は特に内容が複雑で勉強内容を忘れやすいかと思います。
ゲートの意味などは後から見返すことも多いので、すぐ見返せるよう理解した内容はノートに纏めておきましょう。

## 過去のChallenge問題を解いてみる
自習していても、中々充実感が得にくいし自分の実力も良く分からない。過去問を解けば自分の実力を把握できるし、成長したという時間がわきやすいでしょう。

[2020年の問題](https://github.com/qiskit-community/IBMQuantumChallenge2020)
[2021年の問題](https://github.com/qiskit-community/ibm-quantum-challenge-2021)

## コミュニティへの参加
少なくとも筆者の場合、勉強効率・モチベーション維持・情報収集の観点で高い効果がありました。
1人でやっていると不明点が出てきたとき困りますし、量子コンピュータの勉強には短期的なメリットがまだ乏しいのでどうしてもモチベーションが下がってしまいました。また今回のQuantum Challengeの開催も知らず、参加できていなかったかもしれません。
一方コミュニティに属すると、困ったときは相談できますし、努力している仲間や優秀なアドバイザーを知ることができそれ自体モチベアップにもなります。良いイベント情報も入手しやすいです。

ぜひ皆様には、自分に適したコミュニティを探すことを検討いただければと思います。


# おまけ: これからQuantum Challenge 2021を解くかたへのアドバイス
Challenge自体は終了したものの、問題はGithub上で公開されています。
興味があればぜひ解いてみてください。
[ibm-quantum-challenge-2021](https://github.com/qiskit-community/ibm-quantum-challenge-2021)

以下では、初心者の方がQuantum Challengeを全問正答するうえでハードルになりそうな点を筆者目線で書きたいと思います。参考になれば幸いです。
注: ヒントという名のネタバレを含みます。

なお正確な解法に関しては、下記の記事が詳しいかと思います。
https://qiita.com/Ayumu_walker/items/bf4d2f98d1860a3409c3


## ex-1について
### Toffoli gateの教科書的な構成を知っていたほうがよい
最初はex-1の解説に則り自力で構成してやろうと思ったのです。しかし頑張ってもどういう訳か、正しい回路になりませんでした。何度試しても、unitary_simulatorで見ると符号が誤っていたり、虚数になってしまうのです。
結局[Qiskit Textbook](https://qiskit.org/textbook/ch-gates/more-circuit-identities.html#4.-The-Toffoli-)にのっていたToffoli gateの分解例を参考に、基本ゲートに分解しました。

  
### ゲートの行列表現を知っていたほうがよい
例えばToffoli gateの分解例ではTゲートが登場するので、これを基本ゲートで表現することになります。
どう分解したらよいか分からない、と困惑するかもしれませんが[Qiskit Textbook](https://qiskit.org/textbook/ch-states/single-qubit-gates.html#tgate)にはTゲートの行列表現が載っています。これを理解していればTゲートはφ=π/4のRZであることがすぐ分かります。

行列を苦手に思う人もいらっしゃるかもしれませんが、ゲートの意味を理解するうえでは行列が近道かと思います。
  


## ex-2について
コスト数を気にしないのであれば、U1さえ解けてしまえばあとは難しくないはずです。(U2はU1を2回、U4はU1を4回繰り返せばよい)
個人的にはex-2が一番簡単でした。とはいえ、恥ずかしいことに最初は「Control bit=1の時操作を加える」という条件が読み取れずハマったのですが。

  
## ex-3について
### 問題文を正確に理解すること
初見では誤り訂正なんて分からないし無理だと思いました。しかし問題文をよく見ると、誤り訂正はあくまでフレーバーであることがわかります。(この問題をきっかけに興味を持ってほしいという意図はあるかもしれませんが。)
この問題の肝は、「実機上隣接していない量子ビット間のcxゲートは現状のアルゴリズム上最適化が難しいので、隣接ビット間のcxのみで構成するよう手動で書き換えてしまおう」ということです。
初見の難しさに引きずられず、この意図を正しく読み取ることができれば、後はそこまで難しくありません。

<!--
あとは「qc_syn.cx(code[1],syn[2])」と同じになるよう、ゲートを組み立てればよいです。
-->

なお自分はやや体当たり的にクリアしましたが、後日公式よりswapゲートを使えばよい、など[ヒント](https://github.com/qiskit-community/ibm-quantum-challenge-2021/blob/main/hints.md)も出ていたようです。






## ex-4 トランズモン型量子ビット
化学の知識があるとより理解しやすいかもしれませんが、問題自体はそこまで難しくないと思います。約5237MHzで第一励起状態へ励起した後、第二励起状態へ励起する際の周波数を4900MHz前後でスキャンしたらよいのですね。
最も、ここでも第一励起状態への励起は固定周波数にすべきところスキャンしてしまうというミスでハマりました。

<!--
ただ、問題は解けたものの測定の全体像が今一つ良く分かっておらず消化不良感が残っています。
-->



## ex-5 VQE
最終問題だけあって難問でした。自分はクリアだけで精一杯でしたが、最低コストの3まで落とせた方が200人もいるなど信じられません。

### 落ち着いてコードやAPI referenceを理解すること
「フローズンコア近似」、「two_qubit_reduction=True」、「ParityMapper」、「Z2Symmetries」など知らない言葉が出てきて圧倒されそうになります。
ここで落ち着いて問題のコードを再確認したり、API referenceを調べられるか最大のポイントとなります。

よく見ると、「two_qubit_reduction」や「ParityMapper」などは親切にもそれらしい言葉がコード内に出てきているのですよね。
「フローズンコア近似」や「Z2Symmetries」なども検索すればQiskitのAPI referenceにたどり着くはずです。


### 多少の試行錯誤やSlack Channelでの情報収集を厭わないこと
あとは楽かと思いきや、API referenceにたどり着いてからが大変だったりします。
パラメータの型の意味とか具体的な使用方法が分からないのですよね。一般的な製品マニュアルのように具体的なサンプルがあったらまだ使用イメージが湧くのでしょうけれど。
z2symmetry_reductionに関しても4通りの指定があるようですが、ではどれを選べば良いのかとなると全くわかりません。

筆者も何度かあきらめそうになりながらも、試行錯誤を繰り返し公式Slack Channel上のやり取りからヒントを得て無事クリアできました。