bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

量子力学の初歩をHaskellで学ぶ(2):重ね合わせ

量子力学の特徴の一つは、状態の重ね合わせである。これは、量子状態の時はいくつかの状態を複数個同時に取るが、観察すると、ある一つの状態しか得られないという摩訶不思議な現象である。また、同じ条件で観察したとしても、観察するたびに取る状態が異なる。そこで、観察される度合いを、それぞれの状態の係数で表すこととする。数学的には、状態の重ね合わせは、状態の線形結合であらわす。それぞれの状態は、観察される度合いを表した係数を有する。係数には、複素数が用いられる。

状態の重なり合いは、ケットを用いての状態の線形結合でも、ブラを用いての状態の線形結合でも表すことができる。

1粒子状態の重なり合いをケットで表すと次のようになる。
\begin{align*}
& \hat{\Psi}^\dagger | ...00\dot{0}00...> \\
= & \sum_{i=-\infty}^\infty \psi_i \hat{a}_i^\dagger | ...00\dot{0}00...> \\
= & ... + \psi_{-2} |...0010\dot{0}00...> + \psi_{-1} |...001\dot{0}00...> + \psi_0 |...00\dot{1}00...> \\
& + \psi_1 |...00\dot{0}100...> + \psi_2 |...00\dot{0}0100...> + ...
\end{align*}

これをブラで表すと次のようになる。
\begin{align*}
& <...00\dot{0}00...|\hat{\Psi} \\
= & <...000\dot{0}00...| \sum_{i=-\infty}^\infty \hat{a}_i \psi_i^* \\
= & ...<...0010\dot{0}00...| \psi_{-2}^* + <...001\dot{0}00...|_{-1} \psi_{-1}^* + <...000\dot{1}00...| \psi_0^* \\
& + <...00\dot{0}100...|\psi_1^* + <...000\dot{0}0100...| \psi_2^* + ...
\end{align*}

ただし、同じ状態を表しているケットでの係数\(\psi_i\)とブラの係数\(\psi_i^*\)はお互いに共役な複素数となっている。

これらの線形結合は次のことを意味する。全体で、\( \sum_{i=-\infty}^\infty \psi_i^*\psi_i \)回の実験を行った。この時、状態\(i\)が観察された回数は\( \psi_i^*\psi_i \)である。もし、\( \sum_{i=-\infty}^\infty \psi_i^*\psi_i =1\)ならば、この線形結合は規格化されているという。

以上が重ね合わせの概略であるが、以下で、プログラムを動かして、そのニュアンスをつかむことにしよう。

1.ケットでの重ね合わせ

Teat1のプログラムをロードしてみよう。次のようになると思う。

GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :cd C:\Users\XXXXXX
Prelude> :load "test1.hs"
[1 of 7] Compiling Qtm.KetBra.Ket   ( Qtm\KetBra\Ket.hs, interpreted )
[2 of 7] Compiling Qtm.KetBra.Bra   ( Qtm\KetBra\Bra.hs, interpreted )
[3 of 7] Compiling Qtm.Entangle.BraEntangle ( Qtm\Entangle\BraEntangle.hs, interpreted )
[4 of 7] Compiling Qtm.Entangle.KetEntangle ( Qtm\Entangle\KetEntangle.hs, interpreted )
[5 of 7] Compiling Qtm.Entangle     ( Qtm\Entangle.hs, interpreted )
[6 of 7] Compiling Qtm.KetBra       ( Qtm\KetBra.hs, interpreted )
[7 of 7] Compiling Test1            ( test1.hs, interpreted )
Ok, modules loaded: Qtm.KetBra, Qtm.Entangle, Qtm.Entangle.KetEntangle, Qtm.Entangle.BraEntangle, Qtm.KetBra.Bra, Qtm.KetBra.Ket, Test1.
*Test1> 

