量子会計士

先輩、それ本気でノイマン型でやるんですか?!と言われないためにあがく。

Quantum Information Science I メモ その3 Quantum state

再び、Shor先生登場。
texを調べながらメモる。

Shor先生は、天才的な人なのは間違いないだろうけど、結構計算間違いする。
凡人の思っていた天才と違って親近感が感じられます。

凡人の私は、先生の間違いを見逃している可能性大なので要注意。 
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}\\
\require{HTML}

ここからの量子力学の説明における前提知識

前提としない知識 (つまり、先生が授業で教えてくれるやつ)

  • ユニタリー行列 (Untary matrices)
  • エルミート行列 (Hermitian matrices)
  • テンソル積 (Tensor products)

Quantum state

Quantum state はcomplex vector space(虚数を含むベクトル空間)で、Qbitは2次元の quantum state

  • 光子の偏光 : \ket\leftrightarrow と \ket\updownarrow
  • 粒子の\displaystyle \frac{1}{2}スピン : \ket\uparrow\ket\downarrow
  • Harmonic oscillator (調和振動子) \ket{0},\ket{1},\ket{2},\ket{3}

例として、4次元のstate spaceを考える basis vectors (基本ベクトル?)を \ket{0},\ket{1},\ket{2},\ket{3}とおく
列ベクトル \ket{v}=\begin{pmatrix} v_{1}\\ v_{2}\\ v_{3} \\ v_{4} \end{pmatrix}

Quantum stateは、Quantum space内の単位ベクトル

例: \ket{v}=\begin{pmatrix} {0.5}\\ {0.5}\\ {0.7i} \\ {0.1} \end{pmatrix}

\sqrt{{0.5}^2 + {0.5}^2 + {0.7}^2+{0.1}^2}=1

Dirac記法で、

  • \bra{v} ← こちらがbra で、
  • \ket{v} ←こちらket

\bra{v} = v^{*T} : vの複素共役の転置

  • 2つ合わせると braket(センスいいなぁ): \braket{v}{v} = 1 (vは単位ベクトルなので)
  • \braket{w}{v} = w^{*T}v

光子の偏光で言えば

  • \displaystyle \ket{\style{display: inline-block; transform: rotate(45deg)}{\updownarrow}} = \frac{1}{\sqrt{2}}(\ket{\leftrightarrow} + \ket{\updownarrow}) : 斜め45度偏光
  • \displaystyle \ket{\style{display: inline-block; transform: rotate(-45deg)}{\updownarrow}} = \frac{1}{\sqrt{2}}(\ket{\leftrightarrow} - \ket{\updownarrow})
  • \displaystyle \ket{\circlearrowright} = \frac{1}{\sqrt{2}}(\ket{\leftrightarrow} - i\ket{\updownarrow}) : 円偏光(なんすかそれ。)
  •  \theta 傾いたものは、 cos\theta\ket{\leftrightarrow} + sin\theta\ket{\updownarrow}

粒子のスピンで言うと

  • \uparrow: spin up
  • \downarrow: spin down
  • \displaystyle \rightarrow = \frac{1}{\sqrt{2}}(\ket{\uparrow} + \ket{\downarrow})
  • \displaystyle \leftarrow = \frac{1}{\sqrt{2}}(\ket{\uparrow} - \ket{\downarrow})
  • \displaystyle \otimes = \frac{1}{\sqrt{2}}(\ket{\uparrow} + i\ket{\downarrow}) : in 画面奥に行く方向
  • \displaystyle \odot= \frac{1}{\sqrt{2}}(\ket{\uparrow} - i\ket{\downarrow}) : out 画面の手前に来る方向

Global phase(全体の係数?)をかけてもQuantum stateの基本的性質は変わらない。 \rightarrow Global phaseは無視できる。消せる。

ということから、\ket{\downarrow} は、 i\ket{\downarrow}と"本質的には同じ"
だけど、\displaystyle \frac{1}{\sqrt{2}}(\ket{\uparrow} + \ket{\downarrow}) \neq \frac{1}{\sqrt{2}}(\ket{\uparrow} + i\ket{\downarrow}) : rightとinで、違う。

であれば、 i \ket{\uparrow} (2次元のQuantum stateの片方)の係数からはとることができるということかな。

( \ket{\uparrow}, \ket{\downarrow}両方にiがついていたら、括りだして消す。 \ket{\uparrow}についていたら、Global phaseをiとして、 \ket{\downarrow}の係数に-iかければOK、Global phaseのiは消せる。)

Global phaseが変わっても、なんで"本質的に同じ"なのか理解していない。どちらにしろ確率として、各状態の係数の2乗の和は1になるように調整するから?

