0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

開発者のための量子コンピューティング実践入門(第1回)Pythonで量子回路を書いてみる

0
Last updated at Posted at 2026-04-29

(本シリーズは、筆者が学習したい内容をAIによって生成した文章を元にしています。コードの動作確認・修正や文章の修正・追加を施している部分はありますが、内容の正確性については利用したAIに依存しています。左記ご理解の上、ご覧ください)

はじめに

量子コンピューティングという言葉を聞くと、

  • 数学が難しそう
  • 物理が必要そう
  • 研究者向けでは?

と思うかもしれません。

しかし実は、Pythonが書ければ量子回路はすぐに動かせます。

この記事ではまず、

Pythonで最初の量子回路を動かす

ところまで進みます。🚀

この連載の対象読者

このシリーズは次のような方を想定しています:

  • Pythonが書ける
  • AIやGPUに興味がある
  • Kubernetesやクラウドに触れている
  • 量子コンピューティングを触ってみたい

数学は最小限に抑えます。

今日やること

この記事では次を実行します:

  • 量子ビットとは何かを理解する
  • 最初の量子回路を書く
  • 実行して結果を見る
  • なぜ確率になるのかを直感的に理解する

ゴール:

Pythonで量子回路が動いた


量子ビットとは何か?

普通のコンピュータは bit を使います。

0 または 1

量子コンピュータは qubit(量子ビット) を使います。

0 と 1 の重ね合わせ

つまり:

0でもあり1でもある状態

を扱えます。

これが量子コンピューティングの出発点です。

量子回路とは何か?

普通のプログラム:

入力 → 計算 → 出力

量子プログラム:

量子状態 → 量子ゲート → 測定

この処理の流れを 量子回路(quantum circuit) と呼びます。


Qiskitをインストールする

Pythonで量子プログラムを書くには Qiskit を使います。

インストール:

pip install qiskit

最初の量子回路を書いてみる

では実際に書いてみましょう。

quantum_circuit_intro.py
from qiskit import QuantumCircuit

qc = QuantumCircuit(1,1)

qc.h(0)

qc.measure(0,0)

print(qc.draw("text"))

出力:

     ┌───┐┌─┐
  q: ┤ H ├┤M├
     └───┘└╥┘
c: 1/══════╩═
           0 

これがあなたの最初の量子回路です 🎉


このコードは何をしているのか?

順番に説明します。

① 量子ビットを作る

qc = QuantumCircuit(1, 1)

意味:

量子ビット1個
古典ビット1個

を用意しています。

ここで、QuantumCircuit(1, 1) は「量子ビットを1個、測定結果を書き込む古典ビットを1個持つ量子回路」を作成するコードです。
ここではqc という変数に量子回路オブジェクトを保存しています。

その後 qc.h(0) のように書くことで、この回路に量子ゲートを順番に追加していきます。

ここは少し詳しく紹介した方が良い部分だと思われるので、流れをとぎらせないよう、後で解説を追加します。


② Hadamardゲートを適用する

qc.h(0)

Hadamardゲートは:

0 → 0と1の重ね合わせ

に変換します。

つまり:

|0⟩ → (|0⟩ + |1⟩) / √2

になります。

③ 測定する

qc.measure(0, 0)

量子状態を観測すると:

0 または 1

どちらかに確定します。


実際に実行してみる

次はシミュレータで実行します。

quantum_simulator_intro.py
from qiskit import QuantumCircuit
from qiskit import transpile
from qiskit_aer import AerSimulator

qc = QuantumCircuit(1,1)

qc.h(0)

qc.measure(0,0)

simulator = AerSimulator()

compiled = transpile(qc, simulator)

job = simulator.run(compiled, shots=1000)

result = job.result()

counts = result.get_counts()

print(counts)

出力例:

{'1': 474, '0': 526}
{'1': 472, '0': 528}

ほぼ半分ずつになりました。


なぜ50%になるのか?

Hadamardゲートは:

0 → 50%
1 → 50%

の確率状態を作ります。

つまり測定すると:

0が出る確率 = 50%
1が出る確率 = 50%

になります。

これが量子コンピューティングの最初の重要ポイントです。

量子計算は確率で結果が出る


古典コンピュータとの違い

普通のコンピュータ:

入力が同じなら結果は同じ

量子コンピュータ:

入力が同じでも結果は確率

です。

しかしこの確率を干渉させることで高速化が起きます。

これが量子アルゴリズムの核心です。


