干渉は振幅が強め合い弱め合うこと
量子の干渉は、振幅が足し合わされて、強め合ったり打ち消し合ったりする現象です。量子アルゴリズムは、これを使って、間違った答えの振幅を小さくします。
コインを2回振れば半々のままですが、H ゲートを2回当てると、必ず0に戻ります。その理由を、振幅の足し算で説明します。
このレッスンのゴール
メモ
ゲートの並びで、間違った結果の振幅が打ち消されることを示せる。
キーワード
| ことば | いみ |
|---|---|
| 干渉 | 振幅が足し合わされて、大きさが変わること |
| 強め合い | 同じ符号の振幅が足されて、大きくなること |
| 弱め合い | 逆の符号の振幅が足されて、小さくなること |
| 位相 | 振幅の向きを表す、符号や複素数の部分 |
| 経路 | 最初の状態から結果まで通る、道すじの1つ |
学生が入力するセルは、このプレビューでは空白です。
結果までの道すじの振幅を足す
|0> に H を当てると [0.707, 0.707] になります。もう一度 H を当てるとき、0の振幅には、2つの道すじが届きます。
1つは0から来る道すじで、もう1つは1から来る道すじです。干渉は、この2つの振幅を足すことで決まります。
例: H を2回当てる
| 結果 | 0から来る振幅 | 1から来る振幅 | 合計 |
|---|---|---|---|
| 0 | 0.707 × 0.707 = 0.5 | 0.707 × 0.707 = 0.5 | 1 |
| 1 | 0.707 × 0.707 = 0.5 | 0.707 × -0.707 = -0.5 | 0 |
学生が入力するセルは、このプレビューでは空白です。
ラボは H を2回と H Z H を試す
ラボの interfere.py は、|0> に H を2回当てた結果と、H、Z、H の順に当てた結果を表示します。
表示される言葉は英語です。H then H は H を2回当てたという意味で、H then Z then H は間に Z を挟んだ場合です。
H を2回と H Z H を試す
docker exec jupyter python3 steps/interfere.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
符号が逆なら打ち消し合う
Z ゲートは、1の振幅の符号を逆にします。すると、最後の H で、0に届く2つの道すじは、逆の符号になります。
0.5 と -0.5 を足すと0です。0の振幅は消え、1の振幅だけが残ります。これが弱め合いです。
2つの道すじを足す
import math
s = 1 / math.sqrt(2)
def final_zero(sign):
# H の後は [s, s]。1の振幅に sign をかけて、もう一度 H を当てます。
return (s + sign * s) / math.sqrt(2)
print(round(final_zero(1), 3))
print(round(final_zero(-1), 3))
# 最後の行を print(round(abs(final_zero(1j)) ** 2, 3)) に変えて実行してください。
# 0の確率は、いくつになりますか。
よくある間違い
注意
半々の状態にもう一度 H を当てれば、半々をもう一度混ぜるので、半々のままだと考えがちです。足すのは確率ではなく振幅です。符号しだいで、0にも1にも決まります。
位相が変わると結果が変わる
符号や複素数など、振幅の向きを表す部分を位相と呼びます。位相を変えるゲートは、確率を変えませんが、後の干渉を変えます。
間に挟むものを、符号 -1 でなく虚数の 1j にすると、0の確率は0.5になります。完全には強め合わず、打ち消し合いもしません。
間に挟む位相と0の確率
| 間に挟むもの | 0の振幅 | 0の確率 |
|---|---|---|
| 何もしない(1) | 1 | 1 |
| Z(-1) | 0 | 0 |
| 虚数(1j) | (1 + 1j) ÷ 2 | 0.5 |
学生が入力するセルは、このプレビューでは空白です。
さらに挑戦: X を挟む
H、X、H の順に |0> へ当てると、どうなるでしょう。最後の状態を、手で道すじを足して予想します。
ノートブックで apply(H, apply(X, apply(H, zero(1), 0), 0), 0) を実行し、show の表示と比べてください。