Path: blob/main/translations/ja/ch-algorithms/deutsch-jozsa.ipynb
3855 views
ドイチ-ジョサのアルゴリズム
このセクションでは、まずドイチ-ジョサ問題を紹介し、古典アルゴリズムと量子アルゴリズムによる解法を紹介します。また、Qiskitで量子アルゴリズムを実装し、シミュレーターと実デバイスでアルゴリズムの実験をします。
ドイチ-ジョサのアルゴリズムは、古典アルゴリズムよりも優れたパフォーマンスを持つと発表された、最初の量子アルゴリズムです(参考文献[1]で最初に紹介されました)。ある特定の問題に対して量子コンピューターを使用する利点が証明された最初の量子アルゴリズムです。
1.1 ドイチ-ジョサ問題
ビット列を入力として受け取り、 またはのいずれかを返す、以下のようなブール関数があるとします。
または(ここで、はまたは)
このブール関数の特性は、分布型か定値型かのどちらかです。定値型の場合は、任意の入力に対してすべて0またはすべて1を返しますが、分布型の場合は、半分の入力に対して0を返し、残りの半分の入力には1を返します。問題は、与えられた関数が分布型か定値型かを判断することです。
ドイチ-ジョサ問題は、1ビットであるドイチ問題のビットへの拡張です。
1.2 古典的な解法
古典的には、最も運が良い場合、オラクルへの2回の問い合わせで、このブール関数が分布型かどうかを判断できます。つまり、 でのとき、出力が異なる二つの値となるため、関数が分布型であることがわかります。
最悪の場合、つまり、何回試行を続けても、同じ出力が示される場合、 が定値型であることを確認するためには、可能な入力の総数の半分+1をチェックする必要があります。可能な入力の総数はであるため、つまり、最悪の場合には、 が定値型であることを確認するために、の入力を試行する必要があります。たとえば、ビットの場合、 の可能な組み合わせのうちつをチェックして、すべてを取得した場合でも、番目の入力がを出力し、が分布型である可能性があります。確率的には、これは非常にありそうもない例です。実際、同じ結果が連続して得られる場合、関数が一定である確率を個の入力の関数として次のように表すことができます。
ParseError: KaTeX parse error: Expected 'EOF', got '&' at position 71: …textrm{for } 1 &̲lt; k \leq 2^{n…現実的には、例えばx%の確信がある場合、計算を早期に切り捨てることを選択できます。しかし、100% の自信を持ちたい場合は、 の入力をチェックする必要があります。
1.3 量子的な解法
量子コンピューターを使用すると、関数を1回呼び出すだけで、この問題を100%の信頼度で解決できます。ここで、関数は、状態 をに変換する量子オラクルで、 はを法とする加算です。下の図はドイチ-ジョサのアルゴリズムの一般的な回路です。

それでは、アルゴリズムの手順を見ていきましょう。
- 2つの量子レジスターを準備します。 1つ目はに初期化された量子ビットレジスターで、2つ目はに初期化された1量子ビットのレジスターです。
は各において、またはのいずれかであるためです。
ここで、 はビット単位の積の合計です。
1.4 なぜこれで機能するのか?
定値型のオラクル
オラクルが定値型の場合、オラクルは(グローバル位相を除いて)入力量子ビットに影響を与えず、オラクルに問い合わせる前と後の量子状態は同じです。Hゲートはそれ自身を逆関数に持つため、ステップ4ではステップ2を逆に実行し、1番目のレジスターに初期量子状態のを得ます。
$$ H^{\otimes n}
\tfrac{1}{\sqrt{2^n}} \quad \xrightarrow{\text{after } U_f} \quad H^{\otimes n}\tfrac{1}{\sqrt{2^n}}
分布型のオラクル
ステップ2の後、入力レジスターはすべての計算基底の均等な重ね合わせになります。オラクルが分布型の場合、位相キックバックで、この半分の状態に負の位相が追加されます。
$$ U_f \tfrac{1}{\sqrt{2^n}}
\tfrac{1}{\sqrt{2^n}} $$
オラクルに問い合わせをした後の量子状態は、オラクルに問い合わせをする前の量子状態と直交しています。よって、ステップ4で、Hゲートを適用すると、に直交する量子状態になっているはずです。これは、状態がすべてゼロである結果は測定されないことを意味します。
2. 例
2ビットの分布型関数の具体例を見てみましょう。
次のような2ビットの関数 を考えます。
この2ビットのオラクルに対応する位相オラクルは です。
ここで、以下の状態を例として、このオラクルが期待どおりに機能するかどうかを確認します。
- 2つの量子ビットのうち最初のレジスターは に初期化され、2番目の量子ビットレジスターは に初期化されます。
(量子ビットのインデックス付けに添え字0、1、2を使用していることに注意してください。「01」の添え字は 量子ビット0と1のレジスターを意味します。)
以下のウィジェットを使用して、この例を試すことができます。 ボタンを押してHゲートとオラクルを追加できます。case="constant" に設定して、セルのrestartで別のオラクルも試すことができます。
3. 量子オラクルの作成
量子オラクルを作成するいくつかの異なる方法を見てみましょう。
定値型関数の場合は簡単です。
1. f(x) = 0 の場合、ゲートをレジスタ2の量子ビットに適用します。
2. f(x) = 1 の場合、ゲートをレジスタ2の量子ビットに適用します。
分布型の関数の場合、複数の異なる手法で回路を作成できます。例えば、レジスタ1の各量子ビットを制御ビットで、レジスタ2の量子ビットをターゲットにしてCNOTを実行することで、回路が分布型であることを保証できます。 例:
上の回路図では、上の3つの量子ビットが入力レジスターで、一番下の量子ビットが出力レジスターです。 以下の表で、どの入力状態がどの出力を与えるかを確認できます。
| 出力0となる入力状態 | 出力1となる入力状態 |
|---|---|
| 000 | 001 |
| 011 | 100 |
| 101 | 010 |
| 110 | 111 |
制御ビットをXゲートでラップすることにより、分布型であることを保ちながら結果を変更できます。 たとえば、次の回路とその結果の表を確認してください。
| 出力0となる入力状態 | 出力1となる入力状態 |
|---|---|
| 001 | 000 |
| 010 | 011 |
| 100 | 101 |
| 111 | 110 |
次にオラクルの入力レジスターのサイズをセットします。
次に、分布型オラクルを作ります。 1bの節で見たように、各入力量子ビットを制御ビット、出力ビットをターゲットビットとしてCNOTを実装することで、分布型オラクルを作成できます。 一部の制御ビットをXゲートでラップすることにより、0または1を出力する入力状態の変更ができます。 まず、ラップする制御ビットを指定する長さn のバイナリー文字列をセットします。
この文字列を、Xゲートを配置するためのキーとして使用します。 各量子ビットについて、b_strの対応する桁が1の場合はXゲートを置き、 0の場合は何も置きません。
次に、各入力量子ビットを制御ビットとし、出力量子ビットをターゲットビットとして、制御NOTゲートを実装します。
最後に、2つのセルからコードを繰り返して、制御ビットをXゲートでラップします。
次に、オラクルを適用しましょう。ここでは、上記で作成したbalanced_oracle を適用します。
最後に、 個の入力量子ビットにHゲートを適用し、入力レジスターを測定します。
出力を見てみましょう:
このオラクルのゲートを入力して、ドイチ-ジョサのアルゴリズムを実行する関数も作成しましょう。
最後に、これらの関数を使用してアルゴリズムを試してみましょう。
この回路を実行した結果を見てみます。
ご覧のとおり、最も可能性の高い結果は1111です。他の結果は、量子計算の誤差によるものです。
7. 参考文献
David Deutsch and Richard Jozsa (1992). "Rapid solutions of problems by quantum computation". Proceedings of the Royal Society of London A. 439: 553–558. doi:10.1098/rspa.1992.0167.
R. Cleve; A. Ekert; C. Macchiavello; M. Mosca (1998). "Quantum algorithms revisited". Proceedings of the Royal Society of London A. 454: 339–354. doi:10.1098/rspa.1998.0164.