ドイチュ–ジョザのアルゴリズム
量子だと本当に速い最初の証拠。関数が定数か均衡かを、古典なら最悪で指数回かかる判定を、たった1回の問い合わせで確定できる仕組みを原理から解けます。
- 1.n ビット入力の関数 f が、全入力で同じ値を返す「定数」か、ちょうど半数が0・半数が1の「均衡」かを判定する問題。前提としてどちらかであることが保証されている。
- 2.量子並列性ですべての入力を1回の重ね合わせに載せ、位相キックバックで f の値を出力ビットの符号ではなく入力側の位相へ移し、アダマール変換の干渉で答えを1回の測定に集約する。
- 3.古典は決定的に確定させるには最悪で 2^(n-1)+1 回の問い合わせが要るのに対し、量子はオラクル呼び出し1回で確定。誤りゼロの分離を初めて示した歴史的アルゴリズム。
「量子は本当に速いのか」への最初の答え
ドイチュ–ジョザのアルゴリズムは、量子計算が古典計算を明確に上回れることを、誤りゼロで示した最初の例です。実務で解きたい問題そのものではありませんが、後の ショアやグローバー を含むほぼすべての量子アルゴリズムが使う3つの道具——量子並列性・位相キックバック・干渉——が最小構成で凝縮されています。ここではその仕掛けを、なぜ1回の問い合わせで答えが出るのかまで分解します。
扱う問題はこうです。n ビットのビット列を入力に取り、0か1を返す関数 f があります。この f は次のどちらかであることが保証されています。
- 定数(constant): すべての入力に対して同じ値を返す(常に0、または常に1)。
- 均衡(balanced): 入力
2^n個のうち、ちょうど半数で0、残り半数で1を返す。
f の中身は見えず、値を知るには「入力を与えて出力を得る」問い合わせ(オラクル)だけが許されます。どちらのタイプかを当てよ、というのが問題です。
古典で確実に答えを出すには、運が悪いと入力の過半数を調べる必要があります。半数ちょうどまで同じ値が続いても、まだ定数と均衡の両方があり得るからです。全 2^n 個の半分より1つ多い 2^(n-1)+1 回まで問い合わせて初めて確定します。乱択で誤り確率を許せば少数回で高確率の判定はできますが、誤りゼロを要求すると指数回が必要——ここが量子との差の土俵です。
道具1:量子並列性で全入力を一度に載せる
量子ビット n 個を、すべて |0> からアダマール変換 H にかけると、2^n 通りの入力すべての均等な重ね合わせが作れます。1量子ビットでは H|0> = (|0>+|1>)/√2 です。これを n 個並べると次のようになります。
H^⊗n |00…0> = (1/√(2^n)) Σ_x |x> (x は 0 から 2^n−1 の全ビット列)
この1本の状態の中に、2^n 個の入力がすべて等しい振幅で含まれています。ここに f を1回作用させれば、原理的には全入力に対する f の評価が同時に進みます。これが量子並列性です。
ただし注意が必要です。重ね合わせに f を効かせても、そのまま測定すれば得られるのはランダムな1つの f(x) だけ。全部を一度に読み出すことはできません。並列に計算した結果を答えに変えるには、次の位相キックバックと干渉が要る——ここが「速そうに見えて実は難しい」核心です。
道具2:位相キックバックで f を位相に移す
量子オラクルは可逆でなければならないため、f は入力を壊さない形 U_f: |x>|y> → |x>|y ⊕ f(x)> で与えられます(⊕ は排他的論理和、y は補助の出力ビット)。素直に使うと f(x) は出力ビットに書き込まれますが、ここに巧妙な準備を施します。
出力ビットを |1> にしてから H をかけ、|−> = (|0>−|1>)/√2 にしておくのです。この状態に U_f を作用させると、次が成り立ちます。
U_f |x>|−> = |x> · (|0 ⊕ f(x)> − |1 ⊕ f(x)>)/√2
= (−1)^f(x) · |x>|−>
f(x)=0 なら符号はそのまま、f(x)=1 なら符号が反転する——つまり f(x) の値が、出力ビットではなく |x> 側の「位相 (−1)^f(x)」として跳ね返って きます。これが位相キックバック(phase kickback)です。補助ビット |−> は最後まで変化せず、実質的に入力レジスタだけに (−1)^f(x) という符号が刻まれます。
測定で読めるのは振幅の二乗(確率)であり、位相そのものは直接見えません。しかし位相は干渉を通じて振幅に化ける。f(x) を各基底状態の符号として全入力に一斉に埋め込んでおけば、次のアダマール変換で符号どうしが強め合い・打ち消し合い、f 全体の性質(定数か均衡か)を1つの読み出せる場所へ集約できます。位相キックバックは「並列計算の結果を干渉可能な形に整える」ための鍵です。
重ね合わせ全体に効かせると、入力レジスタはこうなります。
(1/√(2^n)) Σ_x (−1)^f(x) |x>
各入力 x の振幅の符号に f(x) が乗った状態です。ここまでで f の情報はすべて位相に載りました。オラクル U_f を使った回数は1回だけです。
道具3:アダマール干渉で答えを1点に集める
最後に入力レジスタへ再び H^⊗n をかけ、全状態を干渉させます。アダマール変換の一般式を使うと、出力が |00…0>(全ビット0)である振幅は次のように書けます。
状態 |00…0> の振幅 = (1/2^n) Σ_x (−1)^f(x)
この和 Σ_x (−1)^f(x) が決定的に効きます。
- 定数のとき: すべての
(−1)^f(x)が同符号なので、和は±2^n。振幅は±1、確率は1。測定すると必ず全ビット0 が得られる。 - 均衡のとき:
+1と−1がちょうど半々で完全に打ち消し合い、和は0。振幅は0、確率は0。全ビット0 は絶対に観測されない。
したがって判定規則は明快です。測定結果が全ビット0なら定数、1ビットでも1が立っていれば均衡。干渉が「定数なら全確率を原点に集中、均衡なら原点の確率を完全に消す」という両極端を作り出すため、1回の測定で誤りなく確定します。
この決着は、均衡時に +1 と −1 が厳密に同数で振幅がぴったり0になることに依存します。「半数ちょうどが0・半数が1」という均衡の定義と、「定数か均衡のどちらかである」という前提保証があって初めて、原点の振幅は0か±1の二択になります。もし f が任意(例えば3/4が0)だと打ち消しは不完全になり、この単純な規則は崩れます。前提が効いているのはこの一点です。
全体の流れと計算量
回路全体は「重ね合わせを作る → オラクルで位相を刻む → 干渉させて測る」という3段構成です。
|0>^n ─ H^⊗n ─┐ ┌─ H^⊗n ─ 測定(入力レジスタ)
│ U_f (1回) │
|1> ─ H ────┘ └─ (|−> のまま・破棄)
| 段階 | 操作 | 状態 | 役割 |
|---|---|---|---|
| 初期化 | 入力を|0>^n、出力を|1>に | |0…0>|1> | 干渉の土台を作る |
| 重ね合わせ | 全ビットにH | (1/√2^n)Σ|x>|−> | 全入力を並列に載せる(量子並列性) |
| オラクル | U_fを1回 | (1/√2^n)Σ(−1)^f(x)|x>|−> | f(x)を位相に移す(位相キックバック) |
| 干渉 | 入力側にH^⊗n | 定数:|0…0>/均衡:|0…0>成分0 | 位相差を振幅へ変換 |
| 測定 | 入力レジスタを読む | 全0か否か | 定数/均衡を確定 |
問い合わせ回数の差が、このアルゴリズムの主張です。
| 観点 | 古典(決定的・誤りゼロ) | 量子(ドイチュ–ジョザ) |
|---|---|---|
| 最悪の問い合わせ回数 | 2^(n−1)+1 回 | 1 回 |
| 誤り確率 | 0 | 0 |
| スケーリング | 入力サイズに対して指数的 | 定数 |
| 鍵となる仕組み | なし(総当たり寄り) | 並列性+位相キックバック+干渉 |
- 問題定義: 定数か均衡かの二択で、どちらかであることが保証されている点まで言えること。
- 位相キックバック: 出力ビットを
|−>に用意するとU_fが(−1)^f(x)を入力側に刻む——式で説明できると強い。 - 干渉の結末: 全ビット0の振幅が
(1/2^n)Σ(−1)^f(x)で、定数なら±1・均衡なら0。測定が全0なら定数。 - 計算量差: 古典
2^(n−1)+1回 対 量子1回。誤りゼロの分離である点が本質。 - 限界: 「どちらか保証」の前提が無いと成立しない、実用問題ではないが後続アルゴリズムの原型。
まとめ
ドイチュ–ジョザのアルゴリズムは、量子並列性で全入力を重ね合わせ、位相キックバックで f を測れない位相に隠し、アダマール干渉でそれを1つの読み出しへ凝縮するという三段の流れそのものです。速さの正体は「たくさん計算するから」ではなく、位相に載せた情報を干渉で強め合わせ・打ち消し合わせて答えを1点に集められるから——ここが古典の総当たりと決定的に違います。実用性より原理の教材価値が高く、プログラミング 的な可逆回路の考え方や、AI で用いる線形代数(ユニタリ行列とテンソル積)に慣れていると、後続の量子アルゴリズムへの橋渡しがぐっと楽になります。
量子コンピューティング Article
ドイチュ–ジョザのアルゴリズムを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
量子アルゴリズム
比較で見る軸
難易度: advanced / カテゴリ: 量子コンピューティング / タグ数: 5
導入後に効く点
量子並列性ですべての入力を1回の重ね合わせに載せ、位相キックバックで f の値を出力ビットの符号ではなく入力側の位相へ移し、アダマール変換の干渉で答えを1回の測定に集約する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- 量子コンピューティング
- タグ数
- 5
判断チェックリスト
- 自社の用途が「量子アルゴリズム / 量子計算」に近いか確認する。
- 強みである「n ビット入力の関数 f が、全入力で同じ値を返す「定数」か、ちょうど半数が0・半数が1の「均衡」かを判定する問題。前提としてどちらかであることが保証されている。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。