本文へスキップ
QVILLAGERロゴQVILLAGER
OpenQASM 3.1

OpenQASM 量子回路講座

何も知らないところから、回路を説明できるまで。

『干渉する』『重ね合わせる』だけでは説明したことにしない。結果→数字→図→OpenQASMの順で、同じ変化を複数の見方から確認する。

入門 → マスター読了 約4時間全19章 + 付録A–E
OpenQASM 3.1量子回路Bell状態GroverQAOA

はじめに

最初に知ってほしいこと

この教材は、量子力学の用語集ではありません。量子回路を『入力を準備し、操作し、最後に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を読みます。

q[0]XXを適用測定
1回路図は左から右へ読む。q[0]にXを行い、その後で測る。

0.4 OpenQASMは同じ手順を文字で書く

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. 1回路図では時間はどちらへ進むか。
  2. 21回の通常測定で得られる答えはいくつか。
  3. 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
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|1>へXをかけると何になるか。
  2. 2|0>へXを2回かけて測ると何が出るか。
  3. 3x q; の q は何を表すか。

CHAPTER 02

1回と1000回を区別する

確率はどこから分かるのか

2.1 1回の結果だけでは割合は分からない

ある準備から0が出やすいのか1が出やすいのかを知るには、同じプログラムを最初から何度も実行します。各回は新しいqubitを準備する独立した実験です。

回路1 shot1000 shotsの理想的な集計
何もしない→測定00: 1000回
X→測定11: 1000回
後で学ぶH→測定0または10と1が約500回ずつ

2.2 OpenQASMと実行サービスの役割を分ける

OpenQASMは『1回のプログラムで何をするか』を書きます。1000 shots実行する設定、実行先のシミュレータや実機の選択、集計グラフの作成は、通常SDKや実行サービス側の仕事です。

理解チェック

  1. 11000 shotsとは何を1000回行うことか。
  2. 2shotsは通常OpenQASMのどこに書くか。
  3. 3理想的なX→測定を1000 shots行うとどうなるか。

CHAPTER 03

測定前の状態を2個の数字で記録する

なぜ確率だけでは足りないのか

3.1 状態カード [a, b]

1qubitの測定前の状態を、2個の数字 [a, b] で記録します。左のaは0側、右のbは1側の数字です。この教材では、まず実数だけを使います。

[a, b]状態カード
0側: a → a²
0の確率 = a²
[a, b]状態カード
1側: b → b²
1の確率 = b²
2状態カード[a, b]から、振幅を2乗して0/1の測定確率を求める流れ例 [1/√2, 1/√2] → [1/2, 1/2] → 0と1が50%ずつ。振幅と確率は別物で、確率は振幅を2乗して求める。
状態状態カード0の確率1の確率
|0>[1, 0]1² = 10² = 0
|1>[0, 1]0² = 01² = 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状態カード[1,0]の測定結果は何か。
  2. 21/√2の2乗はいくつか。
  3. 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です。最初はこの式へ数字を代入するだけで十分です。

[a, b]入力
(a+b)/√2新しい0側
[a, b]入力
(a−b)/√2新しい1側
3Hは入力振幅a, bから、和で0側、差で1側の新しい振幅を作る

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ですが、符号が異なります。

1
0
01
|0>
0
1
01
|1>
1/2
1/2
01
H|0>

確率 = 振幅の2乗

4|0>、|1>、H|0>の理想測定確率
入力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
OPENQASM 3.1;
include "stdgates.inc";
qubit q;
bit result;
h q;
result = measure q;
h q;|0>=[1,0]へHを適用し、|+>を作る
measure1 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も自分自身が逆操作です。

理解チェック

  1. 1H|0>の状態カードは何か。
  2. 2H|1>の1側振幅がマイナスになる理由は何か。
  3. 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
