量子アルゴリズムの定番(続き)
レッスン6で Deutsch-Jozsa と Grover を体験しました。ここでは「入門キットの続篇」として、 実際の量子研究で重要な 4 つの定番 を、数式の細部に踏み込まず全体的に眺めましょう。
| Shor |
素因数分解を爆速に |
RSA 暗号の危機、量子計算の発端 |
| QFT(量子フーリエ変換) |
周期を見抜く「波の分析器」 |
Shor など周期検出の部品 |
| QPE(量子位相推定) |
隠れた(固有)位相を精密に読む |
化学計算・材料計算の基礎 |
| VQE |
量子+古典でエネルギーを最適化 |
量子化学シミュレーション |
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%0AY%20%3D%20np.array(%5B%5B0%2C%20-1j%5D%2C%20%5B1j%2C%200%5D%5D%2C%20dtype%3Dcomplex)%20%20%23%20Y%20%E3%82%B2%E3%83%BC%E3%83%88%EF%BC%88X%E3%83%BBZ%20%E3%81%A8%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%20Pauli%EF%BC%89%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%0AS%20%3D%20np.array(%5B%5B1%2C%200%5D%2C%20%5B0%2C%201j%5D%5D%2C%20dtype%3Dcomplex)%20%20%23%20S%20%E3%82%B2%E3%83%BC%E3%83%88%EF%BC%88Z%20%E3%81%AE%E5%B9%B3%E6%96%B9%E6%A0%B9%E3%80%8190%C2%B0%E3%81%AE%E4%BD%8D%E7%9B%B8%EF%BC%89%0AT%20%3D%20np.array(%5B%5B1%2C%200%5D%2C%20%5B0%2C%20np.exp(1j%20*%20np.pi%20%2F%204)%5D%5D%2C%20dtype%3Dcomplex)%20%20%23%20T%20%E3%82%B2%E3%83%BC%E3%83%88%EF%BC%88S%20%E3%81%AE%E5%B9%B3%E6%96%B9%E6%A0%B9%E3%80%8145%C2%B0%E3%81%AE%E4%BD%8D%E7%9B%B8%EF%BC%89%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_y(state%2C%20q)%3A%0A%20%20%20%20return%20apply1(state%2C%20Y%2C%20q)%0A%0Adef%20apply_z(state%2C%20q)%3A%0A%20%20%20%20return%20apply1(state%2C%20Z%2C%20q)%0A%0Adef%20apply_s(state%2C%20q)%3A%0A%20%20%20%20return%20apply1(state%2C%20S%2C%20q)%0A%0Adef%20apply_t(state%2C%20q)%3A%0A%20%20%20%20return%20apply1(state%2C%20T%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%20apply_swap(state%2C%20a%2C%20b)%3A%0A%20%20%20%20%22%22%22SWAP%20%E3%82%B2%E3%83%BC%E3%83%88%EF%BC%9Aqubit%20a%20%E3%81%A8%20qubit%20b%20%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E5%85%A5%E3%82%8C%E6%9B%BF%E3%81%88%E3%82%8B%22%22%22%0A%20%20%20%20s%20%3D%20apply_cnot(state%2C%20a%2C%20b)%0A%20%20%20%20s%20%3D%20apply_cnot(s%2C%20b%2C%20a)%0A%20%20%20%20return%20apply_cnot(s%2C%20a%2C%20b)%0A%0Adef%20apply_ccnot(state%2C%20c1%2C%20c2%2C%20t)%3A%0A%20%20%20%20%22%22%22CCNOT%EF%BC%88Toffoli%EF%BC%89%E3%82%B2%E3%83%BC%E3%83%88%EF%BC%9Ac1%20%E3%82%82%20c2%20%E3%82%82%201%20%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%A0%E3%81%91%20t%20%E3%82%92%E5%8F%8D%E8%BB%A2%22%22%22%0A%20%20%20%20n%20%3D%20int(np.log2(len(state)))%0A%20%20%20%20perm%20%3D%20%5Bc1%2C%20c2%2C%20t%5D%20%2B%20%5Bi%20for%20i%20in%20range(n)%20if%20i%20not%20in%20(c1%2C%20c2%2C%20t)%5D%0A%20%20%20%20s%20%3D%20np.transpose(state.reshape(%5B2%5D%20*%20n)%2C%20perm).reshape(8%2C%20-1)%0A%20%20%20%20s%5B%5B6%2C%207%5D%5D%20%3D%20s%5B%5B7%2C%206%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
Shor:素因数分解で変えた計算の地平
インターネットの暗号 RSA は「大きな数を素因数分解するのは計算機でも何億年もかかる」ことを信頼しています。
Shor のアルゴリズムは、これを量子の力で 多項式時間(\(O(L^3)\) 程度) に落とす方法です。 カギは「周期が見つかれば因数分解できる」という数論の事実を、量子の重ね合わせで利用すること。
波の繰り返し(周期)を高速に見つける → その周期から素因数を計算する
RSA の原理が動揺したことから、量子コンピュータが世界的に注目されるきっかけになりました。
QFT:波の周期を「読む」
量子フーリエ変換(QFT)は、重ね合わせ状態の中の 周期 を読み取る操作です。 下のデモは、ある周期 k を持つ「波状の振幅」を可視化したものです。QFT はこの波の周期を読み取り、ビット列として出力します。
Np%20%3D%20mo.ui.slider(2%2C%2016%2C%20value%3D8%2C%20step%3D1%2C%20label%3D%22%E6%B3%A2%E3%81%AE%E9%95%B7%E3%81%95%EF%BC%88basis%20%E6%95%B0%EF%BC%89%22%2C%20full_width%3DTrue)%0Ak_sel%20%3D%20mo.ui.slider(1%2C%207%2C%20value%3D3%2C%20step%3D1%2C%20label%3D%22%E9%9A%A0%E3%82%8C%E3%81%9F%E5%91%A8%E6%9C%9F%20k%22%2C%20full_width%3DTrue)%0Amo.hstack(%5BNp%2C%20k_sel%5D)
Np_val%20%3D%20Np.value%0Ak_val%20%3D%20k_sel.value%20%25%20Np_val%0Aamps%20%3D%20np.exp(2j%20*%20np.pi%20*%20k_val%20*%20np.arange(Np_val)%20%2F%20Np_val)%20%2F%20np.sqrt(Np_val)%0Aprobs%20%3D%20np.abs(amps)%20**%202%0Afig_qft%2C%20ax_qft%20%3D%20plt.subplots(figsize%3D(7%2C%203.4))%0Aax_qft.bar(range(Np_val)%2C%20probs%2C%20color%3Dplt.cm.viridis(np.linspace(0.3%2C%200.8%2C%20Np_val)))%0Aax_qft.axhline(probs.mean()%2C%20color%3D%22red%22%2C%20ls%3D%22--%22%2C%20lw%3D1.5%2C%20label%3D%22flat%20(no%20period%20info)%22)%0Aax_qft.set_title(f%22Periodic%20phases%20(amplitudes%20uniform%20after%20QFT%20picks%20period%20%7Bk_val%7D)%22)%0Aax_qft.set_xlabel(%22Basis%20index%20j%22)%0Aax_qft.set_ylabel(%22Probability%22)%0Aax_qft.legend(fontsize%3D8)%0Afig_qft
何がすごい? この「波の繰り返し」は、測らなくても周期 \(k\) の情報を持っています。QFT はその周期を 少数回の測定で安定に読み出せるよう、重ね合わせを「波の山」に変換するのが役割です。 この「波の見抜く力」が、Shor アルゴリズムの周期検出などで使われます。
QPE:隠れた位相を読む「物差し」
量子位相推定(QPE) は、ある演算が状態をどのくらい回転させるか(固有位相)を、量子ビットのビット列として読み取る手法です。
QPE は QFT を最後に使う構成が典型です。
theta_q%20%3D%200.6%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%8E%A2%E3%81%97%E3%81%9F%E3%81%84%E4%BD%8D%E7%9B%B8%E3%81%AE%E9%87%8F%EF%BC%88%E5%9B%BA%E6%9C%89%E4%BD%8D%E7%9B%B8%EF%BC%89%0AN_q%20%3D%206%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%20qubit%20%E6%95%B0%EF%BC%88%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%89%0Aqr_rots%20%3D%20%5Bnp.exp(1j%20*%20theta_q%20*%202**r)%20for%20r%20in%20range(N_q)%5D%0Afig_qpe%2C%20ax_qpe%20%3D%20plt.subplots(figsize%3D(7%2C%203.4))%0Aax_qpe.stem(range(N_q)%2C%20%5Bv.real%20for%20v%20in%20qr_rots%5D%2C%20linefmt%3D%22tab%3Ablue%22%2C%20markerfmt%3D%22.%22%2C%20basefmt%3D%22gray%22)%0Aax_qpe.axhline(0%2C%20color%3D%22gray%22%2C%20lw%3D0.8)%0Aax_qpe.set_title(%22QPE%3A%20controlled%20rotations%20with%20angle%20theta%3B%20QFT%20turns%20them%20into%20bits%22)%0Aax_qpe.set_xlabel(%22Control%20qubit%20r%22)%0Aax_qpe.set_ylabel(%22Re%20(phase%20factor)%22)%0Afig_qpe
概念は「角度を測る物差し」の重ね合わせ。複数の qubit の位相のずれを、QFT で 0 と 1 のビット列 に変換します。化学分子のエネルギー計算などに欠かせません。
VQE:量子化学・分子のエネルギー推定
VQE(Variational Quantum Eigensolver) は、量子回路と古典最適化を組み合わせて、 分子の(基底)エネルギーを求める方式です。
| ① |
量子回路で「試しの分子状態」を準備 |
| ② |
エネルギーを測定 |
| ③ |
古典 CPU がパラメータを微調整 |
| ④ |
②③を繰り返し、最小エネルギーに収束 → 完成 |
v_steps%20%3D%20mo.ui.slider(1%2C%2030%2C%20value%3D1%2C%20step%3D1%2C%20label%3D%22VQE%20%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E6%95%B0%22%2C%20full_width%3DTrue)%0Av_steps
rngv%20%3D%20np.random.default_rng(0)%0Aest%20%3D%20%5B3.0%2C%202.4%2C%201.9%2C%201.55%2C%201.3%2C%201.15%2C%201.05%2C%200.98%2C%200.93%2C%200.88%5D%0Aest%20%3D%20est%20%2B%20%5Bmax(0.72%2C%20est%5B-1%5D%20-%200.03%20*%20(i%20-%209))%20for%20i%20in%20range(10%2C%2030)%5D%0Atarget_e%20%3D%200.7%0Afig_vqe%2C%20ax_vqe%20%3D%20plt.subplots(figsize%3D(7%2C%203.4))%0Aax_vqe.plot(range(1%2C%2031)%2C%20est%2C%20color%3D%22tab%3Ablue%22%2C%20marker%3D%22o%22%2C%20ms%3D4%2C%20label%3D%22VQE%20estimate%22)%0Aax_vqe.axhline(target_e%2C%20color%3D%22red%22%2C%20ls%3D%22--%22%2C%20lw%3D1.5%2C%20label%3D%22true%20ground%20energy%20(approx)%22)%0Aax_vqe.set_xlim(1%2C%2031)%0Aax_vqe.set_xticks(range(1%2C%2031%2C%205))%0Aax_vqe.set_title(%22VQE%3A%20energy%20decreases%20toward%20the%20true%20ground%20energy%22)%0Aax_vqe.set_xlabel(%22Optimization%20step%22)%0Aax_vqe.set_ylabel(%22Energy%22)%0Aax_vqe.legend(fontsize%3D8)%0Afig_vqe
スライダーで「学習」を再生 ステップを増やすと、見積もりエネルギーが正解値(赤線)に近づいていく様子を動的に見られます。
まとめ
- Shor:素因数分解を周期検出に帰着し、RSA の根拠を揺るがす。
- QFT:重ね合わせの中の周期を読み取る「分析器」。
- QPE:QFT を使って隠れた固有位相をビット列に変換する基本技術。
- VQE:量子+古典の最適化で分子エネルギー推定。量子化学への入り口。
次は実機の問題、ノイズと誤り訂正 を見ます。