まずケットについてだが、test1では次の状態を用意している。
\begin{align*}
a =& \\
b =& (5.3 + 4.2i)|...00\dot{0}100...> \\
c =& (3.3 + 3.2i)|...00\dot{0}00100...> + (5.3 + 4.2i)|...00\dot{0}100...>\\
d =& (1.3 + 1.2i)|...00\dot{0}0100...> + (3.3 + 3.2i)|...00\dot{0}00100...> + (5.3 + 4.2i)|...00\dot{0}100...>\\
g =& (3.3 - 3.2i)|...00\dot{0}100...> + (3.1 - 0.2i)|...00\dot{0}000100...> + (2.3 - 1.2i)|...001\dot{0}00...> \\
& + (4.3 + 3.3i)|...00\dot{0}0100...> + (3.3 + 0.2i)|...00\dot{0}00100...>\\
h =& (2.3 - 0.2i)|...00\dot{0}00100...> + (3.4 - 2.2i)|...0010\dot{0}00...> + (5.3 - 1.5i)|...001\dot{0}00...> \\
& + (1.3 + 0.3i)|...00\dot{0}100...> + (3.2 + 2.2i)|...00\dot{0}0100...>\\
\end{align*}

その他に、\(p\)と\(q\)は\(g\)と\(h\)を状態を右から左へ昇順に並べたもの、\(r\)は\(g\)と\(h\)をさらに重ね合わせたもの、\(t\)は\(r\)を正規化したものである。

それでは、\(a,b,c,d,g,h\)それぞれのHaskellでの内部表現を見てみよう。

*Test1> a

*Test1> b
5.3 :+ 4.2_a1^
*Test1> c
3.3 :+ 3.2_a3^ + 5.3 :+ 4.2_a1^
*Test1> d
1.3 :+ 1.2_a2^ + 3.3 :+ 3.2_a3^ + 5.3 :+ 4.2_a1^
*Test1> g
3.3 :+ (-3.2)_a1^ + 3.1 :+ (-0.2)_a4^ + 2.3 :+ (-1.2)_a-1^ + 4.3 :+ 3.3_a2^ + 3.3 :+ 0.2_a3^
*Test1> h
2.3 :+ (-0.2)_a3^ + 3.4 :+ (-2.2)_a-2^ + 5.3 :+ (-1.5)_a-1^ + 1.3 :+ 0.3_a1^ + 3.2 :+ 2.2_a2^

上手くいっているようである。でも、分かりにくいので、プリティー・プリントで見てみよう。

*Test1> prEntangle a
""
*Test1> prEntangle b
"(5.3 :+ 4.2)|...0000(0)1000....>"
*Test1> prEntangle c
"(3.3 :+ 3.2)|...000000(0)001000....> + (5.3 :+ 4.2)|...0000(0)1000....>"
*Test1> prEntangle d
"(1.3 :+ 1.2)|...00000(0)01000...> + (3.3 :+ 3.2)|...000000(0)001000...> + (5.3 :+ 4.2)|...0000(0)1000...>"
*Test1> prEntangle g
"(3.3 :+ (-3.2))|...0000(0)1000...> + (3.1 :+ (-0.2))|...0000000(0)0001000...> + (2.3 :+ (-1.2))|...0001(0)000...> + (4.3 :+ 3.3)|...00000(0)01000...> + (3.3 :+ 0.2)|...000000(0)001000...>"
*Test1> prEntangle h
"(2.3 :+ (-0.2))|...000000(0)001000...> + (3.4 :+ (-2.2))|...00010(0)0000...> + (5.3 :+ (-1.5))|...0001(0)000...> + (1.3 :+ 0.3)|...0000(0)1000...> + (3.2 :+ 2.2)|...00000(0)01000...>"

\(g,h\)を状態でソートした\(p,q\)を見てみよう。