開始[1, 0]|0>
最初のH[1/√2, 1/√2]|+>
Z[1/√2, −1/√2]|->
最後のH[0, 1]|1>
5H-Z-Hの各段階の状態カードと、最後のHで行う2本の足し引き

5.4 ここで初めて『干渉』と呼ぶ

最後のHでは、0側の新しい振幅を作るために1/√2と−1/√2を足しました。結果は0です。1側では1/√2から−1/√2を引いたので、結果は1です。このように、複数の振幅が同じ出力の振幅計算に入り、足し算または引き算で大きくなったり0になったりすることを干渉と呼びます。

openqasm
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

理解チェック

  1. 1Zは状態カード[a,b]をどう変えるか。
  2. 2H-Z-Hで0側振幅が0になる足し算を書け。
  3. 3本書で干渉とは何か。

CHAPTER 06

測定基底は『何を区別して読むか』

Z基底とX基底を回路として理解する

6.1 測定器には答えのラベルが必要

通常のmeasureは、状態を|0>と|1>のどちらとして読むかを返します。しかし|+>と|->を区別したい場合、通常測定の直前にHを置きます。H|+>=|0>、H|->=|1>だからです。

Z基底X基底H
6Z基底測定とX基底測定の回路上の違いX基底測定は、Hで読み方を変換してから通常のZ基底測定を行う
準備状態Z基底測定X基底測定(H→measure)
|0>必ず00/1が50:50
|1>必ず10/1が50:50
|+>0/1が50:50必ず0
|->0/1が50:50必ず1
openqasm
// |->を準備してX基底で測る
x q;
h q;
// X基底測定
h q;
result = measure q;
x; h;|0>→|1>→|->を準備
h; measure|->→|1>へ変換し、通常測定で1

理解チェック

  1. 1通常のmeasureは何を区別するか。
  2. 2X基底で測る前に何を置くか。
  3. 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個だけ置く最小テストで表示規則を確認します。

q[0]q[1]X
7q[0]だけへXをかけ、結果表示が10か01かでbitの並び順を確認する
openqasm
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;両方を測る。表示文字列の順は実行環境で確認

理解チェック

  1. 12qubitの測定候補はいくつか。
  2. 2|01>の4成分状態カードを書け。
  3. 3結果文字列の順を確認する最小テストは何か。

CHAPTER 08

CX/CNOTを4行の表で理解する

制御と標的を取り違えない

8.1 規則は『制御が1なら標的へX』

q[0] 制御q[1] 標的
8CXの4入力。第1bitの制御が1の2行だけ、第2bitの標的が反転する
入力 q[0]q[1]制御q[0]標的q[1]出力
000変えない00
010変えない01
1010→111
1111→010

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
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>のままです。制御線と標的線は交換できません。

理解チェック

  1. 1CXの第1引数は何か。
  2. 2入力11へcx q[0],q[1]をかけると何か。
  3. 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%
q[0]q[1]H
9Hで00/10の振幅を作り、CXで10の振幅を11へ移すBell回路

9.2 『各qubitだけ』を見ると50:50

00と11が半分ずつなので、q[0]だけ見ても0/1が50:50、q[1]だけ見ても0/1が50:50です。しかし2個を一緒に見ると、01と10は出ず、値が必ず一致します。個別の割合だけでは全体の関係を表せません。

50%
50%
01
q[0]単独
50%
50%
01
q[1]単独
50%
50%
00011011
2個を一緒に
10Bell状態では各qubit単独は50:50だが、2個を一緒に測ると00と11だけが出る

9.3 CXは未知状態のコピーではない

制御が|0>または|1>だと、CXは標的を同じZ基底値へそろえるように見えます。しかし制御が|+>なら、出力は『制御|+>、標的|+>』ではなくBell状態です。各qubit単独の同じ状態を2個作ったわけではありません。

openqasm
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. 1このBell回路で出ないbit列は何か。
  2. 2各qubitだけの0/1割合はどうなるか。
  3. 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 コメントは実行されない説明