あと、なんで、虚数がでてきたのかがわからない。。計算しやすいから?

Bloch Sphere ブロッホ球をJupyter notebookで書く

量子力学のメモを取るにあたり、Bloch Sphereを書きたい。Texでは、"blochsphere package"を使えば簡単に書けるようだが、HatenaのMarkdownというか、はてなで使われているMathJaxでは無理っぽい。そこで、Jupyter notebook使って書く方法(3D版を諦めるまでの軌跡)をメモ

手順

  • QuTiPを conda でインストール
conda install QuTiP 

でいけると思われるが、今回は、以下にあるcondaのenviromentのレシピ?を使って、インストールしていた環境に、QuTiPが含まれていたので、それを利用

https://github.com/Microsoft/Quantum/tree/master/Samples/PythonInterop

インストールするコマンドは、

conda env create -f environment.yml
  • 以下のような感じでJupyter上実行

描けた。 なお、Peter Shor先生が授業で描いてた向きは[190,20]くらい。

Bloch3dを諦めるまでの軌跡

よりきれいなBloch Shpereを書くには、Bloch3d()を使うと良いらしいが。。

  • Bloch3d()を実行したらmayaviがないと怒られる
  • conda install mayavi したら、以下の通り怒られる
Solving environment: failed

UnsatisfiableError: The following specifications were found to be in conflict:
  - mayavi -> apptools==4.2.0 -> python=2.7
  - python[version='>=3.6']
Use "conda info <package>" to see the dependencies for each package.
  • Mayaviのページを見て、気が進まないが pipで入れようとしたら、VSの C++ Build Toosがいると怒られる
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
  • conda install -c conda-forge mayavi で無事インストールできたが、いざ、Bloch3d()を実行すると"vtk"がないと怒られる
  • conda install -c viscid-hub vtkでインストール成功
  • Bloch3d()すると、図が出て来たが、jupyter notebook外で画像が開かれる。。。
  • jupyterのextensionをインストール
jupyter nbextension install --py mayavi --user
  • 以下を実行し、サンプルの3D図をJupyter上に描けるも、同じようにJupter notebook内にBloch Shphereを描く方法が分からず。
from mayavi import mlab
mlab.init_notebook()
mlab.test_plot3d()
  • 試しに、上のサンプル3Dが入ったipynbファイルをGistにアップロードする→405 Not Allowed。3Dの絵は、Gistには上げられないっぽい。じゃあ、3D意味ない。

    諦める

Quantum Information Science I メモ その2 コンピュータの種類

先生がIsaac Chuangに交代。この先生、WikipediaにおるとNuclear magnetic resonance (NMR) quantum computerのパイオニアとのことですが、なんことやら。 中身は、通常のComputer Science で、量子コンピュータはなかなか出てこない。しかし、CSの授業として奥深く面白かった。

UniversalなComputerの"Model"っていっても色々

  • 機械的コンピュータ
  • 電気的コンピュータ
  • 普通のコンピュータ含む
  • 光学的コンピュータ
  • 生物学的コンピュータ

    • DNA computer: ここで用いられる Bio operation <- electrical computerにおけるAND OR等の演算がDNAの場合、 Melting, Appending, Cutting, ripflip, PCR(Polymerase chan reaction) CRISPR/Cas9 →いわゆるゲノム編集ツール(第三世代らしい) これによって、DNAコンピューターの可能性も広がるのか。
  • コンセプチュアルには

→要はいろいろありますよ。 ( ここから、Isacc先生の熱いメッセージ):シリコンの世界でムーアの法則が終わりゆく中で、"Computation"の意味を今一度考えて、他のモデルを受け入れる必要がある。 シリコンの次は、これまでと違った上述のようなアイディアを活用したものになる。これは、表向きはQuantum computerの授業だけど、計算における物理とは何か考え欲しい。また、欲しているComputationを実現するための物理的あるいはBiologicalなメカニズムをどうやったら作れるか考えて欲しい。

Universality:回路による計算モデルでは、全ての論理回路は、ANDゲートとNOTゲートですべて構成できる。 Complexity: 数学の問題の"難しさ" いわゆるP、NP問題という分類?がありますが、これって決定性チューリングマシーンが前提となっているのですね。ということは、そうじゃないマシーンでは、計算量を減らせる可能性はあり、これが量子コンピューターに繋がるのですね。 P:決定性チューリング機械において、多項式時間で判定可能な問題 NP:Yesとなる証拠が与えられたとき、多項式時間で証拠の正当性の判定が可能な問題

Maxwell's daemon Szilard's engine Wikipediaに詳しい説明ありました。 永久機関的なものを作ろうにも、情報を消すときにエントロピーを減少させる必要があり、その際に要するエネルギーが、この機関から得られるエネルギーより大きい 普通のコンピューターは,1 bit 消すのに50kTlog2(J)必要、DNAコンピュータは、1演算に1.5×10-19 (J) とのこと。

