量子プログラミングコンテスト【QCoder】第一回に参加したので感想と攻略法をまとめてみた

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [QCoderとは](#c1)
1. [QCoder001-参加記録と感想](#c2)
1. [事前にした準備](#c3)
1. [足りてなかった準備](#c4)
1. [攻略法](#c5)
1. [参考文献](#ref)

<!-- 各チャプター -->
<a id="#c1"></a>
# QCoderとは
> 2024年に新たにサービスを開始した量子プログラミングコンテストプラットフォームです。
従来型のプログラミングコンテストとは異なり、量子コンピュータ上で動作する 量子アルゴリズム を実装する問題が出題されます。
※ 本サービスは [2023年度未踏ターゲット事業](https://www.ipa.go.jp/jinzai/mitou/target/2023/gaiyou_fk-2.html) の支援を受けて開発・運営されています。

※ [QCoder - Q&A](https://www.qcoder.jp/qa)より抜粋

QCoderとは、2024年1月20日(土)14時~18時に第一回が開催された新たな量子プログラミングコンテストです。

余談ですが、コンテスト開催を支援している **2023年度未踏ターゲット事業** というのは、あの基本情報技術者試験を実施しているIPAの一事業のようです。もし将来量子コンピューティング技術者試験とかが追加されたら受けてみたいです。

<a id="#c2"></a>
# QCoder001-参加記録と感想

## 順位(96位/255人)
順位は255人中96位でした。

![スクリーンショット 2024-01-21 0.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/0152ce76-67f4-cd36-a056-cd2a7b8d5052.png)

量子プログラミングというニッチ?なジャンルのコンテストを宣伝も無い中見つけて、4時間かけて参加するような人達なので、母集団のレベルはそこそこ高かったのでは無いかと思います。
そんな中、普段フロントエンジニアをやっている私が上位三十数%に入れたのは健闘したと言えるのでは無いでしょうか。

## 得点(1000点/2800点)
得点は2800点中1000点でした。
11問中6問解いたのですが、後半の難易度が高く配点も高い問題が解けず35%程度の得点率になっています。

## どんな問題が出たか
問題はA1~A5,B1~B4,C1~C2の計11問で、
- A問題は量子ゲートを用いて量子ビットを指定された状態へ遷移させる問題
- B問題はオラクルと呼ばれる量子回路における関数のようなもの(?)を作成する問題
- C問題はA問題をより複雑にしたような問題
が出題されました。

AtCoderのように一からコードを書く形式ではなく、最低限必要なライブラリのインポートや解答の出力などが予め記述されている形式でした。そのため、pythonの基本的な文法(if,forくらい)とqiskitの使用方法が分かれば問題なく参加できます。

## 個別の問題への感想
### [A1: Generate Plus state](https://www.qcoder.jp/contests/QPC001/problems/A1)
量子ゲートを用いて1ビットの量子ビットの状態を変化させる問題で、アダマールゲートが理解出来ていれば解ける問題です。
qiskitのチュートリアルレベルの問題だったので問題なく解けました。

### [A2: Generate Uniform Superposition State](https://www.qcoder.jp/contests/QPC001/problems/A2)
量子ゲートを用いてnビットの量子ビットの状態を変化させる問題で、アダマールゲートとfor文が理解出来ていれば解ける問題です。
こちらも問題なく解けました。

### [A3: Generate state (1/sqrt(2))*(∣0⟩+∣3⟩)](https://www.qcoder.jp/contests/QPC001/problems/A3)
量子ゲートを用いて2ビットの量子ビットの状態を変化させる問題で、アダマールゲートと制御Xゲートが理解出来ていれば解ける問題です。
ちょっと時間はかかりましたが問題なく解けました。

### [A4: Generate state (1/sqrt(3)*(∣0⟩+∣1⟩+∣2⟩)) I](https://www.qcoder.jp/contests/QPC001/problems/A4)
量子ゲートを用いて2ビットの量子ビットの状態を変化させる問題で、アダマールゲートと制御アダマールゲートが理解出来ていれば解ける問題です。
A2のを解いた要領で一旦a0~a2を全て1/2ずつにした後、知ってるゲートをガチャガチャ試していたらなんか解けました...

### [A4: Generate state (1/sqrt(3)*(∣0⟩+∣1⟩+∣2⟩)) II](https://www.qcoder.jp/contests/QPC001/problems/A5)
量子ゲートを用いて2ビットの量子ビットの状態を変化させる問題で、アダマールゲートと回転ゲート、ブロッホ球が理解出来ていれば解ける問題です。
私は回転ゲートやブロッホ球の存在すら知らなかったので、パウリゲートとアダマールゲートではルート3が作れない(多分)ことに気がつくのに30分、どちらか1ビットを観測してなんとかルート3を分母に作れないか格闘すること30分の後に諦めました。

ただ、用意されているコードを改変して観測用の古典ビットを作成してもコンパイルエラーや実行時エラーにならないことが確認できたのは収穫でした。

### [B1: Copy Oracle](https://www.qcoder.jp/contests/QPC001/problems/B1)
指定されたオラクルOを作成する問題で、オラクルの概念と、排他的論理和が理解出来ていれば解ける問題です。
オラクルを知らなかったので、チャットGPTに「量子プログラミングのオラクルってなんですか」と聞いて教えてもらいなんとか解けました。

### [B2: XOR Oracle](https://www.qcoder.jp/contests/QPC001/problems/B2)
指定されたオラクルOを作成する問題で、こちらもオラクルの概念と、排他的論理和が理解出来ていれば解ける問題です。
B1でオラクルをなんとか理解していたので解くことができました。

### [B3: Less Than Oracle I](https://www.qcoder.jp/contests/QPC001/problems/B3)
重ね合わせ状態の中の特定の計算基底状態にのみZゲートを作用させることが出来れば解ける問題です。
解説を読んでも理解出来なかったです...

### [B4: Less Than Oracle II](https://www.qcoder.jp/contests/QPC001/problems/B4)
リンクだけ貼っときます...
### [C1: Generate Uniform Amplitude Superposition State I](https://www.qcoder.jp/contests/QPC001/problems/C1)
リンクだけ貼っときます...
### [C2: Generate Uniform Amplitude Superposition State II](https://www.qcoder.jp/contests/QPC001/problems/C2)
リンクだけ貼っときます...

<a id="#c3"></a>
# 事前にした準備
## [Qookbook](https://www.qookbook.net)での学習
無料、日本語で量子ビットの基礎が学べます。QCoderのQ&Aページでもおすすめされていました。
難点が一つだけあり、Qookbook独自のライブラリを用いてのコーディングになるのでqiskitは別で練習する必要があります。
QCoderの存在を知ったのが開催の2週間前だったため、0.5周くらいしかできてません。

## [EMANの物理学](https://eman-physics.net/quantum/computer1.html) での学習
こちらも無料、日本語で量子アルゴリズムの基礎が学べます。
数式メインでガッツリ学びたい人にはおすすめ。
こちらも0.5周くらいしかできてません。

## qiskit実行環境の準備
IBM Quantum Learningというサービスを使うと、無料でブラウザ上で実行できる環境を用意できます。

<a id="#c4"></a>
# 足りてなかった準備
## qiskitに慣れる
qc.x(),qc.h()くらいしか実行したことが無かったのでqc.ch()とかを使うときに第一引数と第二引数どっちが制御ビットだっけ?とかで時間を取られました。同じ得点なら解答時間が早い人から上位になるみたいなので、スピードも大切です。

## 回転ゲート、ブロッホ球の学習
ガッツリ数学なので久しぶりに紙とペンで勉強するしかなさそうです。

## オラクルの理解
私が勉強した中では一回も出会わなかった概念ですが、使ってみると必須感を感じました。

<a id="#c5"></a>
# 攻略法
**第一回の過去問を全部解けるようになる。**
大きく出題傾向が変わらなければ過去問さえ解けれるようになれば次回以降は満点も狙えるはずです。

AtCoderのようにほぼ無限の問題プールから出題されるわけではなく、量子アルゴリズムのqiskitを使って解ける問題に限定された問題プールから出題されるので一度解法を理解してしまえば、あとはその応用で解ける問題しか出ないと思うからです。

<a id="#ref"></a>
# 参考文献
- [QCoder](https://www.qcoder.jp)