*Test1> prEntangle p
"(2.3 :+ (-1.2))|...0001(0)000...> + (3.3 :+ (-3.2))|...0000(0)1000...> + (4.3 :+ 3.3)|...00000(0)01000...> + (3.3 :+ 0.2)|...000000(0)001000...> + (3.1 :+ (-0.2))|...0000000(0)0001000...>"
*Test1> prEntangle q
"(3.4 :+ (-2.2))|...00010(0)0000...> + (5.3 :+ (-1.5))|...0001(0)000...> + (1.3 :+ 0.3)|...0000(0)1000...> + (3.2 :+ 2.2)|...00000(0)01000...> + (2.3 :+ (-0.2))|...000000(0)001000...>"

\(g,h\)を重ね合わせた\(r\)を見てみよう。

*Test1> prEntangle r
"(3.4 :+ (-2.2))|...00010(0)0000...> + (7.6 :+ (-2.7))|...0001(0)000...> + (4.6 :+ (-2.9000000000000004))|...0000(0)1000...> + (7.5 :+ 5.5)|...00000(0)01000...> + (5.6 :+ 0.0)|...000000(0)001000...> + (3.1 :+ (-0.2))|...0000000(0)0001000...>"

これを正規化した\(t\)を見てみよう。

*Test1> prEntangle t
"(0.22014428368391428 :+ (-0.14244630120723867))|...00010(0)0000...> + (0.492087222352279 :+ (-0.17482046057252018))|...0001(0)000...> + (0.2978422661605899 :+ (-0.1877701243186328))|...0000(0)1000...> + (0.4856123904792227 :+ 0.35611575301809667)|...00000(0)01000...> + (0.3625905848911529 :+ 0.0)|...000000(0)001000...> + (0.20071978806474539 :+ (-1.2949663746112606e-2))|...0000000(0)0001000...>"

2.ブラでの重ね合わせ

ブラについてだが、test1では次の状態を用意している。
\begin{align*}
a' =& \\
b' =& <...00\dot{0}100...|(5.3 - 4.2i) \\
c' =& <...00\dot{0}100...|(5.3 - 4.2i) + <...00\dot{0}00100...|(3.3 - 3.2i)\\
d' =& <...00\dot{0}100...|(5.3 - 4.2i) + <...00\dot{0}00100...|(3.3 - 3.2i) + <...00\dot{0}0100...|(1.3 - 1.2i)\\
g' =& <...00\dot{0}100...|(3.3 + 3.2i) + <...00\dot{0}000100...|(3.1 + 0.2i) + <...001\dot{0}00...|(2.3 + 1.2i) \\
& + <...00\dot{0}0100...>(4.3 - 3.3i) + <...00\dot{0}00100...>(3.3 - 0.2i)\\
h' =& <...00\dot{0}00100...|(2.3 + 0.2i) + <...0010\dot{0}00...|(3.4 + 2.2i) + <...001\dot{0}00...|(5.3 + 1.5i) \\
& + <...00\dot{0}100...|(1.3 - 0.3i) + <...00\dot{0}0100...|(3.2 - 2.2i)\\
\end{align*}

