自分が初めてクラウドに公開された量子コンピュータにジョブを投入したのは、2024年の夏でした。
当時も量子コンピュータについての知識がほとんどなく、何から始めればいいのかも分からない状態でした。
調べていると、クラウド上の量子コンピュータを使うには、Pythonで量子回路を記述し、その回路をジョブとして実機へ送る必要があることが分かりました。そして、そのサンプルとして、 ベル回路 と呼ばれる量子回路を実行するプログラムが、C言語のプログラム例でよく挙げられる Hello World! のように紹介されているのを見かけました。
ただ、正直なところ、そのプログラムを読んでも、意味がよく分かっていませんでした。
「ベル回路って何?」
「アダマールゲート?ゲートって、AND、OR、NOTの3つじゃないの?」
「ショットって何?」
「・・・これ、本当に一番最初にやることなんだろうか?」
「Hello World!って、もっと単純なものじゃなかったっけ?」
C言語であれば、 printf("Hello World!\n"); と書いて実行すれば、すぐに結果が出ます。
あの 「すぐ動く」 感じと 「やった、コンピュータが思い通りに動いた!」 という感覚こそが Hello World! だったはずです。
あの感覚と比べると、この ベル回路のプログラム にはわからない点がたくさんあり、自分にとってどうも難しく見えました。
そこに違和感があって、自分で簡単な回路を作ることにしました。
開発環境を構築し、とりあえず 1ビットの量子ビットを反転させるだけならできるだろう と思い、Qiskitと呼ばれるSDKの開発ドキュメントを読み、Qiskitで書かれたプログラムの解説記事を集めては、見よう見まねで 1量子ビットにNOTゲートをかけるだけのシンプルな回路 を作って、なんとかジョブの送信までこぎつけました。以下は、当時書いたPythonのコードです。
# Qiskit 1.1.0で記述
# 量子回路を構築するためのパッケージをインポート
from qiskit import QuantumCircuit
# 量子ハードウェア上で実行するためのパッケージをインポート
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2
# 結果を視覚化するためのパッケージをインポート
from qiskit.visualization import plot_histogram
import matplotlib.pyplot as plt
# 認証情報の設定
service = QiskitRuntimeService(
channel='ibm_quantum',
instance='インスタンス名',
token='トークン文字列'
)
# 利用する量子ハードウェアの指定
backend = service.backend('ibm_nazca')
# 量子ビットを1つもつ量子回路を作成
qc = QuantumCircuit(1)
# 作成した量子ビットに量子ビット反転ゲート(Xゲート)を適用
qc.x(0)
# 量子回路中の各量子ビット全てに対して測定及び出力を書き込むため古典ビットを1つ追加
qc.measure_all()
# 量子回路図を端末に出力する
print(qc.draw(output='text'))
# 実行ジョブを登録する
sampler = SamplerV2(backend)
job = sampler.run([qc])
# 実行結果の出力
"""
4096回実行したうち量子ビットが1になった回数、0になった回数を
ヒストグラムとして表示される。
"""
job_result = job.result()
pub_result = job_result[0].data.meas.get_counts()
plot_histogram(pub_result)
記事執筆時点での動作保証はありません!
上記は、2024年夏頃に当時のIBM Quantumにて実行を確認できたものになります。また、量子ハードウェアにibm_nazcaを指定していますが、本実機は、IBMの公式ドキュメントの退役した量子ハードウェア一覧の通り、2024年12月で運用を終了しています。
1量子ビットにNOTゲートをかける
正確には、量子ゲートである Xゲート(エックスゲート) を適用したと言います。Xゲートは0と1を入れ替える働きを持ち、古典コンピュータのNOTゲートに対応すると説明されることから、本記事では分かりやすさを優先して NOTゲート と表現しています。
ローカルのシミュレーターで動作を確認し、プログラムが完成!いざ量子コンピュータへジョブ送信!
ローカルのシミュレーターでは結果がすぐに返ってきたのもあり、
「すぐ結果が返ってくるだろう。」
と思っていました。
しかし・・・
結果はすぐに返ってきませんでした。
「なんか間違えたのかな?」
「無限ループしているのでは?」
「もしや、高額課金発生か?」
そう思いながら、ディスプレイに表示されるプロンプトを前に不安になり、キーボードのCtrl+Cに指をかけて、プロンプトと睨み合っていました。
結局、その日は定時を迎え、結果を見ずにそのまま帰りました。
次の日、ディスプレイをONにすると、プロンプトには棒グラフが表示されていました。
ブラウザ上でIBM Quantumのコンソールにアクセスし、ジョブの完了も確認しました。
そして衝撃だったのが、実機での処理時間が 約3秒程度 なのに、ジョブ実行までの待ち時間が 約3時間半 と、処理時間よりもジョブ実行までの待ち時間のほうが長かったことです。
以下は、当時、ブラウザ上で表示されたジョブ実行までの待ち時間と、実機での処理時間のスクリーンショットです。
「Pending:3h 32m 43.7s」、「Qiskit runtime usage:3s」となっており、ジョブ実行までの待ちが3時間32分43.7秒、実機での処理時間が3秒であることを示している。
・・・
その経験から、当時の私は、量子クラウドに対して、次の発見をしました。
第1の発見
量子クラウド上でのジョブ実行には、待ち時間がある
とても新鮮な経験でした。コンピュータの歴史を紐解くと、現在のようにコンピュータが小型化する前、 メインフレーム と呼ばれる中央集権型のコンピュータが主流でした。それをみんなで共有して使う時代があり、エンジニアがオペレーターにプログラムのコンパイルや、ジョブの実行をお願いした後、結果が出るまで休憩していた、という話を聞いたことがあります。
AWS、Azure、Google Cloudといったクラウド環境で、数回クリックするだけでものの数秒でコンピューティングインスタンスをデプロイできてしまうことに慣れているからなのか、クラウド上のコンピュータで実行結果が出るまで 3時間半 も待つことになるとは思ってもいませんでした。
しかし、「その待ちは偶然ではないのか?」 という小さな疑問として残り続けました。
次回、この 待ち について、実際に1週間ほど計測した話に続きます。
(次回につづきます)
量子コンピュータの計算結果
以下は、本記事で紹介したソースコードの出力結果です。
単に量子ビットを 0 から 1 に反転させるだけなので、 1 だけが返ってくると思いきや、2本の棒グラフが出てきて、 0 も返ってきました。自分が理解できる範囲にプログラムを落とし込んだのに、 なぜ0が返ってくるのかよくわからない という感想になったのでした。
下記が棒グラフです。縦軸Countがプログラム中で構築した量子回路の実行回数(=ショット)、横軸が計算結果です。棒は構築した量子回路を4096回実行したうち、計算結果が0となった回数(量子ビットが0であることを観測できた回数)が46回、1となった回数(量子ビットを1であることを観測できた)が4050回であったことを表しています。この結果を見て、古典コンピュータが0や1の決定的な結果を出力するのに対し、量子コンピュータは確率的な結果を出力するという違いを知りました。
以下は構築した量子回路の回路図表示です。プログラムの記述に使用したQiskitと呼ばれるSDKでは、構築した量子回路を図として出力する機能があります。当時、回路図を画像出力する例をよく目にしたのもあり、テキスト表示も見てみたいという好奇心から、テキストでの回路図出力を試していました。それぞれの記号の意味、読み方については割愛しますが、左から右に読みます。
┌───┐ ░ ┌─┐
q: ┤ X ├─░─┤M├
└───┘ ░ └╥┘
meas: 1/═════════╩═
0
自分にとって難しかったこと
私がベル回路のプログラムソースで難しいと感じた箇所は、メイン処理4行だけでも以下の量子コンピュータの基本的な動作が凝縮されており、一つの単語を理解するために調査するとまた新しい専門用語が二つ、三つと増えていった点です。
- アダマールゲート(Hゲート) で 重ね合わせ状態 を生成
- 制御付きNOTゲート(CNOTゲート) で もつれ状態(ベル状態) を生成
- 測定 を ショット数 だけ繰り返すと、00と11が約50%ずつ観測 される
- 01 と 10 は理想的には観測 されない
この4行の処理を説明するのに、Hゲート、重ね合わせ状態、CNOTゲート、もつれ状態(ベル状態)、測定、ショット数、50%ずつ観測と、量子分野特有の専門用語が次々に出てきて、それらを理解するにはさらに別の前提知識が必要になりました。
こうして理解すべき前提知識が雪だるま式に増え、気付けば完全に検索の沼にはまってしまいました。そこで私は、 わからなくてもいいからとにかく前に進める という方針に切り替えました。重要な概念だったら何度も目にするだろうし、そのときに改めて理解すればよいと思い、進めていった結果、 1量子ビットにNOTゲートをかけるだけのコード に行きつきました。
量子クラウド滞在記 シリーズ記事一覧
- はじめに
- 第1の発見:待ち時間がある
- 第2の発見:・・・
- ・・・