openqasm
// この行の右側は1行コメント
x q[0];  // q[0]を反転
/* 複数行の
   コメント */

10.4 完全なBellプログラム

openqasm
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を測定

理解チェック

  1. 1qubit[4] q;で有効な最大添字は何か。
  2. 2セミコロンの主な役割は何か。
  3. 3include "stdgates.inc";は何を可能にするか。

CHAPTER 11

測定・reset・条件分岐

回路の途中で0/1を読み、その後の操作を変える

11.1 測定は最後だけではない

回路の途中でqubitを測り、その結果をbitへ保存できます。そのbitが0か1かによって、後のゲートを変えられる処理系があります。

11.2 resetは|0>へ準備し直す

openqasm
reset q[0];

11.3 ifで古典bitを確認する

openqasm
bit m;
m = measure q[0];
if (m == 1) {
  x q[1];
}
mifの条件q[1]への操作
0何もしない
1Xを適用

11.4 測定したら元の重ね合わせは残らない

たとえば|+>を測ると、結果は0または1です。結果0なら測定後の状態は|0>、結果1なら|1>です。同じqubitを続けてもう一度通常測定すると、理想的には同じ値が出ます。

理解チェック

  1. 1qubitをifで直接q[0]==1と比較してよいか。
  2. 2reset後の理想状態は何か。
  3. 3動的回路と1000 shotsの違いは何か。

CHAPTER 12

型・入力・ループ

古典的な計算を量子命令の周りに置く

12.1 型は値の使い方を決める

用途
bit / bit[n]bit[3] c;測定結果
boolbool done=false;真/偽
int / uintuint[8] count;整数
floatfloat[64] score;小数
angleangle theta;周期を持つ角度
durationduration t=100ns;時間

12.2 inputは回路外から値を受け取る

openqasm
input angle theta;
output bit result;
qubit q;
ry(theta) q;
result = measure q;

12.3 forは回数が決まった繰り返し

openqasm
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は条件が真の間の繰り返し

openqasm
bit success = 0;
while (success == 0) {
  reset q;
  h q;
  success = measure q;
}

理解チェック

  1. 1input angle theta;のthetaはどこから来るか。
  2. 2for int i in [0:3]は何回か。
  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>)/√21/2
π|1>1

13.3 RX、RZ、RZZの役割

ゲートOpenQASM主に変えるもの
RXrx(theta) q;0/1振幅と位相
RYry(theta) q;0/1振幅。実数で追いやすい
RZrz(theta) q;1qubitの相対位相
RZZrzz(theta) a,b;2qubitの関係に応じた位相

13.4 gateは量子操作の並びに名前を付ける

openqasm
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は一般的なサブルーチン

openqasm
def parity(bit[4] x) -> bit {
  bit p = 0;
  for int i in [0:3] {
    p ^= x[i];
  }
  return p;
}
比較gatedef
主目的ユニタリな量子ゲート列一般的な処理
戻り値なし持てる
測定・古典処理原則不向き扱える
逆操作修飾原則可能一般には同じ意味で扱わない

理解チェック

  1. 1Bell回路を部品化するならgateとdefのどちらが自然か。
  2. 2inv @ h q;は何と同じか。
  3. 3戻り値を返す古典処理には何を使うか。

CHAPTER 14

論理回路を実機で動かすまで

barrier、delay、pulse、ノイズ、トランスパイルを分離する

14.1 書いた回路がそのまま装置へ行くとは限らない

私たちはHやCXという論理的な命令を書きます。実機は限られた物理qubit、接続、基礎ゲートしか持ちません。そのため送信前に、同じ働きをする実機向け命令列へ変換します。

段階確認すること
論理回路H, CX意図した状態変化か
配置論理q[0]→物理qubit 7良いqubitを選べたか
経路変換SWAPを追加接続制約を満たすか
基礎ゲート分解CX→装置固有命令装置が受け付けるか
実行pulseを再生ノイズと時間

