量子アルゴリズム
重ね合わせ・もつれ・干渉を組み合わせると、古典コンピュータより速く解ける問題が出てきます。 最後のレッスンでは、代表的な 2 つのアルゴリズムを、実際に回路を組んで体感しましょう。
| Deutsch-Jozsa |
関数が「定数」か「バランス」かを判定 |
古典 \(2^{n-1}+1\) 回 → 量子 1 回 |
| Grover |
データベースから目的の項目を探す |
古典 \(O(N)\) → 量子 \(O(\sqrt{N})\) |
import%20marimo%20as%20mo%0Aimport%20numpy%20as%20np%0Aimport%20matplotlib.pyplot%20as%20plt%0A%0A%23%20%E5%9F%BA%E6%9C%AC%E3%82%B2%E3%83%BC%E3%83%88%EF%BC%88%E3%83%A6%E3%83%8B%E3%82%BF%E3%83%AA%E8%A1%8C%E5%88%97%EF%BC%89%0AH%20%3D%20np.array(%5B%5B1%2C%201%5D%2C%20%5B1%2C%20-1%5D%5D%2C%20dtype%3Dcomplex)%20%2F%20np.sqrt(2)%20%20%23%20%E3%82%A2%E3%83%80%E3%83%9E%E3%83%BC%E3%83%AB%0AX%20%3D%20np.array(%5B%5B0%2C%201%5D%2C%20%5B1%2C%200%5D%5D%2C%20dtype%3Dcomplex)%20%20%23%20NOT%20%E3%82%B2%E3%83%BC%E3%83%88%0AZ%20%3D%20np.array(%5B%5B1%2C%200%5D%2C%20%5B0%2C%20-1%5D%5D%2C%20dtype%3Dcomplex)%20%20%23%20Z%20%E3%82%B2%E3%83%BC%E3%83%88%0A%0Adef%20init_state(n)%3A%0A%20%20%20%20%22%22%22n%20%E9%87%8F%E5%AD%90%E3%83%93%E3%83%83%E3%83%88%E3%81%AE%E5%88%9D%E6%9C%9F%E7%8A%B6%E6%85%8B%20%7C00...0%3E%22%22%22%0A%20%20%20%20state%20%3D%20np.zeros(2**n%2C%20dtype%3Dcomplex)%0A%20%20%20%20state%5B0%5D%20%3D%201%0A%20%20%20%20return%20state%0A%0Adef%20apply1(state%2C%20gate%2C%20q)%3A%0A%20%20%20%20%22%22%221%20%E9%87%8F%E5%AD%90%E3%83%93%E3%83%83%E3%83%88%E3%82%B2%E3%83%BC%E3%83%88%20gate%20%E3%82%92%20qubit%20q%20%E3%81%AB%E9%81%A9%E7%94%A8%22%22%22%0A%20%20%20%20n%20%3D%20int(np.log2(len(state)))%0A%20%20%20%20perm%20%3D%20%5Bq%5D%20%2B%20%5Bi%20for%20i%20in%20range(n)%20if%20i%20!%3D%20q%5D%0A%20%20%20%20s%20%3D%20np.transpose(state.reshape(%5B2%5D%20*%20n)%2C%20perm)%0A%20%20%20%20s%20%3D%20(gate%20%40%20s.reshape(2%2C%20-1)).reshape(%5B2%5D%20*%20n)%0A%20%20%20%20s%20%3D%20np.transpose(s%2C%20np.argsort(perm))%0A%20%20%20%20return%20s.reshape(-1)%0A%0Adef%20apply_h(state%2C%20q)%3A%0A%20%20%20%20return%20apply1(state%2C%20H%2C%20q)%0A%0Adef%20apply_x(state%2C%20q)%3A%0A%20%20%20%20return%20apply1(state%2C%20X%2C%20q)%0A%0Adef%20apply_z(state%2C%20q)%3A%0A%20%20%20%20return%20apply1(state%2C%20Z%2C%20q)%0A%0Adef%20apply_cnot(state%2C%20c%2C%20t)%3A%0A%20%20%20%20%22%22%22%E5%88%B6%E5%BE%A1%20qubit%20c%20%E3%82%92%E5%85%83%E3%81%AB%E3%80%81%E6%A8%99%E7%9A%84%20qubit%20t%20%E3%82%92%E5%8F%8D%E8%BB%A2%E3%81%95%E3%81%9B%E3%82%8B%20CNOT%22%22%22%0A%20%20%20%20n%20%3D%20int(np.log2(len(state)))%0A%20%20%20%20perm%20%3D%20%5Bc%2C%20t%5D%20%2B%20%5Bi%20for%20i%20in%20range(n)%20if%20i%20not%20in%20(c%2C%20t)%5D%0A%20%20%20%20s%20%3D%20np.transpose(state.reshape(%5B2%5D%20*%20n)%2C%20perm).reshape(4%2C%20-1)%0A%20%20%20%20s%5B%5B2%2C%203%5D%5D%20%3D%20s%5B%5B3%2C%202%5D%5D%0A%20%20%20%20s%20%3D%20np.transpose(s.reshape(%5B2%5D%20*%20n)%2C%20np.argsort(perm))%0A%20%20%20%20return%20s.reshape(-1)%0A%0Adef%20measure_counts(state%2C%20shots%3D1024%2C%20seed%3D42)%3A%0A%20%20%20%20%22%22%22%E6%B8%AC%E5%AE%9A%E3%82%92%20shots%20%E5%9B%9E%E3%81%8F%E3%82%8A%E8%BF%94%E3%81%97%E3%80%81%E3%83%93%E3%83%83%E3%83%88%E5%88%97%E3%81%94%E3%81%A8%E3%81%AE%E5%9B%9E%E6%95%B0%E3%82%92%E8%BF%94%E3%81%99%22%22%22%0A%20%20%20%20probs%20%3D%20np.abs(state)%20**%202%0A%20%20%20%20probs%20%3D%20probs%20%2F%20probs.sum()%20%20%23%20%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E8%AA%A4%E5%B7%AE%E5%AF%BE%E7%AD%96%E3%81%A7%E6%AD%A3%E8%A6%8F%E5%8C%96%0A%20%20%20%20rng%20%3D%20np.random.default_rng(seed)%0A%20%20%20%20n%20%3D%20int(np.log2(len(state)))%0A%20%20%20%20counts%20%3D%20%7B%7D%0A%20%20%20%20for%20s%20in%20rng.choice(2**n%2C%20size%3Dshots%2C%20p%3Dprobs)%3A%0A%20%20%20%20%20%20%20%20bits%20%3D%20format(s%2C%20f%220%7Bn%7Db%22)%20%20%23%20%E5%B7%A6%E3%81%8C%20qubit0%EF%BC%88%E6%9C%80%E4%B8%8A%E4%BD%8D%EF%BC%89%E2%86%92%20%E9%A0%86%E3%81%AB%20qubit1%2C%20...%0A%20%20%20%20%20%20%20%20counts%5Bbits%5D%20%3D%20counts.get(bits%2C%200)%20%2B%201%0A%20%20%20%20return%20counts%0A%0Adef%20plot_counts(counts%2C%20title%3D%22Measurement%20results%22)%3A%0A%20%20%20%20%22%22%22%E6%B8%AC%E5%AE%9A%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%8F%8F%E3%81%8F%EF%BC%88%E2%80%BBWASM%E6%8F%8F%E7%94%BB%E3%81%AE%E3%81%9F%E3%82%81%E6%96%87%E5%AD%97%E3%81%AF%E8%8B%B1%E5%AD%97%E3%81%AE%E3%81%BF%EF%BC%89%22%22%22%0A%20%20%20%20keys%20%3D%20sorted(counts)%0A%20%20%20%20vals%20%3D%20%5Bcounts%5Bk%5D%20for%20k%20in%20keys%5D%0A%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(7%2C%203.8))%0A%20%20%20%20ax.bar(keys%2C%20vals%2C%20color%3Dplt.cm.viridis(np.linspace(0.25%2C%200.85%2C%20len(keys))))%0A%20%20%20%20ax.set_title(title)%0A%20%20%20%20ax.set_xlabel(%22Outcome%20(bitstring)%22)%0A%20%20%20%20ax.set_ylabel(%22Counts%22)%0A%20%20%20%20ax.set_ylim(0%2C%20max(vals)%20*%201.2%20%2B%201)%0A%20%20%20%20return%20fig%0A%0Adef%20plot_state(state%2C%20title%3D%22State%20probabilities%22)%3A%0A%20%20%20%20%22%22%22%E5%90%84%E3%83%93%E3%83%83%E3%83%88%E5%88%97%E3%81%AE%E7%A2%BA%E7%8E%87%20%7C%CE%B1%7C%C2%B2%20%E3%82%92%E6%A3%92%E3%82%B0%E3%83%A9%E3%83%95%E3%81%A7%E8%A1%A8%E7%A4%BA%EF%BC%88%E2%80%BB%E8%8B%B1%E5%AD%97%E3%81%AE%E3%81%BF%EF%BC%89%22%22%22%0A%20%20%20%20probs%20%3D%20np.abs(state)%20**%202%0A%20%20%20%20n%20%3D%20int(np.log2(len(state)))%0A%20%20%20%20keys%20%3D%20%5Bformat(i%2C%20f%220%7Bn%7Db%22)%20for%20i%20in%20range(len(state))%5D%0A%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(7%2C%203.8))%0A%20%20%20%20ax.bar(keys%2C%20probs%2C%20color%3Dplt.cm.plasma(np.linspace(0.2%2C%200.9%2C%20len(keys))))%0A%20%20%20%20ax.set_title(title)%0A%20%20%20%20ax.set_xlabel(%22Bitstring%20(q0%20is%20leftmost)%22)%0A%20%20%20%20ax.set_ylabel(%22Probability%20%7Ca%7C%5E2%22)%0A%20%20%20%20ax.set_ylim(0%2C%201.1)%0A%20%20%20%20return%20fig%0A%0Adef%20bloch_vector(state)%3A%0A%20%20%20%20%22%22%221%20%E9%87%8F%E5%AD%90%E3%83%93%E3%83%83%E3%83%88%E7%8A%B6%E6%85%8B%E3%82%92%E3%83%96%E3%83%AD%E3%83%83%E3%83%9B%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%20(x%2C%20y%2C%20z)%20%E3%81%AB%E5%A4%89%E6%8F%9B%22%22%22%0A%20%20%20%20a%2C%20b%20%3D%20state%0A%20%20%20%20theta%20%3D%202%20*%20np.arctan2(abs(b)%2C%20abs(a))%0A%20%20%20%20phi%20%3D%20np.angle(b)%20-%20np.angle(a)%0A%20%20%20%20return%20np.array(%0A%20%20%20%20%20%20%20%20%5Bnp.sin(theta)%20*%20np.cos(phi)%2C%20np.sin(theta)%20*%20np.sin(phi)%2C%20np.cos(theta)%5D%0A%20%20%20%20)%0A%0Adef%20plot_bloch(state%2C%20title%3D%22Bloch%20sphere%22)%3A%0A%20%20%20%20%22%22%221%20%E9%87%8F%E5%AD%90%E3%83%93%E3%83%83%E3%83%88%E7%8A%B6%E6%85%8B%E3%82%92%E3%83%96%E3%83%AD%E3%83%83%E3%83%9B%E7%90%83%E4%B8%8A%E3%81%AB%E6%8F%8F%E3%81%8F%22%22%22%0A%20%20%20%20v%20%3D%20bloch_vector(state)%0A%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(4.6%2C%204.6))%0A%20%20%20%20ax%20%3D%20fig.add_subplot(111%2C%20projection%3D%223d%22)%0A%20%20%20%20u%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%2040)%0A%20%20%20%20w%20%3D%20np.linspace(0%2C%20np.pi%2C%2040)%0A%20%20%20%20ax.plot_surface(%0A%20%20%20%20%20%20%20%20np.outer(np.sin(u)%2C%20np.sin(w))%2C%0A%20%20%20%20%20%20%20%20np.outer(np.cos(u)%2C%20np.sin(w))%2C%0A%20%20%20%20%20%20%20%20np.outer(np.ones(40)%2C%20np.cos(w))%2C%0A%20%20%20%20%20%20%20%20color%3D%22lightgray%22%2C%0A%20%20%20%20%20%20%20%20alpha%3D0.35%2C%0A%20%20%20%20%20%20%20%20linewidth%3D0%2C%0A%20%20%20%20)%0A%20%20%20%20for%20vec%2C%20col%20in%20%5B(%5B1%2C%200%2C%200%5D%2C%20%22red%22)%2C%20(%5B0%2C%201%2C%200%5D%2C%20%22green%22)%2C%20(%5B0%2C%200%2C%201%5D%2C%20%22blue%22)%5D%3A%0A%20%20%20%20%20%20%20%20ax.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B-vec%5B0%5D%2C%20vec%5B0%5D%5D%2C%20%5B-vec%5B1%5D%2C%20vec%5B1%5D%5D%2C%20%5B-vec%5B2%5D%2C%20vec%5B2%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dcol%2C%20alpha%3D0.5%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20ax.plot(%5B0%2C%20v%5B0%5D%5D%2C%20%5B0%2C%20v%5B1%5D%5D%2C%20%5B0%2C%20v%5B2%5D%5D%2C%20color%3D%22black%22%2C%20lw%3D2)%0A%20%20%20%20ax.scatter(%5Bv%5B0%5D%5D%2C%20%5Bv%5B1%5D%5D%2C%20%5Bv%5B2%5D%5D%2C%20color%3D%22darkorange%22%2C%20s%3D80)%0A%20%20%20%20ax.set_title(title)%0A%20%20%20%20ax.set_xlabel(%22X%22)%0A%20%20%20%20ax.set_ylabel(%22Y%22)%0A%20%20%20%20ax.set_zlabel(%22Z%22)%0A%20%20%20%20ax.set_xlim(-1%2C%201)%0A%20%20%20%20ax.set_ylim(-1%2C%201)%0A%20%20%20%20ax.set_zlim(-1%2C%201)%0A%20%20%20%20ax.set_box_aspect((1%2C%201%2C%201))%0A%20%20%20%20return%20fig
Deutsch-Jozsa:たった1回の質問で見抜く
問題:\(f\) は 0 → 0/1、1 → 0/1 の関数。\(f\) が「定数」(\(f(0)=f(1)\))か「バランス」(\(f(0)\neq f(1)\))かを判定したい。
古典では最悪 2 回 関数を呼ぶ必要があります。量子では、関数をブラックボックス(oracle)として 1 回だけ 呼ぶだけで判定できます。
仕組みを試しましょう。関数を選ぶと、上の回路を組んで測定します。q0 の測定結果が 0 なら定数、1 ならバランスです。
func_choice%20%3D%20mo.ui.dropdown(%0A%20%20%20%20options%3D%7B%0A%20%20%20%20%20%20%20%20%22const0%22%3A%20%22f(x)%20%3D%200%EF%BC%88%E5%AE%9A%E6%95%B0%EF%BC%89%22%2C%0A%20%20%20%20%20%20%20%20%22const1%22%3A%20%22f(x)%20%3D%201%EF%BC%88%E5%AE%9A%E6%95%B0%EF%BC%89%22%2C%0A%20%20%20%20%20%20%20%20%22bal_x%22%3A%20%22f(x)%20%3D%20x%EF%BC%88%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9%EF%BC%89%22%2C%0A%20%20%20%20%20%20%20%20%22bal_nx%22%3A%20%22f(x)%20%3D%201%E2%8A%95x%EF%BC%88%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9%EF%BC%89%22%2C%0A%20%20%20%20%7D%2C%0A%20%20%20%20value%3D%22const0%22%2C%0A%20%20%20%20label%3D%22%E9%96%A2%E6%95%B0%20f%20%E3%82%92%E9%81%B8%E3%81%B6%22%2C%0A)%0Afunc_choice
判定結果:バランス関数 (q0 が 1 ならバランス、0 なら定数)
def%20oracle(kind%2C%20s)%3A%0A%20%20%20%20if%20kind%20%3D%3D%20%22const0%22%3A%0A%20%20%20%20%20%20%20%20return%20s%0A%20%20%20%20if%20kind%20%3D%3D%20%22const1%22%3A%0A%20%20%20%20%20%20%20%20return%20apply_x(s%2C%201)%0A%20%20%20%20if%20kind%20%3D%3D%20%22bal_x%22%3A%0A%20%20%20%20%20%20%20%20return%20apply_cnot(s%2C%200%2C%201)%0A%20%20%20%20return%20apply_cnot(apply_x(s%2C%201)%2C%200%2C%201)%20%20%23%20bal_nx%0A%0Adj_state%20%3D%20init_state(2)%0Adj_state%20%3D%20apply_x(dj_state%2C%201)%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%A3%9C%E5%8A%A9%20qubit1%20%E3%82%92%20%7C1%E2%9F%A9%20%E3%81%AB%0Adj_state%20%3D%20apply_h(dj_state%2C%200)%0Adj_state%20%3D%20apply_h(dj_state%2C%201)%0Adj_state%20%3D%20oracle(func_choice.value%2C%20dj_state)%20%20%20%20%20%20%20%23%20%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E3%82%92%201%20%E5%9B%9E%E3%81%A0%E3%81%91%E5%91%BC%E3%81%B6%0Adj_state%20%3D%20apply_h(dj_state%2C%200)%0Adj_counts%20%3D%20measure_counts(dj_state%2C%20shots%3D1024%2C%20seed%3D0)%0Ais_balanced%20%3D%20any(k%5B0%5D%20%3D%3D%20%221%22%20for%20k%20in%20dj_counts)%0Amo.hstack(%5B%0A%20%20%20%20plot_counts(dj_counts%2C%20title%3D%22Measurement%20of%20q0%22)%2C%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22**%E5%88%A4%E5%AE%9A%E7%B5%90%E6%9E%9C%EF%BC%9A%7B'%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9%E9%96%A2%E6%95%B0'%20if%20is_balanced%20else%20'%E5%AE%9A%E6%95%B0%E9%96%A2%E6%95%B0'%7D**%20%20%22%0A%20%20%20%20%20%20%20%20f%22%EF%BC%88q0%20%E3%81%8C%201%20%E3%81%AA%E3%82%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9%E3%80%810%20%E3%81%AA%E3%82%89%E5%AE%9A%E6%95%B0%EF%BC%89%22%0A%20%20%20%20)%2C%0A%5D)
見てみよう - f(x)=0 や f(x)=1(定数)を選ぶと、q0 は 必ず 0。 - f(x)=x や f(x)=1⊕x(バランス)を選ぶと、q0 は 必ず 1。 - 関数を 1 回だけ呼ぶだけで、古典の 2 回と同等以上の判定ができています。
Grover:データベースから一発で見つける
4 個の箱(00〜11)の中から、目的の箱を探す問題を考えます。古典なら平均 2〜3 回 開けないといけませんが、 Grover アルゴリズムは1 ステップで確率をほぼ 100% に引き上げます。
仕組みは「目的の振幅を増幅」すること: 1. 全部の箱を重ね合わせにする 2. オラクルで目的の箱の符号を反転 3. 拡散(平均まわりの反転)で、目的の箱の振幅を増幅 4. 測定 → 目的の箱が出やすい!
target%20%3D%20mo.ui.dropdown(%0A%20%20%20%20options%3D%7B%2200%22%3A%20%2200%22%2C%20%2201%22%3A%20%2201%22%2C%20%2210%22%3A%20%2210%22%2C%20%2211%22%3A%20%2211%22%7D%2C%0A%20%20%20%20value%3D%2211%22%2C%0A%20%20%20%20label%3D%22%E6%8E%A2%E3%81%97%E3%81%9F%E3%81%84%E7%AE%B1%EF%BC%88%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%EF%BC%89%E3%82%92%E9%81%B8%E3%81%B6%22%2C%0A)%0Atarget
t%20%3D%20int(target.value%2C%202)%20%20%23%20%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%0Ag_state%20%3D%20init_state(2)%0Ag_state%20%3D%20apply_h(g_state%2C%200)%0Ag_state%20%3D%20apply_h(g_state%2C%201)%0A%0A%23%20%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%EF%BC%9A%7C%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E2%9F%A9%20%E3%81%A0%E3%81%91%E7%AC%A6%E5%8F%B7%E3%82%92%E5%8F%8D%E8%BB%A2%EF%BC%88%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%82%92%20%7C11%E2%9F%A9%20%E3%81%AB%E7%A7%BB%E3%81%97%E3%81%A6%20CZ%EF%BC%89%0At0%2C%20t1%20%3D%20(t%20%3E%3E%201)%20%26%201%2C%20t%20%26%201%0Aif%20t0%20%3D%3D%200%3A%0A%20%20%20%20g_state%20%3D%20apply_x(g_state%2C%200)%0Aif%20t1%20%3D%3D%200%3A%0A%20%20%20%20g_state%20%3D%20apply_x(g_state%2C%201)%0Ag_state%20%3D%20apply_h(g_state%2C%201)%0Ag_state%20%3D%20apply_cnot(g_state%2C%200%2C%201)%0Ag_state%20%3D%20apply_h(g_state%2C%201)%0Aif%20t0%20%3D%3D%200%3A%0A%20%20%20%20g_state%20%3D%20apply_x(g_state%2C%200)%0Aif%20t1%20%3D%3D%200%3A%0A%20%20%20%20g_state%20%3D%20apply_x(g_state%2C%201)%0A%0A%23%20%E6%8B%A1%E6%95%A3%EF%BC%88%E5%B9%B3%E5%9D%87%E3%81%BE%E3%82%8F%E3%82%8A%E3%81%AE%E5%8F%8D%E8%BB%A2%EF%BC%89%0Ag_state%20%3D%20apply_h(g_state%2C%200)%3B%20g_state%20%3D%20apply_h(g_state%2C%201)%0Ag_state%20%3D%20apply_x(g_state%2C%200)%3B%20g_state%20%3D%20apply_x(g_state%2C%201)%0Ag_state%20%3D%20apply_h(g_state%2C%201)%3B%20g_state%20%3D%20apply_cnot(g_state%2C%200%2C%201)%3B%20g_state%20%3D%20apply_h(g_state%2C%201)%0Ag_state%20%3D%20apply_x(g_state%2C%200)%3B%20g_state%20%3D%20apply_x(g_state%2C%201)%0Ag_state%20%3D%20apply_h(g_state%2C%200)%3B%20g_state%20%3D%20apply_h(g_state%2C%201)%0A%0Ag_counts%20%3D%20measure_counts(g_state%2C%20shots%3D2048%2C%20seed%3D0)%0Aplot_state(g_state%2C%20title%3Df%22Target%20%7C%7Btarget.value%7D%3E%20searched%20(1%20step)%22)
g_counts2%20%3D%20measure_counts(g_state%2C%20shots%3D2048%2C%20seed%3D0)%0Aplot_counts(g_counts2%2C%20title%3Df%22Measurement%3A%20target%20%7C%7Btarget.value%7D%3E%20dominates%22)
見てみよう - どのターゲットを選んでも、測定するとほぼ必ずその箱が出ます。 - 「振幅の増幅」によって、4 箱の中から 1 ステップ で特定できるのが Grover の力です。 - 箱の数が 100 万個になっても、Grover は古典の \(\sqrt{N}\) 倍速(約 1,000 回)で探せます。
まとめ
- Deutsch-Jozsa:定数/バランス判定を 1 回のクエリで行う。
- Grover:検索を \(O(\sqrt{N})\) で行う「振幅増幅」アルゴリズム。
- 両者に共通するのは「重ね合わせで可能性を広げ、干渉で目的の振幅を増幅する」という量子の力。
これで 6 レッスンは完了です。あとは ワークシート で復習し、「自分のPCで試す」ページの Qiskit ノートブックで、実際の量子 SDK にも触れてみましょう。