qcoder 競技プログラミング 勉強会

「量子プログラミングコンテストQCoder入門会」開催レポート

qcoder 競技プログラミング 勉強会

こんにちは。EC事業部のarumaです。
社内で量子プログラミングコンテストにチャレンジしてみる会を開催しました。

開催の背景

QCoderは、量子プログラミングコンテストプラットフォームの1つです。
「与えられた問題を解決するようなプログラムを実装し提出する」という点は他のプログラミングコンテストと同じですが、QCoderでは量子コンピューターで動作させるための量子アルゴリズムの実装問題が出題されます。量子コンピューティングSDKの Qiskit を使い、問題を解くための量子アルゴリズムをPythonで記述して提出します。

今年1月にQCoderで第一回となるコンテスト「QCoder Programming Contest 001」(QPC001)が開催されました。 私はこのQPC001にリアルタイム参加し、様々なゲートを組み合わせて問題を解いていく面白さを体験しました。社内でもこの楽しさを共有できる仲間が増えたら良いなと思い、今回のイベントを企画しました。

会の内容

現在広く使われているコンピューターにおけるビット(古典ビット)は、計算途中も含め、常に0か1のいずれかの確定した値を取ります。一方で量子コンピューターにおけるビット(量子ビット)は、測定するまで0と1の重ね合わせ状態を取ることができます。

はじめに、参加者には量子ビットとは何か、古典ビットとどのような違いがあるのかを簡単に説明しました。続いて、量子ビットを制御する基本的ゲートであるHゲートとXゲート、そしてそれらの制御付きゲートについて説明しました。
これらを踏まえて、実際にQCoderの問題に挑戦しました。 QPC001のA1問題から順に、都度解説を交えながら進めて、A4問題まで解くことができました。

A4問題の解法について

A4問題は「ゼロ状態から |0>, |1>, |2> のみが非ゼロの振幅を持つ状態を作りだすような2量子ビットをもつ量子回路」を設計する問題です。
もし |0>, |1>, |2> に加えて |3> も非ゼロの振幅を持って良いのであれば、単に第0ビットと第1ビットにHゲートを適用すれば実現できます。この場合は、各状態が25%の確率となります。
しかし今回は |3> の確率を0にする必要があるため、少し工夫が必要です。

会にてA4問題の解き方を話し合う中で、「順に分けていく方式」と「4等分してから寄せる方式」の2通りの考え方が出ました。

順に分けていく方式

第0ビットと第1ビットそれぞれ独立にHゲートを適用すると、取り得る状態の数が4つになってしまいます。
「順に分けていく方式」は取り得る状態の数に注目し、まず具体的なビットのパターンは無視して状態の数が3となるようにしてから、制御付きXゲートを使って |0>, |1>, |2> に移すという考え方です。

具体的には、まず第0ビットにHゲートを適用して |0>, |1> の重ね合わせ状態を作ります。
次に、第0ビットを制御ビットとして第1ビットにHゲートを適用し、|0>, |1>, |3> の重ね合わせにします。
最後に |3> を |2> に移すために、第1ビットを制御ビットとして第0ビットにXゲートを適用します。

フローを図示すると以下のようになります。なお、ここではわかりやすさのために実数の確率で表現しています。

「順に分けていく方式」にてゲート1つごとに確率がどのように変化するかを表現した図

4等分してから寄せる方式

これは、「最初に4等分してから |3> をそれ以外の状態に取り込ませればよい」という考え方です。

まず第0ビットと第1ビットそれぞれにHゲートを適用し、 |0>, |1>, |2>, |3> の重ね合わせ状態を作ります。
次に、第1ビットを制御ビットとして第0ビットにHゲートを再適用することで、|3> の確率を |2> にまとめます。

図示すると以下のようになります。

「4等分してから寄せる方式」にてゲート1つごとに確率がどのように変化するかを表現した図

「順に分けていく方式」の回路の深さは3ですが、この方式では深さを2にできます。

参加者の感想

yancya

この度、量子ゲートに入ゲート(門)した yancya です。

以前、量子コンピューターに興味を持ち、『量子コンピュータが本当にわかる!―第一線開発者がやさしく明かすしくみと可能性』という本を読んで理論だけは少しだけ分かったつもりになっていたんですが、量子コンピューターを所有していないので手を動かして試すという事をしていませんでした。今回、量子コンピューター競技プログラミングという業界の勃興を知り、しかも社内で勉強会が行われると聞いて、喜び勇んで参加しました。

この会に参加することで、別に量子コンピューターを所有していなくても量子ビットを量子ゲートで操作するシミュレーションはできるという事が分かりました。それだけでなく、ひとまず解いてみるための問題が競技プログラミングの過去問という形で供給され始めているのは僥倖だと思います。

今回の勉強会で知ったIBM Quantum Learning Composerは、量子ビットの状態を分かりやすい絵で確認しながら量子ゲートを使って量子ビットを操作するビジュアルプログラミング環境ですが、これがあるかないかで開発のしやすさはだいぶ変わりますね。とても面白かったです。

8月18日に量子コンピュータープログラミングのコンテスト第2回が開催される予定ですが、エントリーしましたので頑張って数問は解きたいと思います。

ugo

SUZURI の ugoです!

量子プログラミングとが一体どんなものかわからないからこそ、チャレンジしてみたいと思い参加しました!

問題に対して、古典ビットを使った解法を作り、そこから量子ビットを使った解法に置き換えるということで解くことができました。 IBM Quantum Learning Composer でビジュアル的に見えることでより理解が深まりました。 量子プログラミングわからないから、なんとなくわかるという状態になりました。簡単な問題なら解けるようになったので、コンテスト第2回にもチャレンジしたいと思います!

yammer

こんにちは、yammerです。

業務の後、ホワイトボードを使って量子プログラミングを学ぶ姿は、まるで学習塾にいるような感覚でした。aruma先生のやさしく丁寧な解説で、量子プログラミングに入門できました。

何問か解くと、ビジュアルプログラミング環境でさまざまなパターンを素早く試して回答に辿り着く問題もありました。 これは、yancyaさんの言葉を借りれば、まるでボゴソートのように問題を解いており、なかなか難しいものがありましたが、そのあと「古典コンピュータではどうか」「視覚化するとどうか」「中間状態はどうなっているか」「コードで書くとどうか」といった複数の側面から、参加したメンバーとディスカッションをすることで、解き終わった後に理解を深めることができました。

量子コンピュータにおける計算操作がどのように組み立てられるのか、新しい世界を見ることができて新鮮な気持ちになれたので、次は自分の力で別の問題を解いてみたいと思います。

さいごに

2024年8月18日には、第二回となるコンテスト「QCoder Programming Contest 002」が開催されるそうです。
この機会に、ぜひ量子プログラミングに挑戦してみてください。