Reversible computation

通常の電子的なgateは、Reversibleではない=不可逆

Reversible(可逆) computationとは、outputからinputを再現できるもの

不可逆ということは、つまりoutputからinputを再現できないということ

量子コンピュータは、量子力学の法則により、Reversibleである必要があるとのこと。なぜかというと。。それはまだ説明されていません。(たぶん)

Quantum Information Science I メモ その1 量子コンピューティングの歴史

 量子コンピュータを活用するのに、どういう知識が必要か分からぬまま、とりあえず受け始めた Quantum Information Science I by Shor先生 最初は、量子コンピューティングの歴史から始まりました。道のりは遠いな。。全然まとまらないけど、メモ。

Shor先生は、量子コンピューティング界のスター、サッカーで言えばマラドーナが基礎レッスンを無料でしてくれているようなものだ。すごいぞMOOC。いい時代。

歴史

  • EPR(Einstein–Podolsky–Rosen) pair:元々アインシュタインらが量子力学へツッコむため考えたEPRパラドックスにでてくるEntangle(もつれ)された量子ペア
     片方の位置を測定(Mesurement)すると、もう片方の位置も確定する
     片方の運動量をMesurementすると、もう片方の運動量も確定する
    なんだか、量子力学では、位置と運動量は同時には測定できないそうですが、それは、量子力学レベルの世界では、測定が測定対象に影響を及ぼしてしまうからという理解でよいのでしょうか。。
  • 1982年 EPR pairを利用して光よりも早い通信ができるという論文(FLASH: First Laser-Amplified Superluminal Hookup、何という中2ネーミング)が出る
  • 同年(1982年)FLASHの論文は間違いという論文でる →受信側が情報を取り出すのに古典的通信経路を用いて入手した情報が必要とのことらしいが、よく分からない。。
  • 最初は、量子力学の世界をシミュレートするために、量子コンピュータが必要!という考えだったらしい。
  • 1985年ごろから、古典的問題を量子コンピュータで解いたら古典的コンピュータより早いか という議論がなされ始めた
  • 1994年 Shor先生が、量子コンピュータを使った因数分解アルゴリズム Shor's algorithmを発表 (これにより量子コンピューティングの領域がtake offしたと先生、自画自賛)
  • 1995年 Lov Groverが、量子コンピュータを使った検索アルゴリズムを発表

量子コンピューターにおけるエラー訂正アルゴリズム

以下、古典的コンピューターで使われる3つのエラー訂正手法があるが、量子力学における The no cloning theorem によって、Error correcting code以外は使えない。

  • Check-pointing
  • Erorr correcting code → 量子コンピューターでも使えるのはこれだけ。
  • Massive redundancy

ここの詳細は後からでてくるっぽい。

Q# python

Q#の紹介ページを見ているとPythonからも使えるとのこと。では、試してみましょう。
(2018年2月のアップデートからのようです。)

こちらは、ほとんど、Githubにあるサンプルの説明をそのまま実行するのみです。

github.com

1. nb_condaのインストール

まずは、MSにすすめられるまま、nb_condaをインストール

conda install nb_conda

ついでに、condaのアップデートも実行されました。

2. サンプル実行用のPython環境を構築

Githubからcloneした一式の中に含まれる Quantum/Samples/PythonInterop フォルダでコマンドプロンプトを開いて、

conda env create -f environment.yml

すると、qsharp-samples という名前で、必要なソフトが入った環境ができました。なんと便利なことでしょう。

一昔前なら一つずつインストールして、途中で色々エラー出て泣いてた。

なお、nb_condaとnoseを加えたcondaのenvironment.ymlをgistに置いておきました。 gist7331087aa54f202ae373c09f1940f1a1

activate qsharp-samples

で、作成された環境 qsharp-samples を有効化

3. Jupyter notebookを起動

jupyter notebook

ブラウザで、Jupyter notebookが立ち上がる。

なお、別の環境で試した際は、qsharp-sample環境からJupyter notebokを立ち上げたのに、Kernelが通常のPython3のままとなり、うまくいかないことがありました。 その際は、

conda install notebook ipythonkernel
ipython kernel install —user —name qsharp-sample —display-name qsharp-python

として、明示的にJupyter notebookのカーネルを追加してから、Jupyter notebook上で、Kernel→Change kernel→qsharp-pythonを選択したら動きました。  

4. Jupyter notebookで実行

あとは、サンプルを実行していくのですが、以下のコードを実行したところエラー発生。