今日のまとめ

この記事では:

  • 量子ビットを理解した
  • Hadamardゲートを使った
  • 測定を実行した
  • 確率結果を確認した

つまり:

Pythonで最初の量子回路を動かした

ところまで到達しました 🎯


次回予告

次回は:

なぜ量子回路は確率になるのか?

をもう少しだけ深く説明します。

キーワード:

  • 重ね合わせ
  • 測定
  • 状態ベクトル
  • シミュレータの仕組み

量子コンピューティングの「ブラックボックス感」がここで消えます。

コラム①:量子プログラミング詳解

qc = QuantumCircuit(1, 1) 部分の意味合いは、「量子ビット1個 古典ビット1個」であると書きました。 この部分qcがどういう変数で、どうしてこういう意味になるのか分からず、次への繋がりが見えない懸念があります。ここは、とても重要なポイントです。ここが分からないと 量子回路=魔法のAPI呼び出し に見えてしまいます。

結論から言うと:

qc = QuantumCircuit(1, 1)

は

「量子回路オブジェクトを作っている」

コードであり、その引数 (1, 1) は

量子ビット1個、古典ビット1個を持つ回路を定義する

という意味です。

順番に説明します。

① qc は何の変数か?

これは Python の普通の変数です。

例えば:

x = 10

なら:

x は整数

同様に:

qc = QuantumCircuit(1, 1)

は:

qc は QuantumCircuit 型のオブジェクト

です。

つまり:

qc = 量子回路そのもの

です。

② QuantumCircuit は何か?

これは Qiskit が提供しているクラスです。

つまり:

QuantumCircuit(...)

は

量子回路を作るための設計図

です。

例:

from qiskit import QuantumCircuit

を実行すると:

QuantumCircuit クラスが使えるようになる

③ (1, 1) は何を意味するのか?

ここが一番重要です。

QuantumCircuit(1, 1)

は:

QuantumCircuit(量子ビット数, 古典ビット数)

という意味です。

つまり:

QuantumCircuit(1, 1)

=

量子ビット 1 個
古典ビット 1 個

を持つ回路を作る

という意味です。

④ なぜ古典ビットが必要なのか?

量子回路では最後に必ず:

測定(measurement)

を行います。

測定すると:

量子ビット → 古典ビット

に変換されます。

つまり:

qc.measure(0, 0)

は:

量子ビット0 を 古典ビット0 に保存

という意味です。

だから最初に:

QuantumCircuit(1, 1)

と書いておく必要があります。

⑤ 実際の回路イメージ

このコード:

qc = QuantumCircuit(1, 1)

は頭の中ではこうなっています:

量子ビット:   q0

古典ビット:   c0

まだ何も操作していない状態です。

⑥ 次の行とどう繋がるのか?

次に:

qc.h(0)

を書くと:

量子ビット q0 に Hadamard を適用

になります。

さらに:

qc.measure(0, 0)

を書くと:

q0 → c0 に測定結果を保存

になります。

つまり流れは:

回路を作る
↓
量子ゲートを置く
↓
測定する

です。

⑦ 図で理解するとこうなる

最初:

qc = QuantumCircuit(1, 1)

状態:

q0: ─────

c0: ─────

次:

qc.h(0)

状態:

q0: ──H──

c0: ─────

次:

qc.measure(0, 0)

状態:

q0: ──H──M──

c0: ────────

⑧ なぜこれが「量子回路」なのか?

QuantumCircuit は実は:

量子ゲートの並びを保存するオブジェクト

です。

つまり:

qc.h(0)

は

Hadamard を実行

ではなく:

Hadamard を回路に追加

です。

ここは、いわゆる「普通」の 関数実行イメージ と違う部分として、意識しておくとよいでしょう(オブジェクト・プログラミングとしては、とくに「異常」なことをやっているわけではないこともわかると思いますが)。

では、なぜこの1行の式が量子計算の出発点なのか?次のコラムで見ていきます。

コラム②:Hadamardゲートとは何をしているのか?

量子回路の最初の例としてよく登場するのが次の操作です:

$$
H|0\rangle = \frac{|0\rangle + |1\rangle}{\sqrt{2}}
$$

これは Hadamardゲート(アダマールゲート) と呼ばれます。

この1行には、量子コンピューティングの最も重要な性質がすべて含まれています。

このコラムでは:

  • Hadamardゲートとは何か
  • なぜ重要なのか
  • 古典計算とどう違うのか

