bitterharvest’s diary

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

量子力学の世界を垣間見る(3):粒子が相互に交換されるモデル:周期系

6.周期系

量子力学の世界をHaskellで覗けるようにするために、格子点の数が有限である場合を前回の記事で取り上げた。その時は端があるモデルについて考えたが、この記事では端同士がつながって輪のようになっている有限系について考えてみよう。これを周期系と呼ぶことにしよう。周期系のモデルを図示すると以下の様である。
f:id:bitterharvest:20160827104401p:plain

そこで、このモデルのハミルトニアンを\(\hat{H}_{periodic}\)とすると、
\begin{eqnarray}
\hat{H}_{periodic}=-g\sum_{l=0}^{N-1} (\hat{a}^\dagger_{l+1} \hat{a}_l + \hat{a}^\dagger_{l} \hat{a}_{l+1})
\end{eqnarray}
となる。なお、\(l=N\)の時、\(l=0\)である。

\(\hat{H}_{periodic}\)の固有状態は平面波状態
\begin{eqnarray}
\sum_{l=0}^{N-1} \varphi_{kl} \hat{a}^\dagger_l |0> = \sum_{l=0}^{N-1} Ae^{i \kappa l} \hat{a}^\dagger_l |0>
\end{eqnarray}
となる。但し、\(e^{i \kappa N} = 1\)である。即ち、\(\kappa N=2 \pi m\)である。

これより、規格化された固有状態は
\begin{eqnarray}
&&| \kappa > \\
&=& \sum_{l=0}^{N-1} \varphi_{kl} \hat{a}^\dagger_l |0> \\
&=& \sum_{l=0}^{N-1} \frac{1}{\sqrt N} e^{i \kappa l} |0>
\end{eqnarray}

これをブラで表すと、
\begin{eqnarray}
&&< \kappa | \\
&=& \sum_{l=0}^{N-1} <0| \hat{a}_l \varphi^*_{kl} \\
&=& \sum_{l=0}^{N-1} <0| \hat{a}_l \frac{1}{\sqrt N} e^{-i \kappa l}
\end{eqnarray}
となる。

7.Haskellでの表現

周期系の場合にも、前回と同様、固有状態を表示することができる。そこで、実現してみよう。
格子点lに粒子がある状態lattice m lを、規格化せれた割合との対として、次のように表すことにしよう。なお、説明のところで用いた区切りの数\(N\)はプログラムではnである。

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * cos theta  :+ b * sin theta, l)
  where
    theta = 2 * pi * fromInteger m * fromInteger l / fromInteger n

これを用いて、周期系での重ね合わせでの固有状態kappa mはケットでは次のようになる。なお、ここで、mは1からnまでの整数である。

kappa :: Integer -> Entangle (Complex Double) Integer
kappa m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = kappa1 m (n - 1)
  where
    kappa1 m 0 = lattice m 0 :&: EnZero
    kappa1 m l = lattice m l :&: kappa1 m (l - 1)

そこで、\(N=10\)の場合について、詳しく調べてみよう。プログラムは次のようになる。

{-#LANGUAGE GADTs #-}

module Test3 where

import Data.Complex
import Qtm.KetBra
import Qtm.Entangle

n = 10
b = 1.0 / sqrt (fromInteger n)

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * cos theta  :+ b * sin theta, l)
  where
    theta = 2 * pi * fromInteger m * fromInteger l / fromInteger n

kappa :: Integer -> Entangle (Complex Double) Integer
kappa m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = kappa1 m (n - 1)
  where
    kappa1 m 0 = lattice m 0 :&: EnZero
    kappa1 m l = lattice m l :&: kappa1 m (l - 1)

このプログラムをロードして、mの値を変えて、固有状態を見てみよう。

