🏆

QCoder Programming Contest 002に参加しました!

2024/08/23に公開

はじめに

データソリューション事業部の関田です。
私は2024年8月18日に QCoder Programming Contest (QPC) 002 に参加しました。
参加目的は、Qiskitという量子プログラミング用のツールを学ぶきっかけ作りです。

結果としてこの目的を充分に達成できるほど多くのことを学ぶことができたので、その所感等を述べていこうと思います。

QCoder Programming Contestとは

QCoder Programming Contestとは、2024年に開催を開始した量子プログラミングコンテストで、IPAの「2024年度未踏ターゲット事業」に採択されたプロジェクトとして開催されています。
https://www.qcoder.jp/ja
https://www.ipa.go.jp/jinzai/mitou/target/2024/gaiyou-fk-2.html

2024年1月に第1回のコンテストが開催されました。
誰でも参加可能で、量子プログラミングを少し勉強すれば解ける問題や、逆に参加者のほとんどが解けない難問もあります。
量子プログラミング初心者から熟練者まで、多くの人が楽しみながら学ぶことができるコンテストとなっています。

事前にやったこと

QCoder #2参加にあたり、事前に以下の準備をしました。

  • Qiskitの環境構築
  • QCoder #1の学習

Qiskitの環境構築

Qiskitのインストールを行い、チュートリアルを動かしてみました。
QCoderでは基本的にQiskitで用いることができる量子ゲートとその使い方を把握していれば良いですが、私は今後もQiskitを使っていこうと思っているので、実機で計算を動かしてみたりして遊んでいました。

QCoder # 1の学習

いわゆる過去問です。私が取った勉強法としては、以下の繰り返しです。

  • 問題、解答例、解説を見る
  • QuantumCircuitクラスで使用可能な量子ゲートの種類と使い方を調べる
  • 問題のアルゴリズムを実現する回路の作り方やその発想をじっくり考える

全部を完璧に理解することは目指さずに、理解できそうな範囲で、前半の基本的な問題を特に丁寧に学習しました。

コンテスト結果と各問題の感想

コンテストの順位は、183人中75位でした。完答できたのは14問中5問で、想像していたくらいの結果となりました。

続いて、各問題の感想や学んだことを述べます。
注:解説ではありません。解説はQCoderのコンテストページに掲載されています。

A1

XゲートとZゲートを用いた基本問題です。

A2

HゲートとCXゲートを用いて、A1の発想を再現できれば解くことができます。

A3

A2の類推で解きました。
A2で用いたCXゲートを繰り返し適用すれば実現できることに気付くかがポイントです。

A4, A5

A3に対して、量子回路の深さ[1]に関する制約を設けた問題です。
私は量子回路の深さに関しては真面目に勉強していなかったので、これらの問題はコンテスト終了後に復習することにして解こうとすらしませんでした。

まだこの問題の一例だけですが、解説を読んで量子回路を浅くするテクニックを知ることができたので勉強になりました。

B1

A1を位相に関して一般化したような問題です。
A1のZゲートを一般化したPゲート(位相シフトゲート)に置き換えることが想定解だったようです。
その方法も思い浮かびましたが、私はR_Zゲート一発で解きました。
想定解だと3回のゲート操作が必要ですが、R_Zゲートを用いれば1回の操作で済みます。

B2

狙った状態のみ位相シフトさせ、それ以外はそのままの状態を保つようなオラクルを実装する問題です。
QCoder #1でも狙った状態のみ変化させるような問題があったので、その類推で解けそうだとは思いましたが結局解けませんでした。QCoder #1と同様の発想で解けますが、参加者全体でも正答率は低かったようです。

QCoder #1の学習をしているときに「解説を読めば理解できるが、自分でゼロからの実装は時間をかけないとできなさそう」と感じていたのですが、まさにその通りの結果となりました。

B3

量子ビットをスワップする問題です。
これに関しては勉強したことがあったので、すぐに解けました。

B4

量子フーリエ変換を実装する問題です。
これも私は勉強したことがあったので、どのような回路を組めば良いかはすぐに分かりました。
細かい点では、リトルエンディアンなど表記の流儀に従うことに注意して実装できました。と思っていました。
ところが、何回実行しても通らず、結局時間切れとなりました。

コンテスト終了後に解答例と見比べてみると、何とも初歩的なミスをしていることに気付きました。
累乗を"**"ではなく、"^"で書いていたのです。
本コンテストではエラーメッセージが出ないのでずっと気付きませんでした。
普段どれだけエラーメッセージに助けられているかを改めて認識しました。

おわりに

参加目的であった、Qiskitや量子プログラミングに入門すること を充分に達成できたので良かったです。今回の問題をよく復習し、更なる学びを得たいと思います。
また、次回以降のコンテストにも参加したいと思える面白い内容でした。
量子プログラミング経験に関わらず楽しめるコンテストですので、興味のある方は是非参加してみてください!

これを機に、Qiskitで色々な実装に挑戦していきます!

脚注
  1. 量子回路の深さとは、回路の全ゲートを実行するステップ数のことです。したがってゲートの総数や並列実行可能なゲート数と関連があります。回路を浅くしたいとき、ゲート数を削減することや、複数ゲートが並列に実行可能な構成にすることが重要です。 ↩︎

DAL Tech Blog

Discussion