14.2 barrierは状態を変えるゲートではない

openqasm
h q[0];
barrier q;
cx q[0], q[1];

14.3 delayは待つ時間を明示する

openqasm
delay[100ns] q[0];

14.4 pulseは物理信号

14.5 理想的50:50と汚れた結果を分ける

H|0>は理想的には0/1が50:50です。実機で48:52になっても、1000 shotsの有限回数による揺れかもしれません。一方、Bell回路で本来出ない01や10が継続的に出るなら、ゲートや読み出しの誤差を疑います。

理解チェック

  1. 1barrierは理想状態を反転するか。
  2. 2トランスパイルは何へ変換するか。
  3. 3Hの48:52は直ちに故障を意味するか。

CHAPTER 15

アルゴリズム・回路・Oracleを分ける

Groverが『答えを知っている』ように見える理由をほどく

15.1 アルゴリズムは設計図、回路は命令列

Groverの例役割
問題4候補から条件を満たすものを探す何を解くか
アルゴリズム均等化→印付け→増幅→測定解き方
量子回路H、Oracle回路、拡散回路実行可能なゲート列
OpenQASMh q; cx ...;回路を文字で記述
問題何を解くか
アルゴリズム解き方
量子回路実行可能なゲート列
OpenQASM回路を文字で記述
11課題から量子ハードウェアまでの層。OpenQASMはアルゴリズムそのものではない

15.2 Oracleは答え生成器ではなく判定器

たとえば候補10だけを正解とするOracleを作るには、『入力が10なら真』という検査規則を回路化します。これは候補10を最初から読み出しているのではなく、入力された各候補が条件に一致するかを同じ規則で検査しています。古典探索でも、候補を試すたびに同じ検査が必要です。

+
+
+
+
00011011
Oracle前
+
+
+
00011011
Oracle後

縦は振幅(符号あり)。確率は振幅の2乗なので、この時点では全候補25%のまま

12Oracleは候補10の振幅だけ符号反転する。直後の4候補の測定確率はまだ各25%

15.3 『最適』と『条件一致』を区別する

通常のGrover Oracleは、候補が指定条件を満たすかを判定します。VRPの最短経路を自動的に知っているわけではありません。最適化へ使うなら、ある閾値以下かを判定して閾値を更新するなど、追加の古典手順が必要です。

理解チェック

  1. 1アルゴリズムと量子回路は同じか。
  2. 2Oracleは候補に何をするか。
  3. 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×平均−古い振幅新振幅
001/21/2−1/20
011/21/2−1/20
10 正解−1/21/2−(−1/2)1
111/21/2−1/20
00011011
均等化
00011011
Oracle後
1
00011011
拡散後

縦は振幅(符号あり)

13Groverの振幅変化。均等化、Oracleの符号反転、拡散後の10への集中を比較する

16.4 これが干渉の具体的な中身

候補00、01、11の振幅計算は0になり、候補10の計算は1になりました。『正解を強めた』とは、振幅を足し引きする回路により、正解以外の新振幅が0、正解の新振幅が1になったという意味です。

16.5 一般には繰り返し回数を選ぶ

候補数Nに対し正解数が少ない場合、Oracleと拡散を約√N回の規模で繰り返します。繰り返しすぎると正解振幅が再び下がるため、無限に実行すればよいわけではありません。

H均等化
Oracle符号反転
Diffusion拡散
測定bit列
14Groverの4段階を回路ブロックとして見た図Diffはdiffusion(拡散)の略。この章で計算した『平均まわりの反転』を回路として実行する部分

理解チェック

  1. 1Oracle直後の10の確率はいくつか。
  2. 24振幅の平均はいくつか。
  3. 3拡散後の状態カードは何か。

CHAPTER 17

QUBOからQAOA回路へ

問題の数式化と、解く回路を混同しない

17.1 最適化は候補ごとに点数を付ける