を直感的に説明します。

Hadamardゲートとは何か?

一言で言うと:

量子ビットを「0」から「0と1の重ね合わせ状態」に変換する操作

です。

普通のビットは:

0 または 1

のどちらかしか取れません。

しかし量子ビットは:

0 と 1 が同時に存在

できます。

この状態を作る最も基本的な操作が Hadamardゲートです。


なぜ √2 で割るのか?

式の中に出てくる:

1 / √2

には意味があります。

量子状態では:

確率の合計は必ず1になる

というルールがあります。

係数を2乗すると確率になります:

(1/√2)^2 = 1/2

つまり:

0 が出る確率 = 50%
1 が出る確率 = 50%

になります。


Hadamardゲートは「確率」を作っているのか?

ここはとても重要なポイントです。

Hadamardゲートは:

ランダムな状態

を作っているのではありません。

作っているのは:

干渉できる状態

です。

この違いが量子アルゴリズムの本質です。


古典確率との違い

例えばコイン投げ:

表 or 裏

は確率です。

しかし量子状態は:

表と裏が同時に存在

しています。

そして後から:

強めたり
弱めたり
打ち消したり

できます。

これを 干渉(interference) と呼びます。次の大きなテーマです。

コラム③:Hadamardという語の由来、その数学的意味

Hadamardゲートの名前はフランスの数学者 Jacques Hadamard に由来します。
もともと情報を均等に分散する性質を持つ Hadamard 行列が、量子状態を重ね合わせ状態に変換する操作としてそのまま利用されています。
多くの量子アルゴリズムは次の形をしています:

① Hadamard
② 計算
③ Hadamard
④ 測定

つまり:

Hadamardは量子並列性の入口

です。

例:

  • Deutsch–Jozsa
  • Grover
  • Shor
  • QAOA
  • VQE

すべてHadamardから始まります。


Hadamardは実は「回転」である

もう少し数学的に言うと:

Hadamardゲートは次の行列です:

1/√2 * [ 1   1
         1  -1 ]

これは量子状態を:

別の座標系へ回転

させています。

つまり:

0 と 1 の軸

から

重ね合わせの軸

へ移動させています。


Hadamardは量子コンピューティングの出発点

量子回路を書くとき:

qc.h(0)

と書きます。

これは単なる1行ですが:

量子並列性の開始

を意味します。

つまり:

Hadamardを理解すると量子アルゴリズムの半分が理解できる

と言っても過言ではありません。

**Hadamard(アダマール)**という語は、フランスの数学者
Jacques Hadamard
に由来します。

量子コンピューティングの Hadamardゲートは、この数学者の名前が付いた Hadamard行列(Hadamard matrix) をそのまま量子ビット操作として使っているものです。


① Jacques Hadamard とは誰か?

Jacques Hadamard(1865–1963)は次の分野で重要な業績を残しました:

  • 行列理論
  • 関数解析
  • 数論(素数定理)
  • 偏微分方程式
  • 変分法

その中でも量子計算に関係するのが:

Hadamard行列

です。


② Hadamard行列とは何か?

Hadamard行列は:

要素が +1 と −1 だけで構成され、互いに直交する行列

です。

最も基本的な例は:

$$
\frac{1}{\sqrt{2}}
\begin{pmatrix}
1 & 1
1 & -1
\end{pmatrix}
$$

これがそのまま量子コンピューティングの Hadamardゲート になります。

つまり:

Hadamardゲート = Hadamard行列の量子版

です。


③ なぜこの行列が重要だったのか?

Hadamard行列はもともと:

  • 信号処理
  • 誤り訂正符号
  • 統計設計
  • フーリエ解析の簡略版

などで使われていました。

特徴は:

情報を「均等に分散」させる

ことです。

そして量子計算では:

1つの状態
↓
複数の状態へ均等に広げる

操作として使われます。

これが重ね合わせ(superposition)の生成です。


④ なぜ量子コンピュータで採用されたのか?

Hadamard行列は次の性質を持ちます:

① 長さを変えない
② 直交性を保つ
③ 逆行列が自分自身

つまり:

量子力学で許される変換(ユニタリ変換)

になっています。

そのため:

量子状態を壊さず
均等に広げる

操作として理想的です。


⑤ Hadamardゲートの意味を数学的に言い直すと

Hadamardは:

$$
|0\rangle \rightarrow \frac{|0\rangle + |1\rangle}{\sqrt{2}}
$$

だけでなく:

