Path: blob/main/translations/ja/ch-gates/more-circuit-identities.ipynb
3855 views
基本的な回路の等価性
量子コンピューターをプログラムするとき、私たちの目標は常に、基本的なパーツから有用な量子回路を構築することです。ただし、必要とする基本的なパーツがすべて揃っていない場合もあります。このセクションでは、基本的なゲートを相互に変換する方法と、ゲートを使用して少し複雑な(しかしそれでもかなり基本的な)ゲートを構築する方法について説明します。
この章で説明する手法の多くは、1995年にバレンコと共著者による論文で最初に提案されました[1]。
目次
ここで、cとtは制御量子ビットと標的量子ビットです。ただし、IBM Qデバイスでは、直接適用できる2量子ビットゲートはCNOTだけです。したがって、変換する方法が必要です。
このプロセスは非常に簡単です。アダマールがおよびの状態をおよびの状態に変換することはわかっています。 との状態に対するゲートの影響は、との状態に対するの作用と同じであることもわかっています。このことから、または単純に行列を乗算することから、
同じトリックを使用して、CNOTを制御に変換できます。私たちがしなければならないのは、CNOTの前と後で、アダマールを標的量子ビットに作用させるだけです。これにより、その量子ビットに適用されたがに変換されます。
より一般的には、単一のCNOTの前後に、正しい回転を配置することにより、ブロッホ球での角度の任意の回転の制御バージョンに変換できます。たとえば、制御は:
そして、制御は:
量子コンピューター上で情報を移動する必要なときがあります。これを物理的に移動することで実行できるように、実装された量子ビットもありますが、別のオプションとしては、2つの量子ビット間で状態を移動することで情報の移動を実現します。これはSWAPゲートによって行われます。
上記のコマンドはこのゲートを直接呼び出しますが、標準のゲートセットを使用してこれを作成する方法を見てみましょう。このためには、いくつかの例を検討する必要があります。
まず、量子ビットaがの状態で、量子ビットbがの状態である場合を見てみましょう。これには、次のゲートを適用します:
これは、量子ビットbを状態にし、量子ビットaを状態にする効果があります。この場合、少なくともSWAPを実行したことになります。
次に、この状態を元の状態に戻します。ご想像のとおり、上記のプロセスの逆でこれを行うことができます:
これらの2つのプロセスでは、一方の最初のゲートが他方の初期状態に影響を与えないことに注意してください。たとえば、bのをaに交換する場合、最初のゲートはcx(b,a)です。代わりに、これが最初にbにがなかった状態に適用された場合、効果はありません。
また、これらの2つのプロセスでは、一方の最終ゲートが他方の最終状態に影響を与えないことに注意してください。たとえば、をaからbにスワップするときに必要な最後のcx(b,a)は、がbにない状態には影響しません。
これらの観察結果を元に、一方のゲートからもう一方のゲートに無効なゲートを追加して、2つのプロセスを組み合わせることができます。例えば、
これは、aからbにを交換するプロセスと考えることができますが、最初は役に立たない qc.cx(b,a)があります。また、をbからaに交換するプロセスと考えることもできますが、最後に無用なqc.cx(b,a)があります。どちらにしても、結果は、双方向でスワップを実行できるプロセスです。
また、状態に対して正しく効果を発揮します。これは対称的であるため、状態を入れ替えても影響はありません。制御量子ビットがの場合、CNOTゲートは効果がないため、プロセスは何もしません。
状態も対称的であるため、スワップによる効果はないに等しいです。この場合、上記のプロセスの最初のCNOTゲートは2番目のゲートに影響を与えず、3番目のゲートは最初のゲートを元に戻します。したがって、全体の効果は確かに無いに等しいです。
このようにして、SWAPゲートを標準ゲートセットである単一量子ビットの回転ゲートとCNOTゲートに分解する方法を見つけました。
これは、、 、 、 、およびそれらのすべての重ね合わせに対して機能します。したがって、可能なすべての2量子ビット状態をスワップします。
CNOTゲートの順序を変更した場合も、同じ効果が得られます:
これは、SWAPゲートを取得するための同様に有効な方法です。
ここでの導出には、z基底状態に基づいていましたが、状態 と でも同じように量子ビットのスワップができ、SWAPゲートを実装する方法は、完全に同じです。
練習問題:
量子ビットを状態 と でスワップする別の回路を作り、それが上記の回路と等価であることを示してください。
この回路は、制御量子ビットが状態 の場合、の後にその逆の が続くだけです。この最終的な効果は、無いに等しいです。しかし、制御量子ビットが の場合、ry(-theta/2)の前後にXゲートが適用されます。これは、y回転の方向を反転し、2番目の を作成する効果があります。したがって、この場合の正味の作用は、制御バージョンの回転 を作ることと同じになります。
この方法が機能するのは、xとy軸が直行し、そのためにxゲートが回転の方法を反転させるためです。したがって、制御を作るのも同じように機能します。制御 は、CNOTゲートを使って同じように作ることができます。
また、単一量子ビット回転の制御バージョンも作ることができます。そのためには、3つの回転A、B、Cと、次のような位相 を見つけるだけです。
制御Zゲートを使うことで、上の左の式を制御ビットがの状態の際に発生させ、右の式を制御ビットがの状態のときに発生させます。正しい位相を得るために制御ビット側で回転も使われ、これは、重ね合わせ状態がある場合に重要です。