2人x0,x1を別グループへ分ける簡単なMaxCutを考えます。xi=0ならグループA、1ならBです。2人が別なら得点1、同じなら0とします。

x0x1同じ/別得点 C
00同じ0
011
101
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で表す中心部分)

H初期化
Cost(γ)位相付け
Mixer(β)再配分
測定bit列
samples

古典側(通常OpenQASMの外側)

QUBO得点式
結果集計平均コスト
最適化γ,β更新
次の γ,β
再実行
更新した角度を次の回路実行へ渡す
15QAOAの量子側と古典側。OpenQASMは主に1回分の量子回路を表し、角度更新は外側で行うQUBOは問題の式、OpenQASMは量子回路、角度更新は古典処理。3つを分けて読む。

17.5 2変数1層のOpenQASM骨格

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回路外の古典オプティマイザが更新
H初期化
CostRZZ(γ)
MixerRX(β)
測定
16QAOA 1層の回路ブロック。CostのγとMixerのβは外側から渡す

理解チェック

  1. 1QUBOは量子回路か。
  2. 2QAOAの角度更新は通常どこで行うか。
  3. 3CostとMixerの役割を1文ずつ述べよ。

CHAPTER 18

OpenQASM 2から3への移行と総合デバッグ

正しいコード・正しい論理・実機対応を別々に検査する

18.1 同じBell回路を比較する

OpenQASM 2OpenQASM 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 gateincludeと大文字小文字stdgates.incとゲート名を確認
結果が逆制御/標的、bit順片方だけXの最小テスト
50:50のはずが必ず0Hがあるか、測定基底状態カードを各行で更新
実機が拒否対応機能とISA対象実機へトランスパイル
少数の誤結果shotsとノイズ理想シミュレータと比較

18.3 デバッグの固定手順

  1. 1期待する入力と理想測定分布を紙に書く。
  2. 2回路を最小化し、1ゲートずつ状態カードを更新する。
  3. 3構文だけをパーサで確認する。
  4. 4理想シミュレータで回数分布を確認する。
  5. 5bit表示順を片側Xで確認する。
  6. 6対象実機へトランスパイルし、追加ゲートと深さを確認する。
  7. 7実機結果を理想分布と比較し、ノイズを分離する。
理想状態状態カードで計算
構文パーサで確認
シミュレータ理想の回数分布
bit順片側Xテスト
実機制約トランスパイル
ノイズ実機との差
17結果がおかしいときは、理想状態、構文、シミュレータ、bit順、実機制約、ノイズの順に原因を狭める

18.4 マスター制作

課題必須成果物
A 量子コイントス入力角thetaでRYを変え、理想確率とshotsの揺れを説明
B Bell相関テスター4種類のBell状態を準備し、Z/X基底で相関を比較
C 2bit GroverOracle条件を変更できる回路と、4成分振幅の全計算
D 2変数QAOAQUBO表、Cost/Mixer回路、外側の角度更新を分離
E 移行・デバッグQASM2コードを3へ移行し、3種類の故障を修正

理解チェック

  1. 1構文エラーと論理エラーの違いは何か。
  2. 2実機拒否を論理ミスと決めつけてよいか。
  3. 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候補が条件を満たすかを回路で判定し、位相印を付ける部品
QUBO0/1変数の一次・二次式で表した最適化問題
QAOACostとMixerを使い、古典側で角度を更新するゲート型アルゴリズム

付録 B

ゲート早見表

ゲートOpenQASM最初に確認する役割
Xx q;|0>と|1>を交換
Hh q;和と差で振幅を作り直す
Zz q;1側振幅の符号を反転
CXcx a,b;aが1の成分でbをX反転
RX/RY/RZrx(theta) q;指定軸まわりの角度付き回転
SWAPswap 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は、量子分野の仕事と実力をつなぐ場所です。

そして、自分の力を実践で見せたいすべての挑戦者へ。