OpenQASM 量子回路講座
何も知らないところから、回路を説明できるまで。
『干渉する』『重ね合わせる』だけでは説明したことにしない。結果→数字→図→OpenQASMの順で、同じ変化を複数の見方から確認する。
はじめに
最初に知ってほしいこと
この教材は、量子力学の用語集ではありません。量子回路を『入力を準備し、操作し、最後に0/1を読む手順』として学びます。抽象語を暗記せず、同じ回路を何度も実行したときの結果を予測できることを目標にします。
全体の学習順
| 段階 | 章 | ここで初めて扱うもの |
|---|---|---|
| A 観測 | 0〜2章 | 0/1、回路、測定、shot、確率 |
| B 状態 | 3〜6章 | 振幅、H、Z、干渉、測定基底 |
| C 複数量子ビット | 7〜9章 | bit列、CX、Bell状態、もつれ |
| D 言語 | 10〜13章 | OpenQASMの宣言、配列、制御、部品化 |
| E 実機 | 14章 | 時間、barrier、ノイズ、トランスパイル |
| F アルゴリズム | 15〜17章 | Oracle、Grover、QUBO、QAOA |
| G マスター | 18章 | 移行、デバッグ、総合制作 |
この本で使う6段階テンプレート
- •結果を見る: 何を何回測ると、0と1が何回出るか。
- •言葉を付ける: 見た結果または計算手順にだけ新語を付ける。
- •数字で追う: 状態の数字を一行ずつ更新する。
- •回路図で追う: 左から右へ同じ操作を追う。
- •OpenQASMで追う: 上から下へ同じ操作を追う。
- •予測する: 実行前に結果を答えてから確認する。
CHAPTER 00
0と1、回路、測定
量子回路は何をする図なのか
0.1 まず普通のbitから
普通のコンピュータが扱うbitは、読んだ瞬間に0か1のどちらかです。電圧が低ければ0、高ければ1という実装が代表例です。ここでは物理方式ではなく、『答えが0か1の1桁』だけを使います。
0.2 量子回路も最後は0か1を返す
量子ビットは途中で古典bitより多くの状態を持てます。しかし最後に通常の方法で測ると、1回の実行から得られる答えは0か1のどちらか1つです。途中の状態と、最後に読める答えを混同しないことが最初のポイントです。
0.3 回路図は処理の時間表
横線1本は同じqubitの時間の流れです。左が開始、右が終了です。線上の箱は、その時点で状態を変える命令です。測定記号の位置で0/1を読みます。
0.4 OpenQASMは同じ手順を文字で書く
OPENQASM 3.1;
include "stdgates.inc";
qubit q;
bit result;
result = measure q;| OPENQASM 3.1; | 使う言語の版を宣言する |
| include "stdgates.inc"; | 標準ゲート名を使えるようにする |
| qubit q; | qというqubitを1個用意する |
| bit result; | 測定結果を入れる古典bitを用意する |
| result = measure q; | qを測り、0または1をresultへ入れる |
0.5 最初の実験
| 確認するもの | 内容 |
|---|---|
| 開始 | qは通常|0>から始まる |
| 操作 | 何もせずに測定 |
| 測定結果 | 理想的には必ず0 |
| 理由 | 開始時点で0として読める状態だから |
理解チェック
- 1回路図では時間はどちらへ進むか。
- 21回の通常測定で得られる答えはいくつか。
- 3qubitとbitは同じか。
CHAPTER 01
Xゲートで0と1を反転する
最も単純なゲートを完全に予測する
1.1 まず結果だけを見る
Xを1回
| 確認するもの | 内容 |
|---|---|
| 開始 | |0> |
| 操作 | Xを1回適用して測定 |
| 測定結果 | 必ず1 |
| 理由 | Xは0として読める状態を1として読める状態へ交換する |
| 入力 | Xの後 | 測定 |
|---|---|---|
| |0> | |1> | 1 |
| |1> | |0> | 0 |
1.2 Xを2回かける
|0> → X → |1> → X → |0>です。最初へ戻るので、Xは自分自身が逆操作です。
OPENQASM 3.1;
include "stdgates.inc";
qubit q;
bit result;
x q;
result = measure q;| x q; | qにXゲートを1回適用する |
| result = measure q; | Xの後のqを測るので、理想的には1 |
理解チェック
- 1|1>へXをかけると何になるか。
- 2|0>へXを2回かけて測ると何が出るか。
- 3x q; の q は何を表すか。
CHAPTER 02
1回と1000回を区別する
確率はどこから分かるのか
2.1 1回の結果だけでは割合は分からない
ある準備から0が出やすいのか1が出やすいのかを知るには、同じプログラムを最初から何度も実行します。各回は新しいqubitを準備する独立した実験です。
| 回路 | 1 shot | 1000 shotsの理想的な集計 |
|---|---|---|
| 何もしない→測定 | 0 | 0: 1000回 |
| X→測定 | 1 | 1: 1000回 |
| 後で学ぶH→測定 | 0または1 | 0と1が約500回ずつ |
2.2 OpenQASMと実行サービスの役割を分ける
OpenQASMは『1回のプログラムで何をするか』を書きます。1000 shots実行する設定、実行先のシミュレータや実機の選択、集計グラフの作成は、通常SDKや実行サービス側の仕事です。
理解チェック
- 11000 shotsとは何を1000回行うことか。
- 2shotsは通常OpenQASMのどこに書くか。
- 3理想的なX→測定を1000 shots行うとどうなるか。
CHAPTER 03
測定前の状態を2個の数字で記録する
なぜ確率だけでは足りないのか
3.1 状態カード [a, b]
1qubitの測定前の状態を、2個の数字 [a, b] で記録します。左のaは0側、右のbは1側の数字です。この教材では、まず実数だけを使います。
| 状態 | 状態カード | 0の確率 | 1の確率 |
|---|---|---|---|
| |0> | [1, 0] | 1² = 1 | 0² = 0 |
| |1> | [0, 1] | 0² = 0 | 1² = 1 |
| 50:50の例 | [1/√2, 1/√2] | (1/√2)² = 1/2 | (1/√2)² = 1/2 |
3.2 √2を怖がらない
√2は『2乗すると2になる正の数』で、約1.414です。1/√2は約0.707で、2乗すると1/2になります。したがって [1/√2, 1/√2] は0と1が50%ずつになる状態カードです。
3.3 マイナスの振幅も確率は正になる
[1/√2, -1/√2]でも、2乗すれば0側も1側も1/2です。直後に測るだけなら、プラスかマイナスかは回数分布に見えません。しかし後のゲートは振幅を足し引きするため、符号の違いが別の測定結果へ変わります。
理解チェック
- 1状態カード[1,0]の測定結果は何か。
- 21/√2の2乗はいくつか。
- 3振幅−1/√2は負の確率を意味するか。
CHAPTER 04
Hゲートを計算で理解する
50:50を作るだけの箱ではない
4.1 Hの規則は2つ
Hゲートは入力の0側振幅aと1側振幅bから、新しい2個の振幅を作ります。新しい0側は(a+b)/√2、新しい1側は(a−b)/√2です。最初はこの式へ数字を代入するだけで十分です。
4.2 |0>へHをかける
|0>の状態カードは[1,0]です。0側は(1+0)/√2=1/√2、1側は(1−0)/√2=1/√2。したがってH|0>=[1/√2,1/√2]です。測定すると0と1が50%ずつです。
4.3 |1>へHをかける
|1>は[0,1]です。0側は(0+1)/√2=1/√2、1側は(0−1)/√2=−1/√2。したがってH|1>=[1/√2,−1/√2]です。直後の通常測定は50:50ですが、符号が異なります。
確率 = 振幅の2乗
| 入力 | Hの計算 | 出力 | 通常測定 |
|---|---|---|---|
| |0>=[1,0] | [(1+0)/√2,(1−0)/√2] | |+> | 0/1が50:50 |
| |1>=[0,1] | [(0+1)/√2,(0−1)/√2] | |-> | 0/1が50:50 |
OPENQASM 3.1;
include "stdgates.inc";
qubit q;
bit result;
h q;
result = measure q;| h q; | |0>=[1,0]へHを適用し、|+>を作る |
| measure | 1 shotでは0か1、複数shotsでは約50:50 |
4.4 Hを2回かける
|+>=[1/√2,1/√2]へもう一度Hをかけます。新しい0側は(1/√2+1/√2)/√2=1、新しい1側は(1/√2−1/√2)/√2=0です。結果は[1,0]=|0>です。Hも自分自身が逆操作です。
理解チェック
- 1H|0>の状態カードは何か。
- 2H|1>の1側振幅がマイナスになる理由は何か。
- 3Hを2回かけるとどうなるか。
CHAPTER 05
Zゲートと『干渉』を数字から理解する
見えない符号を、見える0/1へ変換する
5.1 Zの規則
Zゲートは状態カード[a,b]を[a,−b]へ変えます。0側は変えず、1側の振幅だけ符号を反転します。
| 入力 | Zの後 | 直後の通常測定 |
|---|---|---|
| |0>=[1,0] | [1,0] | 必ず0 |
| |1>=[0,1] | [0,-1] | 必ず1 |
| |+>=[1/√2,1/√2] | [1/√2,-1/√2]=|-> | 0/1が50:50 |
5.2 なぜ[0,−1]も測定では1なのか
0の確率は0²=0、1の確率は(−1)²=1だからです。状態全体に同じ−を付けた[0,−1]と[0,1]は、どの測定でも区別できません。一方、[1/√2,1/√2]と[1/√2,−1/√2]は2成分の間の符号関係が違い、後のHで区別できます。
5.3 H-Z-Hを一行ずつ計算する
| 時点 | 状態カード | 計算 |
|---|---|---|
| 開始 | [1,0] | |0> |
| 最初のH | [1/√2,1/√2] | |+> |
| Z | [1/√2,-1/√2] | |-> |
| 最後のH | [0,1] | 0側=(a+b)/√2=0、1側=(a−b)/√2=1 |
| 測定 | |1> | 必ず1 |
5.4 ここで初めて『干渉』と呼ぶ
最後のHでは、0側の新しい振幅を作るために1/√2と−1/√2を足しました。結果は0です。1側では1/√2から−1/√2を引いたので、結果は1です。このように、複数の振幅が同じ出力の振幅計算に入り、足し算または引き算で大きくなったり0になったりすることを干渉と呼びます。
OPENQASM 3.1;
include "stdgates.inc";
qubit q;
bit result;
h q;
z q;
h q;
result = measure q;| h q; | [1,0]→[1/√2,1/√2] |
| z q; | 1側だけ符号反転 |
| h q; | 和と差を計算し[0,1] |
| measure | 理想的には必ず1 |
理解チェック
- 1Zは状態カード[a,b]をどう変えるか。
- 2H-Z-Hで0側振幅が0になる足し算を書け。
- 3本書で干渉とは何か。
CHAPTER 06
測定基底は『何を区別して読むか』
Z基底とX基底を回路として理解する
6.1 測定器には答えのラベルが必要
通常のmeasureは、状態を|0>と|1>のどちらとして読むかを返します。しかし|+>と|->を区別したい場合、通常測定の直前にHを置きます。H|+>=|0>、H|->=|1>だからです。
| 準備状態 | Z基底測定 | X基底測定(H→measure) |
|---|---|---|
| |0> | 必ず0 | 0/1が50:50 |
| |1> | 必ず1 | 0/1が50:50 |
| |+> | 0/1が50:50 | 必ず0 |
| |-> | 0/1が50:50 | 必ず1 |
// |->を準備してX基底で測る
x q;
h q;
// X基底測定
h q;
result = measure q;| x; h; | |0>→|1>→|->を準備 |
| h; measure | |->→|1>へ変換し、通常測定で1 |
理解チェック
- 1通常のmeasureは何を区別するか。
- 2X基底で測る前に何を置くか。
- 3|+>をX基底で測ると何が出るか。
CHAPTER 07
2qubitを4個の候補で記録する
00、01、10、11は何を表すのか
7.1 2個の古典bitには4通りある
2個のbitを並べると、00、01、10、11の4通りです。2qubitの測定結果も、1 shotではこの4つのどれか1つです。3qubitなら000から111まで2³=8通りです。
7.2 2qubitの状態カード
2qubitでは、各候補00、01、10、11に対応する振幅を4個並べます。本書では[q[0]q[1]]の順に書き、状態カードを[a00,a01,a10,a11]とします。
| 状態 | 状態カード [00,01,10,11] | 測定 |
|---|---|---|
| |00> | [1,0,0,0] | 必ず00 |
| |01> | [0,1,0,0] | 必ず01 |
| 00と10が50:50 | [1/√2,0,1/√2,0] | 00または10 |
7.3 添字順と表示順は別問題
本書の説明ではq[0]q[1]の順でbit列を書きます。ただし、SDKや実行サービスが結果文字列をq[1]q[0]の順で表示する場合があります。意味を推測せず、Xを1個だけ置く最小テストで表示規則を確認します。
OPENQASM 3.1;
include "stdgates.inc";
qubit[2] q;
bit[2] c;
x q[0];
c = measure q;| qubit[2] q; | q[0]とq[1]の2qubitを用意 |
| x q[0]; | 本書の順では|00>→|10> |
| c = measure q; | 両方を測る。表示文字列の順は実行環境で確認 |
理解チェック
- 12qubitの測定候補はいくつか。
- 2|01>の4成分状態カードを書け。
- 3結果文字列の順を確認する最小テストは何か。
CHAPTER 08
CX/CNOTを4行の表で理解する
制御と標的を取り違えない
8.1 規則は『制御が1なら標的へX』
| 入力 q[0]q[1] | 制御q[0] | 標的q[1] | 出力 |
|---|---|---|---|
| 00 | 0 | 変えない | 00 |
| 01 | 0 | 変えない | 01 |
| 10 | 1 | 0→1 | 11 |
| 11 | 1 | 1→0 | 10 |
8.2 状態カード全体へ同じ規則を適用する
状態が複数候補の振幅を持つ場合も、各候補へ4行表を適用します。たとえば[1/√2,0,1/√2,0]は00と10が50:50です。CX q[0],q[1]をかけると00は00、10は11へ移るので、[1/√2,0,0,1/√2]になります。
OPENQASM 3.1;
include "stdgates.inc";
qubit[2] q;
bit[2] c;
x q[0];
cx q[0], q[1];
c = measure q;| x q[0]; | |00>→|10> |
| cx q[0],q[1]; | 制御が1なので標的0→1、|10>→|11> |
| measure | 理想的には11 |
8.3 引数を逆にすると別の回路
同じ入力|10>でもcx q[1],q[0]なら、制御q[1]は0なので何も起こらず|10>のままです。制御線と標的線は交換できません。
理解チェック
- 1CXの第1引数は何か。
- 2入力11へcx q[0],q[1]をかけると何か。
- 3入力10へcx q[1],q[0]をかけると何か。
CHAPTER 09
Bell状態ともつれ
各qubitが50:50なのに、2個を一緒に見ると規則がある
9.1 Hの後、CXをかける
| 時点 | 状態カード [00,01,10,11] | 意味 |
|---|---|---|
| 開始 | [1,0,0,0] | 必ず00 |
| H q[0] | [1/√2,0,1/√2,0] | 00と10の振幅 |
| CX q[0],q[1] | [1/√2,0,0,1/√2] | 10の振幅が11へ移る |
| 測定 | 00または11 | 理想的には各50% |
9.2 『各qubitだけ』を見ると50:50
00と11が半分ずつなので、q[0]だけ見ても0/1が50:50、q[1]だけ見ても0/1が50:50です。しかし2個を一緒に見ると、01と10は出ず、値が必ず一致します。個別の割合だけでは全体の関係を表せません。
9.3 CXは未知状態のコピーではない
制御が|0>または|1>だと、CXは標的を同じZ基底値へそろえるように見えます。しかし制御が|+>なら、出力は『制御|+>、標的|+>』ではなくBell状態です。各qubit単独の同じ状態を2個作ったわけではありません。
OPENQASM 3.1;
include "stdgates.inc";
qubit[2] q;
bit[2] c;
h q[0];
cx q[0], q[1];
c = measure q;| h q[0]; | 00と10へ同じ振幅を作る |
| cx q[0],q[1]; | 10の振幅を11へ移す |
| measure | 理想的には00と11だけ |
理解チェック
- 1このBell回路で出ないbit列は何か。
- 2各qubitだけの0/1割合はどうなるか。
- 3もつれだけで瞬時通信できるか。
CHAPTER 10
OpenQASM 3の骨格
宣言・操作・測定を自分で書く
10.1 1行は原則1つの文
| 種類 | 例 | 役割 |
|---|---|---|
| 版宣言 | OPENQASM 3.1; | 言語版を指定 |
| 読み込み | include "stdgates.inc"; | 標準ゲート名を定義 |
| 量子宣言 | qubit[2] q; | 2qubitを用意 |
| 古典宣言 | bit[2] c; | 2bitを用意 |
| ゲート | h q[0]; | 対象へH |
| 測定 | c = measure q; | 測定結果を保存 |
10.2 添字は0から始まる
qubit[3] q;で使える添字は0、1、2です。q[3]は4個目を意味するため範囲外です。個数3と最大添字2を区別します。
10.3 コメントは実行されない説明
// この行の右側は1行コメント
x q[0]; // q[0]を反転
/* 複数行の
コメント */10.4 完全なBellプログラム
OPENQASM 3.1;
include "stdgates.inc";
qubit[2] q;
bit[2] c;
h q[0];
cx q[0], q[1];
c = measure q;| 1〜2行 | 言語版と標準ゲートを用意 |
| 3〜4行 | 量子2個、結果保存用bit2個を宣言 |
| 5〜6行 | Bell状態を準備 |
| 7行 | 両qubitを測定 |
理解チェック
- 1qubit[4] q;で有効な最大添字は何か。
- 2セミコロンの主な役割は何か。
- 3include "stdgates.inc";は何を可能にするか。
CHAPTER 11
測定・reset・条件分岐
回路の途中で0/1を読み、その後の操作を変える
11.1 測定は最後だけではない
回路の途中でqubitを測り、その結果をbitへ保存できます。そのbitが0か1かによって、後のゲートを変えられる処理系があります。
11.2 resetは|0>へ準備し直す
reset q[0];11.3 ifで古典bitを確認する
bit m;
m = measure q[0];
if (m == 1) {
x q[1];
}| m | ifの条件 | q[1]への操作 |
|---|---|---|
| 0 | 偽 | 何もしない |
| 1 | 真 | Xを適用 |
11.4 測定したら元の重ね合わせは残らない
たとえば|+>を測ると、結果は0または1です。結果0なら測定後の状態は|0>、結果1なら|1>です。同じqubitを続けてもう一度通常測定すると、理想的には同じ値が出ます。
理解チェック
- 1qubitをifで直接q[0]==1と比較してよいか。
- 2reset後の理想状態は何か。
- 3動的回路と1000 shotsの違いは何か。
CHAPTER 12
型・入力・ループ
古典的な計算を量子命令の周りに置く
12.1 型は値の使い方を決める
| 型 | 例 | 用途 |
|---|---|---|
| bit / bit[n] | bit[3] c; | 測定結果 |
| bool | bool done=false; | 真/偽 |
| int / uint | uint[8] count; | 整数 |
| float | float[64] score; | 小数 |
| angle | angle theta; | 周期を持つ角度 |
| duration | duration t=100ns; | 時間 |
12.2 inputは回路外から値を受け取る
input angle theta;
output bit result;
qubit q;
ry(theta) q;
result = measure q;12.3 forは回数が決まった繰り返し
qubit[4] q;
for int i in [0:3] {
h q[i];
}iは0、1、2、3と変化し、4個のqubitへHを1回ずつ適用します。[0:3]は終端3を含みます。
12.4 whileは条件が真の間の繰り返し
bit success = 0;
while (success == 0) {
reset q;
h q;
success = measure q;
}理解チェック
- 1input angle theta;のthetaはどこから来るか。
- 2for int i in [0:3]は何回か。
- 3whileとshotsは同じか。
CHAPTER 13
角度付きゲートと回路の部品化
位相を角度へ広げ、gate・修飾子・defを使い分ける
13.1 +と−は位相0度と180度
これまでは振幅を実数で扱い、+と−だけを使いました。+の向きを0度、−の向きを180度と考えると、符号は位相の2つの特別な場合です。一般の量子回路では45度や90度など途中の向きも使います。
13.2 RYで0から1へ連続的に動かす
RY(θ)を|0>へかけると、状態はcos(θ/2)|0>+sin(θ/2)|1>になります。θ=0なら|0>、θ=π/2なら0/1が50:50、θ=πなら|1>です。πは180度なので、π/2は90度です。
| θ | RY(θ)|0> | 1の確率 |
|---|---|---|
| 0 | |0> | 0 |
| π/2 | (|0>+|1>)/√2 | 1/2 |
| π | |1> | 1 |
13.3 RX、RZ、RZZの役割
| ゲート | OpenQASM | 主に変えるもの |
|---|---|---|
| RX | rx(theta) q; | 0/1振幅と位相 |
| RY | ry(theta) q; | 0/1振幅。実数で追いやすい |
| RZ | rz(theta) q; | 1qubitの相対位相 |
| RZZ | rzz(theta) a,b; | 2qubitの関係に応じた位相 |
13.4 gateは量子操作の並びに名前を付ける
gate make_bell a, b {
h a;
cx a, b;
}
qubit[2] q;
make_bell q[0], q[1];13.5 修飾子は既存ゲートの使い方を変える
| 修飾子 | 例 | 意味 |
|---|---|---|
| ctrl @ | ctrl @ x q[0],q[1]; | 制御付きX、つまりCX |
| negctrl @ | negctrl @ x a,b; | 制御が0のとき適用 |
| inv @ | inv @ s q; | Sの逆操作 |
| pow(k) @ | pow(2) @ t q; | Tを2回相当 |
13.6 defは一般的なサブルーチン
def parity(bit[4] x) -> bit {
bit p = 0;
for int i in [0:3] {
p ^= x[i];
}
return p;
}| 比較 | gate | def |
|---|---|---|
| 主目的 | ユニタリな量子ゲート列 | 一般的な処理 |
| 戻り値 | なし | 持てる |
| 測定・古典処理 | 原則不向き | 扱える |
| 逆操作修飾 | 原則可能 | 一般には同じ意味で扱わない |
理解チェック
- 1Bell回路を部品化するならgateとdefのどちらが自然か。
- 2inv @ h q;は何と同じか。
- 3戻り値を返す古典処理には何を使うか。
CHAPTER 14
論理回路を実機で動かすまで
barrier、delay、pulse、ノイズ、トランスパイルを分離する
14.1 書いた回路がそのまま装置へ行くとは限らない
私たちはHやCXという論理的な命令を書きます。実機は限られた物理qubit、接続、基礎ゲートしか持ちません。そのため送信前に、同じ働きをする実機向け命令列へ変換します。
| 段階 | 例 | 確認すること |
|---|---|---|
| 論理回路 | H, CX | 意図した状態変化か |
| 配置 | 論理q[0]→物理qubit 7 | 良いqubitを選べたか |
| 経路変換 | SWAPを追加 | 接続制約を満たすか |
| 基礎ゲート分解 | CX→装置固有命令 | 装置が受け付けるか |
| 実行 | pulseを再生 | ノイズと時間 |
14.2 barrierは状態を変えるゲートではない
h q[0];
barrier q;
cx q[0], q[1];14.3 delayは待つ時間を明示する
delay[100ns] q[0];14.4 pulseは物理信号
14.5 理想的50:50と汚れた結果を分ける
H|0>は理想的には0/1が50:50です。実機で48:52になっても、1000 shotsの有限回数による揺れかもしれません。一方、Bell回路で本来出ない01や10が継続的に出るなら、ゲートや読み出しの誤差を疑います。
理解チェック
- 1barrierは理想状態を反転するか。
- 2トランスパイルは何へ変換するか。
- 3Hの48:52は直ちに故障を意味するか。
CHAPTER 15
アルゴリズム・回路・Oracleを分ける
Groverが『答えを知っている』ように見える理由をほどく
15.1 アルゴリズムは設計図、回路は命令列
| 層 | Groverの例 | 役割 |
|---|---|---|
| 問題 | 4候補から条件を満たすものを探す | 何を解くか |
| アルゴリズム | 均等化→印付け→増幅→測定 | 解き方 |
| 量子回路 | H、Oracle回路、拡散回路 | 実行可能なゲート列 |
| OpenQASM | h q; cx ...; | 回路を文字で記述 |
15.2 Oracleは答え生成器ではなく判定器
たとえば候補10だけを正解とするOracleを作るには、『入力が10なら真』という検査規則を回路化します。これは候補10を最初から読み出しているのではなく、入力された各候補が条件に一致するかを同じ規則で検査しています。古典探索でも、候補を試すたびに同じ検査が必要です。
縦は振幅(符号あり)。確率は振幅の2乗なので、この時点では全候補25%のまま
15.3 『最適』と『条件一致』を区別する
通常のGrover Oracleは、候補が指定条件を満たすかを判定します。VRPの最短経路を自動的に知っているわけではありません。最適化へ使うなら、ある閾値以下かを判定して閾値を更新するなど、追加の古典手順が必要です。
理解チェック
- 1アルゴリズムと量子回路は同じか。
- 2Oracleは候補に何をするか。
- 3VRP Oracleは自動的に最短経路を知っているか。
CHAPTER 16
Groverを4候補で完全計算する
印を付けただけで、なぜ正解が測りやすくなるのか
16.1 候補を00、01、10、11とする
2qubitへHをかけると、4候補の振幅はすべて1/2になります。各確率は(1/2)²=1/4なので、測定すればどれも25%です。
16.2 Oracleで10だけ符号を反転
候補10を条件一致とします。Oracle後の状態カードは[1/2,1/2,−1/2,1/2]です。確率はまだ全部1/4なので、この時点で測っても成功率は25%のままです。
16.3 平均まわりの反転を数字で行う
4つの振幅の平均は(1/2+1/2−1/2+1/2)/4=1/4です。各新振幅を『2×平均−古い振幅』で計算します。
| 候補 | 古い振幅 | 2×平均−古い振幅 | 新振幅 |
|---|---|---|---|
| 00 | 1/2 | 1/2−1/2 | 0 |
| 01 | 1/2 | 1/2−1/2 | 0 |
| 10 正解 | −1/2 | 1/2−(−1/2) | 1 |
| 11 | 1/2 | 1/2−1/2 | 0 |
縦は振幅(符号あり)
16.4 これが干渉の具体的な中身
候補00、01、11の振幅計算は0になり、候補10の計算は1になりました。『正解を強めた』とは、振幅を足し引きする回路により、正解以外の新振幅が0、正解の新振幅が1になったという意味です。
16.5 一般には繰り返し回数を選ぶ
候補数Nに対し正解数が少ない場合、Oracleと拡散を約√N回の規模で繰り返します。繰り返しすぎると正解振幅が再び下がるため、無限に実行すればよいわけではありません。
理解チェック
- 1Oracle直後の10の確率はいくつか。
- 24振幅の平均はいくつか。
- 3拡散後の状態カードは何か。
CHAPTER 17
QUBOからQAOA回路へ
問題の数式化と、解く回路を混同しない
17.1 最適化は候補ごとに点数を付ける
2人x0,x1を別グループへ分ける簡単なMaxCutを考えます。xi=0ならグループA、1ならBです。2人が別なら得点1、同じなら0とします。
| x0x1 | 同じ/別 | 得点 C |
|---|---|---|
| 00 | 同じ | 0 |
| 01 | 別 | 1 |
| 10 | 別 | 1 |
| 11 | 同じ | 0 |
17.2 QUBOは問題を0/1の二次式へ翻訳する
この得点はC=x0+x1−2x0x1と書けます。00なら0、01なら1、10なら1、11なら0です。表の4行へ代入して確認できます。
17.3 QUBOをIsing表現へ写す
QUBO変数x∈{0,1}を、Ising変数z∈{+1,−1}へx=(1−z)/2で置き換えられます。2人MaxCutの得点はC=(1−z0z1)/2になります。量子回路ではzの役割をZ演算子へ置き換え、候補ごとのコストに応じた位相変化を作ります。
17.4 QAOAはQUBO由来のコストを回路で評価する
| 段階 | 量子/古典 | 役割 |
|---|---|---|
| Hで初期化 | 量子 | 全候補へ振幅 |
| Cost(γ) | 量子 | 候補のコストに応じて振幅の角度を変える |
| Mixer(β) | 量子 | 候補間の振幅を混ぜ、測定確率を変える |
| 測定 | 量子→古典 | 候補bit列を得る |
| コスト集計 | 古典 | 候補の平均得点を計算 |
| γ,β更新 | 古典 | 次の回路実行へ角度を渡す |
量子側(OpenQASMで表す中心部分)
古典側(通常OpenQASMの外側)
17.5 2変数1層のOpenQASM骨格
OPENQASM 3.1;
include "stdgates.inc";
input angle gamma;
input angle beta;
output bit[2] result;
qubit[2] q;
h q;
rzz(2 * gamma) q[0], q[1];
rx(2 * beta) q;
result = measure q;| h q; | 00,01,10,11を均等に準備 |
| rzz(...) | x0x1の関係に対応するCostの一部 |
| rx(...) | Mixerで振幅を再配分 |
| measure | 候補を読む |
| gamma,beta | 回路外の古典オプティマイザが更新 |
理解チェック
- 1QUBOは量子回路か。
- 2QAOAの角度更新は通常どこで行うか。
- 3CostとMixerの役割を1文ずつ述べよ。
CHAPTER 18
OpenQASM 2から3への移行と総合デバッグ
正しいコード・正しい論理・実機対応を別々に検査する
18.1 同じBell回路を比較する
| OpenQASM 2 | OpenQASM 3 |
|---|---|
| OPENQASM 2.0; | OPENQASM 3.1; |
| include "qelib1.inc"; | include "stdgates.inc"; |
| qreg q[2]; | qubit[2] q; |
| creg c[2]; | bit[2] c; |
| measure q -> c; | c = measure q; |
| if (c==1) x q[0]; | if (c == 1) { x q[0]; } |
18.2 エラーを3層へ分ける
| 症状 | まず確認 | 最小修正 |
|---|---|---|
| parse error | 版、;、括弧、綴り | 失敗行まで削り1行ずつ戻す |
| undefined gate | includeと大文字小文字 | stdgates.incとゲート名を確認 |
| 結果が逆 | 制御/標的、bit順 | 片方だけXの最小テスト |
| 50:50のはずが必ず0 | Hがあるか、測定基底 | 状態カードを各行で更新 |
| 実機が拒否 | 対応機能とISA | 対象実機へトランスパイル |
| 少数の誤結果 | shotsとノイズ | 理想シミュレータと比較 |
18.3 デバッグの固定手順
- 1期待する入力と理想測定分布を紙に書く。
- 2回路を最小化し、1ゲートずつ状態カードを更新する。
- 3構文だけをパーサで確認する。
- 4理想シミュレータで回数分布を確認する。
- 5bit表示順を片側Xで確認する。
- 6対象実機へトランスパイルし、追加ゲートと深さを確認する。
- 7実機結果を理想分布と比較し、ノイズを分離する。
18.4 マスター制作
| 課題 | 必須成果物 |
|---|---|
| A 量子コイントス | 入力角thetaでRYを変え、理想確率とshotsの揺れを説明 |
| B Bell相関テスター | 4種類のBell状態を準備し、Z/X基底で相関を比較 |
| C 2bit Grover | Oracle条件を変更できる回路と、4成分振幅の全計算 |
| D 2変数QAOA | QUBO表、Cost/Mixer回路、外側の角度更新を分離 |
| E 移行・デバッグ | QASM2コードを3へ移行し、3種類の故障を修正 |
理解チェック
- 1構文エラーと論理エラーの違いは何か。
- 2実機拒否を論理ミスと決めつけてよいか。
- 3マスター判定でコード以外に必要なものは何か。
付録 A
最小用語集
| 用語 | この本での意味 |
|---|---|
| qubit | 測定前の状態を振幅で記録し、通常測定で0/1を返す量子情報単位 |
| 振幅 | 確率を計算する前の数。絶対値の2乗が確率 |
| H | [a,b]を[(a+b)/√2,(a−b)/√2]へ変えるゲート |
| Z | [a,b]を[a,−b]へ変えるゲート |
| 干渉 | 複数振幅が同じ出力振幅の足し引きへ入り、大きさが変わること |
| Z基底 | |0>と|1>を区別する通常測定 |
| X基底 | |+>と|->を区別する測定。H後に通常測定 |
| CX | 制御が1の成分で標的へXを適用する2qubitゲート |
| もつれ | 全体状態を各qubit独立の状態として表せない状態 |
| shot | 準備から測定までの量子プログラム全体の独立1回実行 |
| Oracle | 候補が条件を満たすかを回路で判定し、位相印を付ける部品 |
| QUBO | 0/1変数の一次・二次式で表した最適化問題 |
| QAOA | CostとMixerを使い、古典側で角度を更新するゲート型アルゴリズム |
付録 B
ゲート早見表
| ゲート | OpenQASM | 最初に確認する役割 |
|---|---|---|
| X | x q; | |0>と|1>を交換 |
| H | h q; | 和と差で振幅を作り直す |
| Z | z q; | 1側振幅の符号を反転 |
| CX | cx a,b; | aが1の成分でbをX反転 |
| RX/RY/RZ | rx(theta) q; | 指定軸まわりの角度付き回転 |
| SWAP | swap a,b; | 2qubitの状態を交換 |
付録 C
数学メモ
- •1/√2 ≈ 0.707、(1/√2)² = 1/2。
- •確率の合計は1。1qubitの実数振幅ならa²+b²=1。
- •負の振幅は負の確率ではない。確率は振幅の絶対値の2乗。
- •H[a,b]=[(a+b)/√2,(a−b)/√2]。
- •Grover拡散の学習用計算: 新振幅=2×全振幅の平均−古い振幅。
付録 D
学習チェックリスト
- X/H/Zを状態カードで計算できる
- H-Z-Hで0側と1側の足し引きを書ける
- Z基底とX基底を回路で区別できる
- CXの4入力を暗記でなく規則から答えられる
- Bell回路の4成分状態を追える
- OpenQASMの宣言・ゲート・測定を書ける
- 中間測定とshotsを区別できる
- Oracleが答え生成器でない理由を説明できる
- 2bit Groverの振幅を全計算できる
- QUBOとQAOA回路を区別できる
- 論理回路と実機向け回路を区別できる
付録 E
公式資料
まずは、ひとつの課題から。
必要な能力をはっきりさせたい。実践力を確かめたい。任せられる人やチームを選びたい。
QVillagerは、量子分野の仕事と実力をつなぐ場所です。
そして、自分の力を実践で見せたいすべての挑戦者へ。