relude> :load "test3.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 Test3            ( test3.hs, interpreted )
Ok, modules loaded: Qtm.KetBra, Qtm.Entangle, Qtm.Entangle.KetEntangle, Qtm.Entangle.BraEntangle, Qtm.KetBra.Bra, Qtm.KetBra.Ket, Test3.

m=1の場合は次のようになる。

*Test3> kappa 1
0.25583363680084636 :+ (-0.1858740172300923)_a9^ + 9.771975379242734e-2 :+ (-0.3007504775037729)_a8^ + (-9.771975379242745e-2) :+ (-0.3007504775037728)_a7^ + (-0.2558336368008464) :+ (-0.18587401723009223)_a6^ + (-0.31622776601683794) :+ 3.872545315192758e-17_a5^ + (-0.25583363680084636) :+ 0.18587401723009228_a4^ + (-9.771975379242738e-2) :+ 0.3007504775037729_a3^ + 9.771975379242741e-2 :+ 0.3007504775037728_a2^ + 0.25583363680084636 :+ 0.18587401723009225_a1^ + 0.31622776601683794 :+ 0.0_a0^

上手く動いているようなので、その他の場合も求めてみよう。

*Test3> kappa 2
9.771975379242727e-2 :+ (-0.30075047750377293)_a9^ + (-0.2558336368008465) :+ (-0.18587401723009214)_a8^ + (-0.2558336368008463) :+ 0.1858740172300923_a7^ + 9.771975379242749e-2 :+ 0.3007504775037728_a6^ + 0.31622776601683794 :+ (-7.745090630385516e-17)_a5^ + 9.771975379242734e-2 :+ (-0.3007504775037729)_a4^ + (-0.2558336368008464) :+ (-0.18587401723009223)_a3^ + (-0.25583363680084636) :+ 0.18587401723009228_a2^ + 9.771975379242741e-2 :+ 0.3007504775037728_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 3
(-9.77197537924276e-2) :+ (-0.3007504775037728)_a9^ + (-0.25583363680084625) :+ 0.1858740172300924_a8^ + 0.2558336368008465 :+ 0.18587401723009211_a7^ + 9.771975379242727e-2 :+ (-0.30075047750377293)_a6^ + (-0.31622776601683794) :+ 1.1617635945578272e-16_a5^ + 9.771975379242749e-2 :+ 0.3007504775037728_a4^ + 0.25583363680084636 :+ (-0.1858740172300923)_a3^ + (-0.2558336368008464) :+ (-0.18587401723009223)_a2^ + (-9.771975379242738e-2) :+ 0.3007504775037729_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 4
(-0.25583363680084653) :+ (-0.18587401723009203)_a9^ + 9.771975379242764e-2 :+ 0.30075047750377276_a8^ + 9.77197537924272e-2 :+ (-0.30075047750377293)_a7^ + (-0.25583363680084625) :+ 0.1858740172300924_a6^ + 0.31622776601683794 :+ (-1.549018126077103e-16)_a5^ + (-0.2558336368008465) :+ (-0.18587401723009214)_a4^ + 9.771975379242749e-2 :+ 0.3007504775037728_a3^ + 9.771975379242734e-2 :+ (-0.3007504775037729)_a2^ + (-0.25583363680084636) :+ 0.18587401723009228_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 5
(-0.31622776601683794) :+ 3.485290783673482e-16_a9^ + 0.31622776601683794 :+ (-3.098036252154206e-16)_a8^ + (-0.31622776601683794) :+ 2.7107817206349303e-16_a7^ + 0.31622776601683794 :+ (-2.3235271891156544e-16)_a6^ + (-0.31622776601683794) :+ 1.9362726575963788e-16_a5^ + 0.31622776601683794 :+ (-1.549018126077103e-16)_a4^ + (-0.31622776601683794) :+ 1.1617635945578272e-16_a3^ + 0.31622776601683794 :+ (-7.745090630385516e-17)_a2^ + (-0.31622776601683794) :+ 3.872545315192758e-17_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 6
(-0.25583363680084614) :+ 0.18587401723009261_a9^ + 9.771975379242705e-2 :+ (-0.300750477503773)_a8^ + 9.771975379242771e-2 :+ 0.30075047750377276_a7^ + (-0.25583363680084653) :+ (-0.18587401723009203)_a6^ + 0.31622776601683794 :+ (-2.3235271891156544e-16)_a5^ + (-0.25583363680084625) :+ 0.1858740172300924_a4^ + 9.771975379242727e-2 :+ (-0.30075047750377293)_a3^ + 9.771975379242749e-2 :+ 0.3007504775037728_a2^ + (-0.2558336368008464) :+ (-0.18587401723009223)_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 7
(-9.7719753792428e-2) :+ 0.30075047750377265_a9^ + (-0.25583363680084664) :+ (-0.1858740172300919)_a8^ + 0.2558336368008455 :+ (-0.18587401723009347)_a7^ + 9.771975379242771e-2 :+ 0.30075047750377276_a6^ + (-0.31622776601683794) :+ 2.7107817206349303e-16_a5^ + 9.77197537924272e-2 :+ (-0.30075047750377293)_a4^ + 0.2558336368008465 :+ 0.18587401723009211_a3^ + (-0.2558336368008463) :+ 0.1858740172300923_a2^ + (-9.771975379242745e-2) :+ (-0.3007504775037728)_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 8
9.771975379242794e-2 :+ 0.30075047750377265_a9^ + (-0.2558336368008461) :+ 0.18587401723009264_a8^ + (-0.25583363680084664) :+ (-0.1858740172300919)_a7^ + 9.771975379242705e-2 :+ (-0.300750477503773)_a6^ + 0.31622776601683794 :+ (-3.098036252154206e-16)_a5^ + 9.771975379242764e-2 :+ 0.30075047750377276_a4^ + (-0.25583363680084625) :+ 0.1858740172300924_a3^ + (-0.2558336368008465) :+ (-0.18587401723009214)_a2^ + 9.771975379242734e-2 :+ (-0.3007504775037729)_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 9
0.2558336368008474 :+ 0.18587401723009084_a9^ + 9.771975379242794e-2 :+ 0.30075047750377265_a8^ + (-9.7719753792428e-2) :+ 0.30075047750377265_a7^ + (-0.25583363680084614) :+ 0.18587401723009261_a6^ + (-0.31622776601683794) :+ 3.485290783673482e-16_a5^ + (-0.25583363680084653) :+ (-0.18587401723009203)_a4^ + (-9.77197537924276e-2) :+ (-0.3007504775037728)_a3^ + 9.771975379242727e-2 :+ (-0.30075047750377293)_a2^ + 0.25583363680084636 :+ (-0.1858740172300923)_a1^ + 0.31622776601683794 :+ 0.0_a0^
*Test3> kappa 10
0.31622776601683794 :+ (-6.970581567346964e-16)_a9^ + 0.31622776601683794 :+ (-6.196072504308412e-16)_a8^ + 0.31622776601683794 :+ (-5.421563441269861e-16)_a7^ + 0.31622776601683794 :+ (-4.647054378231309e-16)_a6^ + 0.31622776601683794 :+ (-3.8725453151927575e-16)_a5^ + 0.31622776601683794 :+ (-3.098036252154206e-16)_a4^ + 0.31622776601683794 :+ (-2.3235271891156544e-16)_a3^ + 0.31622776601683794 :+ (-1.549018126077103e-16)_a2^ + 0.31622776601683794 :+ (-7.745090630385516e-17)_a1^ + 0.31622776601683794 :+ 0.0_a0^