その他に、\(p'\)と\(q'\)は\(g'\)と\(h'\)を状態を右から左へ昇順に並べたもの、\(r'\)は\(g'\)と\(h'\)をさらに重ね合わせたもの、\(t'\)は\(r'\)を正規化したものである。

それでは、\(a',b',c',d',g',h'\)それぞれのHaskellでの内部表現を見てみよう。

*Test1> a'

*Test1> b'
a1_5.3 :+ (-4.2)
*Test1> c'
a1_5.3 :+ (-4.2) + a3_3.3 :+ (-3.2)
*Test1> d'
a1_5.3 :+ (-4.2) + a3_3.3 :+ (-3.2) + a2_3.3 :+ (-3.2)
*Test1> g'
a1_3.3 :+ 3.2 + a4_3.1 :+ 0.2 + a-1_2.3 :+ 1.2 + a2_4.3 :+ (-3.3) + a3_3.3 :+ (-0.2)
*Test1> h'
a3_2.3 :+ 0.2 + a-2_3.4 :+ 2.2 + a-1_5.3 :+ 1.5 + a1_1.3 :+ (-0.3) + a2_3.2 :+ (-2.2)

上手くいっているようである。でも、分かりにくいので、プリティー・プリントで見てみよう。

*Test1> prCoEntangle a'
""
*Test1> prCoEntangle b'
"<...0000(0)1000...|5.3 :+ (-4.2)"
*Test1> prCoEntangle c'
"<...0000(0)1000...|5.3 :+ (-4.2) + <...000000(0)001000...|3.3 :+ (-3.2)"
*Test1> prCoEntangle d'
"<...0000(0)1000...|5.3 :+ (-4.2) + <...000000(0)001000...|3.3 :+ (-3.2) + <...00000(0)01000...|3.3 :+ (-3.2)"
*Test1> prCoEntangle g'
"<...0000(0)1000...|3.3 :+ 3.2 + <...0000000(0)0001000...|3.1 :+ 0.2 + <...0001(0)000...|2.3 :+ 1.2 + <...00000(0)01000...|4.3 :+ (-3.3) + <...000000(0)001000...|3.3 :+ (-0.2)"
*Test1> prCoEntangle h'
"<...000000(0)001000...|2.3 :+ 0.2 + <...00010(0)0000...|3.4 :+ 2.2 + <...0001(0)000...|5.3 :+ 1.5 + <...0000(0)1000...|1.3 :+ (-0.3) + <...00000(0)01000...|3.2 :+ (-2.2)"

\(g',h'\)を状態でソートした\(p',q'\)を見てみよう。

*Test1> prCoEntangle p'
"<...0000000(0)0001000...|3.1 :+ 0.2 + <...000000(0)001000...|3.3 :+ (-0.2) + <...00000(0)01000...|4.3 :+ (-3.3) + <...0000(0)1000...|3.3 :+ 3.2 + <...0001(0)000...|2.3 :+ 1.2"
*Test1> prCoEntangle q'
"<...000000(0)001000...|2.3 :+ 0.2 + <...00000(0)01000...|3.2 :+ (-2.2) + <...0000(0)1000...|1.3 :+ (-0.3) + <...0001(0)000...|5.3 :+ 1.5 + <...00010(0)0000...|3.4 :+ 2.2"

\(g',h'\)を重ね合わせた\(r'\)を見てみよう。

*Test1> prCoEntangle r'
"<...0000000(0)0001000...|3.1 :+ 0.2 + <...000000(0)001000...|5.6 :+ 0.0 + <...00000(0)01000...|7.5 :+ (-5.5) + <...0000(0)1000...|4.6 :+ 2.9000000000000004 + <...0001(0)000...|7.6 :+ 2.7 + <...00010(0)0000...|3.4 :+ 2.2"

これを正規化した\(t'\)を見てみよう。

*Test1> prCoEntangle t'
"<...0000000(0)0001000...|0.20071978806474539 :+ 1.2949663746112606e-2 + <...000000(0)001000...|0.3625905848911529 :+ 0.0 + <...00000(0)01000...|0.4856123904792227 :+ (-0.35611575301809667) + <...0000(0)1000...|0.2978422661605899 :+ 0.1877701243186328 + <...0001(0)000...|0.492087222352279 :+ 0.17482046057252018 + <...00010(0)0000...|0.22014428368391428 :+ 0.14244630120723867"

3.重ね合わせの内積

重ね合わせでの内積を求めてみよう。\(g\)と\(g'\)、\(h\)と\(h'\)、\(t\)と\(t'\)はそれぞれ、同じ重ね合わせをケットとブラで表したものである。このうち、\(t\)と\(t'\)は規格化されている。それでは、\(g\)と\(g'\)、\(h\)と\(h'\)、\(t\)と\(t'\)のそれぞれの内積\(u,v,w\)を見てみよう。

*Test1> u
9.65 :+ 0.0
*Test1> v
5.329999999999999 :+ 0.0
*Test1> w
1.0 :+ 0.0