Skip to content

Commit

Permalink
Merge pull request #89 from qulacs/release_prep
Browse files Browse the repository at this point in the history
Release prep
  • Loading branch information
Yuya-O-Nakagawa committed Dec 4, 2019
2 parents b1d955d + 7d966bf commit b9350b4
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 50 deletions.
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Quantum Native Dojoの内容を理解するには、以下のような知識が
- 2-3. 量子フーリエ変換
- 2-4. 位相推定アルゴリズム(入門編)
- 第3章 量子アルゴリズムの実行環境
- 3-1.世界最高速シミュレータQulacsの使い方
- 3-1. 世界最高速シミュレータQulacsの使い方
- 3-2. QiskitとIBM Q Experienceの使い方

===== 第2部:NISQ編 =====
Expand All @@ -93,11 +93,11 @@ Quantum Native Dojoの内容を理解するには、以下のような知識が

===== 第3部:Long-term編 =====
- 第7章 量子位相推定アルゴリズムの発展
- 7-1.量子位相推定アルゴリズム詳説:水素分子への応用を例として
- 7-1. 量子位相推定アルゴリズム詳説:水素分子への応用を例として
- 7-2. Harrow-Hassidim-Lloyd (HHL)アルゴリズム
- コラム:量子ランダムアクセスメモリー(qRAM)
- 7-3.HHLアルゴリズムを用いたポートフォリオ最適化
- コラム:低ランク行列に対する高速な特異値分解とサンプリング(量子-inspiredアルゴリズム
- 7-3. HHLアルゴリズムを用いたポートフォリオ最適化
- コラム低ランク行列に対する高速な特異値分解とサンプリング(量子-inspiredアルゴリズム
- 第8章 量子探索アルゴリズム
- 8-1. オラクル
- 8-2. グローバーのアルゴリズム
Expand Down Expand Up @@ -136,4 +136,4 @@ https://www.amazon.co.jp/dp/4781910629)」、サイエンス社 (2004)

## リリース履歴
- 2019/4/26: v0.1.0をリリースしました。
- 2019/12/2: v1.0.0をリリースしました。
- 2019/12/5: v1.0.0をリリースしました。
41 changes: 20 additions & 21 deletions notebooks/7.1_quantum_phase_estimation_detailed.ipynb

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions notebooks/7.2_Harrow-Hassidim-Lloyd_algorithm.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"metadata": {},
"source": [
"### 問題設定\n",
"HHLアルゴリズムは、sparse (疎)で正則な $N \\times N$ 行列 $A$ と $N$ 次元のベクトル $\\bf{b}$ について、連立一次方程式 $A\\mathbf{x}=\\mathbf{b}$の解 $\\mathbf{x}=A^{-1}\\mathbf{b}$ を効率的に\"計算\"するアルゴリズムである(この節では、ベクトルを **太字** で表す):\n",
"HHLアルゴリズムは、sparse (疎)で正則な $N \\times N$ 行列 $A$ と $N$ 次元のベクトル $\\bf{b}$ について、連立一次方程式 $A\\mathbf{x}=\\mathbf{b}$の解 $\\mathbf{x}=A^{-1}\\mathbf{b}$ を効率的に「計算」するアルゴリズムである(この節では、ベクトルを **太字** で表す):\n",
"\n",
"$$\n",
"|\\mathbf{b} \\rangle \\xrightarrow{\\text{HHL}} | A^{-1}\\mathbf{b} \\rangle.\n",
Expand Down Expand Up @@ -80,7 +80,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2. ユニタリー演算 $e^{i A }$ を用いた位相推定アルゴリズムを使って補助クロックビットに $A$ の固有値を格納する\n",
"#### 2. ユニタリ演算 $e^{i A }$ を用いた位相推定アルゴリズムを使って補助クロックビットに $A$ の固有値を格納する\n",
"位相推定アルゴリズム用の補助クロック(C)ビットを $n$ 量子ビット分用意する。\n",
"\n",
"$$\n",
Expand All @@ -89,7 +89,7 @@
"\n",
"\n",
"そして、ユニタリ演算 $e^{iA}$ に対する量子位相推定アルゴリズムを実行し、$A$ の固有値 $\\{ \\lambda_i \\}_{i=0}^{N-1}$を補助クロックビットに格納する。\n",
"具体的に言うと、古典ベクトル $\\mathbf{b}$ を $A$ の固有ベクトル $\\{\\mathbf{u}_i \\}_{i=0}^{N-1} $ で展開して\n",
"具体的に言うと、古典ベクトル $\\mathbf{b}$ を $A$ の固有ベクトル $\\{\\mathbf{u}_i \\}_{i=0}^{N-1}$ で展開して\n",
"\n",
"$$\n",
" \\mathbf{b} = \\sum_i \\beta_i \\mathbf{u}_i\n",
Expand Down Expand Up @@ -190,7 +190,7 @@
"以上がHHLアルゴリズムの流れである。最後に計算量について触れておく。\n",
"\n",
"* $s$ を $A$ の sparsity、つまり各行に入っている非ゼロ要素の個数の最大値\n",
"* $\\kappa$ を $A$ の条件数: $\\kappa = \\lambda_{\\textrm{max}} / \\lambda_{\\textrm{min}}$ (最大固有値と最小固有値の比)\n",
"* $\\kappa$ を $A$ の条件数: $\\kappa = |\\lambda|_{\\textrm{max}} / |\\lambda|_{\\textrm{min}}$ (固有値の絶対値の最大値と最小値の比)\n",
"* $\\epsilon$ を出力状態の $| A^{-1}\\bf{b} \\rangle$ からの誤差\n",
"\n",
"とすると、現在最も効率的な HHL アルゴリズムでの計算量は、$O(s \\kappa \\, \\textrm{poly} (\\log (s\\kappa/\\epsilon)) )$ \n",
Expand Down
4 changes: 2 additions & 2 deletions notebooks/7.2c_quantum_random_access_memory.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"\n",
"ここでの定義では、qRAMは必ずしも量子状態を常に保持する必要がないということに注意されたい。バイナリデータのアドレス達が与えられた時、効率的に上記のような重ね合わせ状態を生成する量子回路が計算され、実際に状態が出力されれば、qRAMとしての役割を果たす。\n",
"\n",
"通常 qRAM はユニタリーなプロセスとして実現することが仮定される\n",
"通常 qRAM はユニタリなプロセスとして実現することが仮定される\n",
"qRAM の仕組みを実現するアーキテクチャにはとくに決まったものはなく、現在も研究途上である。\n",
"例えば、[1] などで具体的な実装方法が提案されている。"
]
Expand All @@ -59,7 +59,7 @@
"### 参考文献\n",
"[1] V. Giovannetti, S. Lloyd, and L. Maccone, “Architectures for a quantum random access memory“, [Phys. Rev. A 78, 052310 (2008)](https://journals.aps.org/pra/abstract/10.1103/PhysRevA.78.052310) \n",
"[2] Anupam Prakash. “Quantum Algorithms for Linear Algebra and Machine Learning“. PhD thesis, EECS Department, University of California, Berkeley, Dec 2014. \n",
"[3] 御手洗光祐, 京大基研量子情報スクール用ノート, https://www2.yukawa.kyoto-u.ac.jp/~qischool2019/mitaraiCTO.pdf <br>\n",
"[3] 御手洗光祐, 京大基研量子情報スクール用ノート, https://www2.yukawa.kyoto-u.ac.jp/~qischool2019/mitaraiCTO.pdf \n",
"[4] Danial Dervovic _et al._ , “Quantum linear systems algorithms: a primer“, https://arxiv.org/abs/1802.08227 "
]
}
Expand Down
12 changes: 6 additions & 6 deletions notebooks/7.3_application_of_HHL_algorithm.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,7 @@
"\n",
"この式は\n",
"\n",
"* 「ポートフォリオの期待リターン(リターンの平均値)が$\\mu$\n",
"* 「ポートフォリオの期待リターン(リターンの平均値)が$\\mu$\n",
"* 「ポートフォリオに投資するウェイトの合計が1」($\\vec 1 = (1,1,1,1)^T$)\n",
"\n",
"という条件の下で、\n",
Expand Down Expand Up @@ -626,7 +626,7 @@
"それでは、HHL アルゴリズムを用いて、連立一次方程式(1)を解いていこう。\n",
"先ずはその下準備として、\n",
"\n",
"* 古典データ $\\mathbf{x}$ に応じて、量子状態を $|0\\cdots0\\rangle \\to \\sum_i x_i |i \\rangle$ と変換する量子回路を返す関数 `input_state_gate` (本来は qRAM の考え方を利用して作るべきだが、シミュレータを使っているので今回は non-unitary なゲートとして実装してしまう)\n",
"* 古典データ $\\mathbf{x}$ に応じて、量子状態を $|0\\cdots0\\rangle \\to \\sum_i x_i |i \\rangle$ と変換する量子回路を返す関数 `input_state_gate` (本来は qRAM の考え方を利用して作るべきだが、シミュレータを使っているので今回は non-unitary なゲートとして実装してしまう。また、規格化は無視している)\n",
"* 制御位相ゲートを返す関数 `CPhaseGate`\n",
"* 量子フーリエ変換を行うゲートを返す関数 `QFT_gate` \n",
"\n",
Expand Down Expand Up @@ -759,7 +759,7 @@
"* 量子位相推定アルゴリズムで使う $e^{iA}$ の部分は、 $A$ を古典計算機で対角化したものを使う\n",
"* 逆数をとる制御回転ゲートも、古典的に行列を用意して実装\n",
"* 補助ビット $|0 \\rangle{}_{S}$ への射影測定を行い、測定結果 `0` が得られた状態のみを扱う\n",
"(実装の都合上、制御回転ゲートの定義を[7-1節](7.1_quantum_phase_estimation_detailed.ipynb)と逆にした)"
"(実装の都合上、制御回転ゲートの作用の定義を[7-1節](7.1_quantum_phase_estimation_detailed.ipynb)と逆にした)"
]
},
{
Expand Down Expand Up @@ -804,7 +804,7 @@
" U_gate.add_control_qubit(register, 1) ## control bitの追加\n",
" total_circuit.add_gate(U_gate)\n",
"\n",
"## ------- Perfrom inverse QFT to register bits -------\n",
"## ------- Perform inverse QFT to register bits -------\n",
"total_circuit.add_gate(QFT_gate(nbit, nbit+reg_nbit-1, Inverse=True))\n",
"\n",
"## ------- conditional rotation を掛ける -------\n",
Expand Down Expand Up @@ -832,7 +832,7 @@
"condrot_gate = gate.DenseMatrix(np.arange(nbit, nbit+reg_nbit+1), condrot_mat) \n",
"total_circuit.add_gate(condrot_gate)\n",
"\n",
"## ------- Perfrom QFT to register bits -------\n",
"## ------- Perform QFT to register bits -------\n",
"total_circuit.add_gate(QFT_gate(nbit, nbit+reg_nbit-1, Inverse=False))\n",
"\n",
"## ------- 位相推定の逆を実装(U^\\dagger = e^{-iAt}) -------\n",
Expand Down Expand Up @@ -1313,7 +1313,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"2018年はGoogle以外のGAFA各社の株式が軟調だったので、およそ-20%もの損が出ているが、exact解の方は多少マシであるようだ。。\n",
"2018年はAmazon以外のGAFA各社の株式が軟調だったので、およそ-20%もの損が出ているが、exact解の方は多少マシであるようだ。。\n",
"ちなみに、元々行ったのはリスク最小化なので、この一年間のリスクも計算してみると、exact解の方が小さい結果となった。"
]
},
Expand Down
18 changes: 10 additions & 8 deletions notebooks/7.3c_quantum_inspired_algorithm.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
"$A$の$i$行$j$列の要素を$v$に更新する。\n",
"\n",
"2. 射影サンプリング \n",
"$A$の$i$行目の成分を$A$のtop-$k$特異値空間に射影したベクトル$v$を得る。\n",
"$A$の$i$行目の成分を$A$のTop-$k$特異値空間に射影したベクトル$v$を得る。\n",
"ベクトル$v$の$j$番目の要素を$\\frac{v_j^2}{\\sum_l v_l^2}$の確率で出力する。\n",
"ただし、$k$は高々$O(n,m)$である。\n",
"\n",
Expand All @@ -92,7 +92,7 @@
"\n",
"量子計算機を用いると、上記の計算を${\\rm poly}(q,n,m,\\epsilon^{-1})$で行うことができる。\n",
"これは、HHLアルゴリズムの一部を変更し、Quantum projectionというプロトコルを実施することで可能となる。\n",
"近年のEwin Tangによる論文は、この計算が同じく${\\rm poly}(q,n,m,\\epsilon^{-1})$で可能であるというものである。\n"
"近年のEwin Tangによる論文は、この計算が古典計算機でも同じく${\\rm poly}(q,n,m,\\epsilon^{-1})$で可能であるというものである。\n"
]
},
{
Expand Down Expand Up @@ -247,7 +247,7 @@
"セグメント木では4つの命令を以下のように実装する。(図でイメージするとわかりやすい;例えばこの[ブログ](https://proc-cpuinfo.fixstars.com/2017/07/optimize-segment-tree/)を参照)\n",
"\n",
"1. $i$番目の値の更新 \n",
"$a_{2^n + i}=v$と更新した上で($N=2^n$で配列の長さは$2N$)、さらに任意の$j=1,2,\\ldots$について $k = \\lfloor \\frac{2^n + i}{2^j} \\rfloor, \\: a_k \\leftarrow a_k-a_i+v$ という更新を行う。\n",
"$a_{2^n + i}=v$と更新した上で($N=2^n$で配列の長さは$2N$)、さらに全ての$j=1,2,\\ldots$について $k = \\lfloor \\frac{2^n + i}{2^j} \\rfloor, \\: a_k \\leftarrow a_k-a_i+v$ という更新を行う。\n",
"この処理は$O(n)$で終わる。\n",
"\n",
"2. $i$番目の値の取得 \n",
Expand Down Expand Up @@ -680,9 +680,9 @@
"4. $V = B^T U' D^+$を計算する。計算コストは$O(np^2)$。\n",
"5. $V = V^{\\dagger}D^+A$を計算する。計算コストは$O(n^2 p)$。\n",
"\n",
"$p$を$\\log n$の多項式としても、結果として得られる$U,D,V$は高い確率で$A$の特異値分解の良い近似となる。手順3. までで得られる、積を取れば$U$が得られる$(B,V',D)$のセットのことを$V$の簡潔表現と呼ぶ。従って、$V$の簡潔表現を得るための計算量は${\\rm poly}(S_1(A), S_2(A), log n)$である。\n",
"$p$を$\\log n$の多項式としても、結果として得られる$U,D,V$は高い確率で$A$の特異値分解の良い近似となる。手順3. までで得られる、積を取れば$U$が得られる$(B,V',D)$のセットのことを$V$の簡潔表現と呼ぶ。従って、$V$の簡潔表現を得るための計算量は${\\rm poly}(S_1(A), S_2(A), \\log n)$である。\n",
"\n",
"行列の表現としてセグメント木行列を用いると、$S_1(A), S_2(A)$はどちらも$\\rm poly(\\log n)$である。従って、FKVアルゴリズムは行列がセグメント木の形式で保持されている場合は効率的に行うことができる。\n",
"行列の表現としてセグメント木行列を用いると、$S_1(A), S_2(A)$はどちらも${\\rm poly}(\\log n)$である。従って、FKVアルゴリズムは行列がセグメント木の形式で保持されている場合は効率的に行うことができる。\n",
"\n",
"FKVアルゴリズムの実装は以下のようになる。"
]
Expand Down Expand Up @@ -869,7 +869,7 @@
"1. $M \\geq \\max_i \\left( \\frac{p_i}{q_i} \\right)$となる$M$を求める。\n",
"2. $Q$からサンプリングを行い、$i$を得る。\n",
"3. $t = \\frac{p_i}{Mq_i}$を計算する。\n",
"4. [0,1]の区間の一様乱数$r$を得る。$r<t$なら$i$を出力する。そうでなければ1.からやり直す。\n",
"4. [0,1]の区間の一様乱数 $r$ を得る。$r<t$なら$i$を出力する。そうでなければ1.からやり直す。\n",
"\n",
"上記の手続きで得られるサンプリング操作は$Q$からのサンプリング操作と一致する。\n",
"上記の操作に必要な計算量は$Q$からのサンプリングの操作が効率的なら$O(M)$の期待値で終了する。\n",
Expand Down Expand Up @@ -1143,10 +1143,12 @@
"ある$n \\times k$の行列$V$が、$p = {\\rm poly}(k)$を満たす整数$p$について、$n \\times p$のセグメント木行列$A$と$p \\times k$の密行列$B$の積で$V = AB$と表されるとき、$(A,B)$を$V$の簡潔表現と呼ぶ。\n",
"\n",
"FKVアルゴリズムは、$m \\times n$のセグメント木行列$T$と整数$k$と小さい実数$\\epsilon$に対し、$T$のTop-$k$右特異値行列$V_k$を\n",
"\n",
"$$\n",
"|T - T^{\\rm FKV}|^2_{\\rm F} \\leq |T - T^{\\rm SVD}|^2_{\\rm F} + \\epsilon |T|^2_{\\rm F}\n",
"$$\n",
"と近似する行列$T^{\\rm FKV}$の簡潔表現$(A,B)$を$k,\\epsilon^{-1}$に対して多項式時間で与える。ただし、$T^{\\rm SVD}$はSVDを用いて得られる$T$に対する最良のrank-$k$近似である。$|T|_{\\rm F}$は行列のフロベニウスノルムである。\n",
"\n",
"と近似する行列 $T^{\\rm FKV}$ の簡潔表現$(A,B)$を$k,\\epsilon^{-1}$に対して多項式時間で与える。ただし、$T^{\\rm SVD}$はSVDを用いて得られる$T$に対する最良のrank-$k$近似である。$|T|_{\\rm F}$は行列のフロベニウスノルムである。\n",
"\n",
"#### 棄却サンプリング\n",
"\n",
Expand Down Expand Up @@ -1183,7 +1185,7 @@
"\n",
"Ewin Tangのアルゴリズムは全体のアルゴリズムの前半部分として$i$行ベクトルの主成分分析を行う。まず、主成分分析とは以下のような手続きである。\n",
"\n",
"行列$A$に対して特異値分解$A = U_k D_k V_k^{\\dagger}$が得られたとき、$A$の$i$行目ベクトルのTop-$k$特異値空間へ次元を減らしたベクトル$v = A_i V_k$の要素を$A_i$のTop-$k$主成分と呼ぶ。この$k$主成分を$\\epsilon$以内の誤差で求める操作を${\\rm poly}(\\log nm, \\epsilon^{-1}, \\log \\delta^{-1} )$で行いたい。\n",
"行列$A$に対して特異値分解$A = U_k D_k V_k^{\\dagger}$が得られたとき、$A$の$i$行目ベクトルのTop-$k$特異値空間へ次元を減らしたベクトル$v = A_i V_k$の要素を$A_i$のTop-$k$主成分と呼ぶ。この$k$主成分を確率$1-\\delta$以上で$\\epsilon$以内の誤差で求める操作を${\\rm poly}(\\log nm, \\epsilon^{-1}, \\log \\delta^{-1} )$で行いたい。\n",
"\n",
"行列$A$はセグメント行列を用いた行列に格納することで、FKVアルゴリズムを実施できる。FKVアルゴリズムを実施すると、$V=A_p^{\\rm T}UD^+$となる簡潔表現$(A_p^{\\rm T},UD^+)$を効率的に得ることができる。この時、$A_p$は$p$個の行が$A$からサンプリングされたセグメント木行列表現を持つ。簡潔表現の$U,D^+$について、Top-$k$個の特異値と特異値ベクトルのみを取り出した行列をそれぞれ$U_k, D_k^+$として、我々がやるべきことは主成分ベクトル\n",
"\n",
Expand Down

0 comments on commit b9350b4

Please sign in to comment.