ここで、A、 B 、Cはそれぞれ、 、 、を実装するゲートです。
単一量子ビットゲートと2量子ビットゲートからこれを構築する方法を確認するために、まず、より一般的なものを構築する方法を示します:任意の単一量子ビット回転Uについての、任意の制御・制御Uです。そのためには、制御バージョンの と の定義が必要です。以下のコードでは、未定義のサブルーチン cv と cvdg の代わりに、それぞれ cp(theta,c,t) と cp(-theta,c,t) を使っています。制御ビットは量子ビット と で、ターゲットビットは量子ビット です。

2つの制御ビットの各値を見ていくことで、両方の制御ビットが1の場合にのみ、Uゲートがターゲットビットに適用されることを確認できます。すでに説明したアイデアを使って、二重制御されたUゲートのある回路を使って、各制御Vゲートを実装することができるでしょう。これから、トフォリゲートを実装するために必要なCNOTゲートの数は最小で6であることがわかります[2]。

これは、3量子ビット(q0、q1、q2)のトフォリゲートです。この回路例では、q0はq2に接続されていますが、q0はq1に接続されていません。
トフォリは、量子コンピューティングでANDゲートを実装するための唯一の方法ではありません。同じ効果があり、相対位相を持つ他のゲートも定義することができます。これらの場合、より少ないCNOTでゲートを実装できます。
例えば、制御アダマールゲートと制御ゲートを使うとします。これらのゲートは、両方とも1つのCNOTで実装できます。これらのゲートから次の回路を作成できます:
2つの制御が状態の場合、これはターゲットに対して何もしません。 の場合、ターゲットは前後に がある ゲートの影響を受けます。正味の効果はターゲットに対するです。状態およびの場合、ターゲットは2つのアダマール(互いに打ち消し合う)または(相対位相のみを誘導する)のいずれかの影響を受けます。したがって、これはANDの効果も再現します。これは、ターゲットの値が制御の状態でのみ変更されるためですが、このことはたった3つのCNOTゲートに相当するもので再現されます。
5. HとTによる任意の回転
現在のデバイスの量子ビットはノイズの影響を受けやすく、基本的に誤ったゲートで構成されています。温度や浮遊磁場、隣接する量子ビットの活動などの単純なことが、私たちが意図していなかったことを引き起こす可能性があります。
量子コンピューターの大規模なアプリケーションでは、このノイズから量子ビットを保護するように量子ビットをエンコードする必要があります。これは、ゲートを間違って実行することを難しくするか、またはわずかに間違った方法で実装することによって行われます。
単一量子ビットの回転、 、 は残念ですが、角度 を完璧な精度で実装するのは不可能です。これは、あなたが、角度 のようなものを間違って実装することがないのと同じです。達成できる精度には常に限界があり、大きな回路ではエラーの積み重ねがあることを考慮すると、その精度は許容範囲を常に超えています。したがって、これらの回転をフォールトトレラントな量子コンピューターに直接実装することはできませんが、代わりに、より工夫した方法で回転を構築する必要があります。
フォールトトレラントのスキームでは、通常2つのみのゲート、 と を複数適用することによってこれらの回転を実行します。
Tゲートは、Qiskitでは.t()として表現されます:
これは、z軸を中心としたの回転であるため、数学的には として表されます。
以下では、ゲートとゲートが事実上完全であると想定しています。これは、エラー訂正とフォールトトレランスに適した方法で設計できます。
アダマールと前の章で説明した方法を使用して、Tゲートを使用してx軸の周りに同様の回転を作成することができます。
それでは、2つを組み合わせてみましょう。ゲートをにしましょう。
これは単一量子ビットのゲートであるため、ブロッホ球の周りの回転と考えることができます。これは、ある軸を中心にある角度で回転することを意味します。ここでは軸についてあまり考える必要はありませんが、単純にx、y、zになるわけではありません。さらに重要なのは角度です。
この回転の角度の重要な特性は、回転角がの無理数の倍数であるということです。数学を駆使することで証明することはできますが、ゲートを適用することによって実際に無理数である様子を見ることができます。 より大きい回転を適用するたびに、回転角に対して暗黙的にの剰余を計算していることに注意してください。したがって、上記の組み合わせた回転を回繰り返すと、同じ軸を中心に異なる角度で回転します。厳密な証明のヒントとして、「無理数は何として書けないか」を思い出してください。
これを利用すればいいのです。各角度はからの間のどこかになります。この間隔を幅の個のスライスに分割してみましょう。繰り返しごとに、結果の角度はこれらのスライスのいずれかに入ります。最初のの繰り返しの角度を見ると、鳩の巣原理により、少なくとも1つのスライスにこれらの角度が2つ含まれていることが分かるはずです。最初に必要な繰り返し回数を、2回目の繰り返し数をとします。
これにより、 回の繰り返しの際の角度について何かを証明できます。これは実質的に 回の繰り返しの後に 回の逆向きの繰り返しをするのと同じです。これらの角度は等しくない(無理数のため)だけでなく、 以下の差(同じスライスに対応するため)であるため、 回の繰り返しの角度は、
したがって、小さな角度で回転させることができます。 これを使用して、このゲートを繰り返す回数を増やすだけで、好きなだけ小さい角度で回転できます。
小さな角度の回転を多用することで、好きな角度で回転させることもできます。 これは常に正確であるとは限りませんが、 の差を除いて正確であることが保証されています。これは、好きなだけ小さくすることができます。 これで、回転の不正確さを管理できるようになりました。
これまでのところ、私たちはこれらの任意の回転を1つの軸を中心に行う力しか持っていません。 2番目の軸については、 と の回転を逆の順序で行うだけです。
この回転に対応する軸は、前に検討したゲートの軸と同じではありません。したがって、2つの軸の周りに任意の回転があり、これを使用してブロッホ球の周りに任意の回転を生成できます。かなりのゲートが必要ですが、なんでも実行できるようになりました。
ゲートが量子計算でよくみられるのは、この種のアプリケーションのためです。実際、フォールトトレラントな量子コンピューターのアルゴリズムの複雑さは、必要なゲートの数という観点が引き合いに出されることがよくあります。これは、可能な限り少ないゲートで物事を達成するための探求を駆り立てます。上記の説明は、ゲートをこのように使用できることを証明することを目的としたものであり、私たちが知っている最も効率的な方法を表すものではないことに注意してください。