1より小さい値、あるいは、10より大きい値を指定した場合は次のようになる。

*Test3> kappa 0
*** Exception: m should be 1 <= m <= 10.
*Test3> kappa 11
*** Exception: m should be 1 <= m <= 10.

そこで、m=1,2,3の固有状態の実数部を図で表すと次のようになる。
f:id:bitterharvest:20160828113237p:plain
ついでに、ブラでの表現も加えて、プログラムを次のようにしよう。ここで、格子点lに粒子がある状態をlattice' m lで、ブラでの固有状態をkappa' mで表す。

{-#LANGUAGE GADTs #-}

module Test3 where

import Data.Complex
import Qtm.KetBra
import Qtm.Entangle

n = 10
b = 1.0 / sqrt (fromInteger n)

lattice :: Integer -> Integer -> (Complex Double, Integer)
lattice m l = (b * cos theta  :+ b * sin theta, l)
  where
    theta = 2 * pi * fromInteger m * fromInteger l / fromInteger n

kappa :: Integer -> Entangle (Complex Double) Integer
kappa m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = kappa1 m (n - 1)
  where
    kappa1 m 0 = lattice m 0 :&: EnZero
    kappa1 m l = lattice m l :&: kappa1 m (l - 1)

lattice' :: Integer -> Integer -> (Integer, Complex Double)
lattice' m l = (l, b * cos theta  :+ (- b * sin theta))
  where
    theta = 2 * pi * fromInteger m * fromInteger l / fromInteger n

kappa' :: Integer -> CoEntangle Integer (Complex Double)
kappa' m 
  | m < 1  = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | m > 10 = error $ "m should be 1 <= m <= " ++ show n ++ "."
  | otherwise = kappa1 m (n - 1)
  where
    kappa1 m 0 = EnZero' :|: lattice' m 0
    kappa1 m l = kappa1 m (l - 1) :|: lattice' m l

プログラムをロードして、ブラでの固有状態を調べてみよう。

*Test3> kappa' 1
a0_0.31622776601683794 :+ (-0.0) + a1_0.25583363680084636 :+ (-0.18587401723009225) + a2_9.771975379242741e-2 :+ (-0.3007504775037728) + a3_(-9.771975379242738e-2) :+ (-0.3007504775037729) + a4_(-0.25583363680084636) :+ (-0.18587401723009228) + a5_(-0.31622776601683794) :+ (-3.872545315192758e-17) + a6_(-0.2558336368008464) :+ 0.18587401723009223 + a7_(-9.771975379242745e-2) :+ 0.3007504775037728 + a8_9.771975379242734e-2 :+ 0.3007504775037729 + a9_0.25583363680084636 :+ 0.1858740172300923
*Test3> kappa' 2
a0_0.31622776601683794 :+ (-0.0) + a1_9.771975379242741e-2 :+ (-0.3007504775037728) + a2_(-0.25583363680084636) :+ (-0.18587401723009228) + a3_(-0.2558336368008464) :+ 0.18587401723009223 + a4_9.771975379242734e-2 :+ 0.3007504775037729 + a5_0.31622776601683794 :+ 7.745090630385516e-17 + a6_9.771975379242749e-2 :+ (-0.3007504775037728) + a7_(-0.2558336368008463) :+ (-0.1858740172300923) + a8_(-0.2558336368008465) :+ 0.18587401723009214 + a9_9.771975379242727e-2 :+ 0.30075047750377293


また、ケットとブラの内積も求めて見よう。

*Test3> kappa' 1 ^**^ kappa 1
1.0 :+ 0.0
*Test3> kappa' 2 ^**^ kappa 2
1.0 :+ 0.0

またブラとケットでmの値が異なるときは、

*Test3> kappa' 1 ^**^ kappa 2
(-5.551115123125783e-17) :+ (-2.7755575615628914e-17)
*Test3> kappa' 2 ^**^ kappa 3
(-5.551115123125783e-17) :+ 0.0
*Test3> kappa' 2 ^**^ kappa 4
(-3.122502256758253e-17) :+ 0.0

理論的には0であるが、実際は誤差のため0にはならない。しかし、0に限りなく近い値を結果として得る。