plt.figure(figsize=(10, 10))
estimation_results['posterior'].plot_covariance()
plt.xticks(rotation=90)
    ---------------------------------------------------------------------------

    AttributeError                            Traceback (most recent call last)

    <ipython-input-16-d936f679b251> in <module>
          1 plt.figure(figsize=(10, 10))
    ----> 2 estimation_results['posterior'].plot_covariance()
          3 plt.xticks(rotation=90)
    

    ~\Anaconda3\envs\qsharp-samples\lib\site-packages\qinfer\smc.py in plot_covariance(self, corr, param_slice, tick_labels, tick_params)
       1159         cov = self.est_covariance_mtx(corr=corr)[param_slice, param_slice]
       1160 
    -> 1161         retval = mpls.hinton(cov)
       1162         plt.xticks(*tick_labels, **(tick_params if tick_params is not None else {}))
       1163         plt.yticks(*tick_labels, **(tick_params if tick_params is not None else {}))
    

    ~\Anaconda3\envs\qsharp-samples\lib\site-packages\mpltools\special\hinton.py in hinton(inarray, max_value, use_default_ticks)
         54 
         55     ax = plt.gca()
    ---> 56     ax.set_axis_bgcolor('gray')
         57     # make sure we're working with a numpy array, not a numpy matrix
         58     inarray = np.asarray(inarray)
    

    AttributeError: 'AxesSubplot' object has no attribute 'set_axis_bgcolor'

結果的には、以下のページを参考に、

'AxesSubplot' object has no attribute 'set_axis_bgcolor' · Issue #10762 · scikit-learn/scikit-learn · GitHub

エラーの中に出てくる ~\Anaconda3\envs\qsharp-samples\lib\site-packages\mpltools\special\hinton.py 内の、

ax.set_axis_bgcolor('gray')

ax.set_facecolor('gray')

としたら動作しました。

なお、Jupyterあるあるなのかもしれませんが、hinton.pyを変更した後、そのまま実行すると、以下のように、示される該当箇所は変更後のものになっているのに前と同じエラーがでました。
これは、KernelをRestartしたところ解消しました。

~\Anaconda3\envs\qsharp-samples\lib\site-packages\mpltools\special\hinton.py in hinton(inarray, max_value, use_default_ticks)
     54 
     55     ax = plt.gca()
---> 56     ax.set_facecolor('gray')
     57     # make sure we're working with a numpy array, not a numpy matrix
     58     inarray = np.asarray(inarray)

AttributeError: 'AxesSubplot' object has no attribute 'set_axis_bgcolor'

そろそろ始めなくては

量子コンピューティングの勉強をしよう。

  • これまでの流れ
  • 昔(電卓時代):それ昔は、手で計算してたって、何時間かかってやってたんですか?!
    今:それ、電卓で計算してたって、何日かかってやってたんですか?!
  • これから
  • 10年後:それ、ノイマン型コンピュータで計算してたって、何年かかってやってたんですか?!

これは、今のうちからやっておかねば。おじさん置いて行かれる。こわい。

 

加えて、量子コンピューティングを勉強しようと思う動機の一つは、量子コンピューティングを理解することで、新しい思考回路を手に入れらるかも、と期待しているからです。

CやPythonなどのコンピュータ言語は、それぞれ特徴があるもののの、書く前に頭で考えるアルゴリズムには、あまり大きな違いがないと思います。(オブジェクト指向か、関数型かとかで違うところもあるが、私が利用する範囲では、同じような頭の使い方をしちゃってます。)

一方、SQL集合論的発想は、他のコンピュータ言語と大きく異なり、通常のプログラミング言語的発想では解くことが大変なものが、SQL的発想だと瞬殺ということがあります。

同様に、古典的コンピュータでは大変な問題が、量子コンピュータでは瞬殺という場合があるとのことですので、量子コンピュータ的思考回路を身につけることは、今後、大きく役立つのでは、と考えました。

 

ただ、どこから手をつけて良いかよく分からない。少なくとも、今使われている古典的コンピュータを普通に活用するため、半導体素子の知識は必要ないが、量子コンピュータを活用するため、量子物理学の知識が必要なのかすらよく分からず。。

ひとまずは、おそらく活用寄りのQ#を試すのと、理論寄りの大学の授業を受ける所から始めてみる。

Q#は、Microsoftが作った量子アルゴリズムを書くための言語。

大学の授業については、edXにある"Quantum Information Science I"を受講してみよう。こちら、量子コンピューティング界の金字塔、ショアのアルゴリズムで有名な、 Peter Shor先生自ら授業しています。「量子コンピュータがあれば、このアルゴリズム因数分解が効率的に解ける」なんてことを、量子コンピュータができる前に考えてる人の思考回路がまず理解できないが。。