6.周期系
量子力学の世界をHaskellで覗けるようにするために、格子点の数が有限である場合を前回の記事で取り上げた。その時は端があるモデルについて考えたが、この記事では端同士がつながって輪のようになっている有限系について考えてみよう。これを周期系と呼ぶことにしよう。周期系のモデルを図示すると以下の様である。
そこで、このモデルのハミルトニアンを\(\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の固有状態の実数部を図で表すと次のようになる。
ついでに、ブラでの表現も加えて、プログラムを次のようにしよう。ここで、格子点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に限りなく近い値を結果として得る。