$$
|1\rangle \rightarrow \frac{|0\rangle - |1\rangle}{\sqrt{2}}
$$

にも変換します。

つまり:

0と1の基底
↓
重ね合わせ基底

へ座標変換しています。

これは実質的に:

量子版のフーリエ変換(最小ケース)

です。


⑥ 名前が残った理由

量子ゲートの多くは:

  • Xゲート
  • Zゲート
  • CNOTゲート

のように記号名ですが、

Hadamardだけは:

歴史的な数学行列そのもの

なので人名が残っています。

つまり:

Hadamard行列をそのまま量子操作として使った

からです。

コラム④「係数を2乗すると確率になります」...係数?

「係数を2乗すると確率になります」...???

ここが分からないと:

「なぜ √2 が出てくるのか?」

がずっと不自然に見えます。

結論から言うと、

「係数」とは状態ベクトルの前についている数(=確率振幅)

のことです。

順番に説明します。


① まず「係数」とは何か(普通の数学)

例えば:

$$
3x + 2y
$$

では:

3 は x の係数
2 は y の係数

です。

同じことが量子状態でも起きています。


② 量子状態の式をもう一度見る

例えば:

$$
(|0\rangle + |1\rangle)/\sqrt{2}
$$

これは実は:

$$
\frac{1}{\sqrt{2}}|0\rangle + \frac{1}{\sqrt{2}}|1\rangle
$$

という意味です。

つまり:

状態 係数
$\lvert 0\rangle$ $\frac{1}{\sqrt{2}}$
$\lvert 1\rangle$ $\frac{1}{\sqrt{2}}$

です。

この前についている数が「係数」です。


③ なぜ係数が重要なのか?

量子力学では:

係数の2乗 = 観測される確率

になります。

つまり:

$$
\left(\frac{1}{\sqrt{2}}\right)^2 = \frac{1}{2}
$$

なので:

状態 確率
$\lvert 0\rangle$ 50%
$\lvert 1\rangle$ 50%

になります。


④ 係数の正式名称は「確率振幅」

係数には名前があります:

probability amplitude
(確率振幅)

重要なのは:

確率ではない

という点です。

確率は:

確率振幅²

です。


⑤ ベクトルとして見るともっと分かりやすい

実は:

$$
|0\rangle =
\begin{pmatrix}
1
0
\end{pmatrix}
$$

$$
|1\rangle =
\begin{pmatrix}
0
1
\end{pmatrix}
$$

でした。

なので:

$$
\frac{|0\rangle + |1\rangle}{\sqrt{2}}
$$

は:

$$
\frac{1}{\sqrt{2}}
\begin{pmatrix}
1
1
\end{pmatrix}
$$

です。

このとき:

要素 係数
上の成分 $(1/\sqrt{2})$
下の成分 $(1/\sqrt{2})$

です。


⑥ なぜ2乗すると確率になるのか?

量子力学にはルールがあります:

状態ベクトルの長さは1でなければならない

つまり:

$$
|a|^2 + |b|^2 = 1
$$

である必要があります。

例えば:

$$
a = \frac{1}{\sqrt{2}},\quad b = \frac{1}{\sqrt{2}}
$$

なら:

$$
\frac{1}{2} + \frac{1}{2} = 1
$$

になります。

この:

|a|²

が確率になります。


⑦ 直感的に理解する方法

量子状態:

$$
a|0\rangle + b|1\rangle
$$

は:

状態 出現確率
$\lvert 0\rangle$ $\lvert a\rvert^2$
$\lvert 1\rangle$ $\lvert b\rvert^2$

になります。

つまり:

係数の大きさが観測確率を決める

という意味です。


⑧ なぜ「2乗」なのか?

これは量子力学の基本法則:

Bornの規則(ボルンの規則)

です。

内容:

観測確率 = 振幅の絶対値の2乗

つまり:

$$
P = |\text{amplitude}|^2
$$

です。

量子計算もこの法則に従っています。

あらためて、整理します。

量子状態では ($|0\rangle$) や ($|1\rangle$) の前についている数を「確率振幅(probability amplitude)」と呼びます。
観測したときの確率はこの値の2乗で決まります。

例えば:

$$
(|0\rangle + |1\rangle)/\sqrt{2}
$$

では係数は ($1/\sqrt{2}$) なので、

$$
(1/\sqrt{2})^2 = 1/2
$$

となり、0 と 1 がそれぞれ 50% の確率で観測されます。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?