7月に入ってから、世界最古の自筆本日記である『御堂関白記』の読み方を習い始めた。これは、平安時代の貴族、摂政太政大臣・藤原道長(966-1027年)が著した日記だ。2013年にはユネスコ記録遺産にも登録された。995年ごろから書き始めたようだが、998年から1021年までのものが現存している。もともとは、36巻あったそうだが、鎌倉時代の初期に近衛家と九条家に分立するときに二分されたそうで、今日、近衛家の陽明文庫に所蔵されている自筆本14巻が残っている(分立したときは18巻、その後、近衛家から鷹司家へ4巻譲られたようだ)。また、自筆本とは別に、古写本もあるので、失われた部分についてもある程度補われている。
時を同じくして、藤原実資(さねすけ)が『小右記』(977-1040年)を、藤原行成(ゆきなり)が『権記』(991-1011年、なお1026年まで逸文あり)を著しているので、行事や事件に対する見方を比較することができる。
御堂関白記については、2013年に倉本一宏が、『藤原道長の権力と欲望「御堂関白記」を読む』、『藤原道真の日常生活』、『藤原道長「御堂関白記」を読む』の3冊を上梓している。3冊も同時にとはすごい思い入れだなと感心する。
また、これに先立って、2009年に倉本一宏が現代語訳『藤原道長「御堂関白記」全現代語訳』を著している。
藤原道長と同時代に生きていたのが紫式部である。彼女は、藤原道長の娘、彰子(しょうし)に仕えている。彰子は一条天皇の中宮となり、後一条天皇の母である。紫式部は、彰子に仕えている頃に日本最古の長編小説『源氏物語』を著した。
紫式部がこの小説をなぜ書いたのかのなぞ解きを、高山由紀子が小説『源氏物語~千年の謎~」でしている。
本当かどうかは不明だが、藤原道長が光源氏のモデルであるとしている。この小説は映画にもなっていている。映画『千年の恋 光る源氏物語』(2001年)では吉永小百合が、『源氏物語 千年の謎』(2012年)では中谷美紀が紫式部を演じている。前者は艶っぽい古代を、後者は呪われた世界を描き出している。両者とも、バーチャルな世界とリアルな世界が交錯し、奇妙な感じを抱く。
11.重ね合わせの内積
さて、今回の話題は、ケットとブラを結び付けたらどうなるかを見ていくことにしよう。御堂関白記と源氏物語を融合させたものを見せられた時のような感動には及ばないのだが、それでも、すごいと思う場面である。
11.1 重ね合わせの内積の原理
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*}
そこで、これらの内積を次のように表すことにしよう。
\begin{align*}
& <...00\dot{0}00...|\hat{\Psi} \hat{\Psi}^\dagger | ...00\dot{0}00..> \\
= & (\sum_{i=-\infty}^\infty \psi_i \hat{a}_i^\dagger | ...00\dot{0}00...>)(<...00\dot{0}00...| \sum_{i=-\infty}^\infty \hat{a}_i \psi_i) \\
= & (...+ <...0010\dot{0}00...| \psi_{-2}^* + <...001\dot{0}00...|\psi_{-1}^* + <...000\dot{1}00...| \psi_0^* + <...00\dot{0}100...|\psi_1^* + <...000\dot{0}0100...| \psi_2^* + ...) \\
& (... + \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..> + ... )\\
= & ... \\
& + <...0010\dot{0}00...| \psi_{-2}^* (...\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..> ... ) \\
& + <...001\dot{0}00...| \psi_{-1}^* (...\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..> ... ) \\
& + <...000\dot{1}00...| \psi_0^* (...\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..> ... ) \\
& + <...00\dot{0}100...|\psi_1^* (...\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..> ... ) \\
& + <...00\dot{0}0100...| \psi_2^* (...\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..> ... ) \\
& + ... \\
= & ... \\
& + (...<...0010\dot{0}00...|\psi_{-2}^* \psi_{-2}|...0010\dot{0}00...> + <...0010\dot{0}00...| \psi_{-2}^* \psi_{-1} |...001\dot{0}00...> + <...0010\dot{0}00...|\psi_{-2}^* \psi_0 |...00\dot{1}00...> + <...0010\dot{0}00...| \psi_{-2}^* \psi_1 |...00\dot{0}100...> + <...0010\dot{0}00...|\psi_{-2}^* \psi_2 |...00\dot{0}0100..> ... ) \\
& + (...<...001\dot{0}00...| \psi_{-1}^* \psi_{-2} |...0010\dot{0}00...> + <...001\dot{0}00...| \psi_{-1}^* \psi_{-1} |...001\dot{0}00...> + <...001\dot{0}00...| \psi_{-1}^* \psi_0 |...00\dot{1}00...> + <...001\dot{0}00...| \psi_{-1}^* \psi_1 |...00\dot{0}100...> + <...001\dot{0}00...|\psi_{-1}^* \psi_2 |...00\dot{0}0100..> ...) \\
& + (...<...000\dot{1}00...| \psi_0^* \psi_{-2} |...0010\dot{0}00...> + <...000\dot{1}00...| \psi_0^* \psi_{-1} |...001\dot{0}00...> + <...000\dot{1}00...| \psi_0^* \psi_0 |...00\dot{1}00...> + <...000\dot{1}00...| \psi_0^* \psi_1 |...00\dot{0}100...> + <...000\dot{1}00...| \psi_0^* \psi_2 |...00\dot{0}0100..> ...) \\
& + (...<...00\dot{0}100...|\psi_1^* \psi_{-2} |...0010\dot{0}00...> + <...00\dot{0}100...|\psi_1^* \psi_{-1} |...001\dot{0}00...> + <...00\dot{0}100...|\psi_1^* \psi_0 |...00\dot{1}00...> + <...00\dot{0}100...|\psi_1^* \psi_1 |...00\dot{0}100...> + <...00\dot{0}100...|\psi_1^* \psi_2 |...00\dot{0}0100..> ...) \\
& + (...<...00\dot{0}0100...| \psi_2^* \psi_{-2} |...0010\dot{0}00...> + <...00\dot{0}0100...| \psi_2^* \psi_{-1} |...001\dot{0}00...> + <...00\dot{0}0100...| \psi_2^* \psi_0 |...00\dot{1}00...> + <...00\dot{0}0100...| \psi_2^* \psi_1 |...00\dot{0}100...> + <...00\dot{0}0100...| \psi_2^* \psi_2 |...00\dot{0}0100..> ...) \\
& + ... \\
= & ... \\
& + (...\psi_{-2}^* \psi_{-2}<...0010\dot{0}00...|...0010\dot{0}00...> + \psi_{-2}^* \psi_{-1}<...0010\dot{0}00...|...001\dot{0}00...> + \psi_{-2}^* \psi_0<...0010\dot{0}00...|...00\dot{1}00...> + \psi_{-2}^* \psi_1<...0010\dot{0}00...|...00\dot{0}100...> + \psi_{-2}^* \psi_2<...0010\dot{0}00...|...00\dot{0}0100..> ... ) \\
& + (...\psi_{-1}^* \psi_{-2}<...001\dot{0}00...|...0010\dot{0}00...> + \psi_{-1}^* \psi_{-1}<...001\dot{0}00...|...001\dot{0}00...> + \psi_{-1}^* \psi_0<...001\dot{0}00...|...00\dot{1}00...> + \psi_{-1}^* \psi_1<...001\dot{0}00...|...00\dot{0}100...> + \psi_{-1}^* \psi_2<...001\dot{0}00...|...00\dot{0}0100..> ...) \\
& + (...\psi_0^* \psi_{-2}<...00\dot{1}00...|...0010\dot{0}00...> + \psi_0^* \psi_{-1}<...00\dot{1}00...|...001\dot{0}00...> + \psi_0^* \psi_0<...00\dot{1}00...|...00\dot{1}00...> + \psi_0^* \psi_1<...00\dot{1}00...|...00\dot{0}100...> + \psi_0^* \psi_2<...00\dot{1}00...|...00\dot{0}0100..> ...) + \\
& + (...\psi_1^* \psi_{-2}<...00\dot{0}100...|...0010\dot{0}00...> + \psi_1^* \psi_{-1}<...00\dot{0}100...|...001\dot{0}00...> + \psi_1^* \psi_0 <...00\dot{0}100...|...00\dot{1}00...> + \psi_1^* \psi_1<...00\dot{0}100...|...00\dot{0}100...> + \psi_1^* \psi_2<...00\dot{0}100...|...00\dot{0}0100..> ...) \\
& + (...\psi_2^* \psi_{-2}<...00\dot{0}0100...|...0010\dot{0}00...> + \psi_2^* \psi_{-1}<...00\dot{0}0100...|...001\dot{0}00...> + \psi_2^* \psi_0<...00\dot{0}0100...|...00\dot{1}00...> + \psi_2^* \psi_1<...00\dot{0}0100...|...00\dot{0}100...> + \psi_2^* \psi_2<...00\dot{0}0100...|...00\dot{0}0100..> ...) \\
& + ... \\
= & ... + \psi_{-2}^* \psi_{-2}+\psi_{-1}^* \psi_{-1}+\psi_{0}^* \psi_{0}+\psi_{1}^* \psi_{1}+\psi_{2}^* \psi_{2} + ...
\end{align*}
いくつか内積を求めてみよう。
\begin{align*}
& <...00\dot{0}00...|\hat{a}_1 \psi_1^* \hat{\Psi}^\dagger | ...00\dot{0}00..> \\
&= \psi_{1}^* \psi_{1}
\end{align*}
別の例を示そう。
\begin{align*}
& <...00\dot{0}00...|\hat{a}_1 \psi_1^* \psi_1 \hat{a}_1^\dagger | ...00\dot{0}00..> \\
&= \psi_{1}^* \psi_{1}
\end{align*}
11.2 重ね合わせの内積をHaskellで実現する
原理の説明がとても長くなってしまったが、プログラムの方はいたって簡単だ。状態があっているものを抜き出して、複素数で表されたスカラー量を掛け合わせたものの総和を取ればよいので次のようになる。
重ね合わせの内積は^**^で表すことにしよう。プログラムは次のようになる。
infix 4 ^**^ (^**^) :: (Num a, Eq a, Ord a, Show a, RealFloat b, Show b) => CoEntangle a (Complex b) -> Entangle (Complex b) a -> Complex b (^**^) b k = product b k (0 :+ 0) where product EnZero' _ s = s product _ EnZero s = s product b@(bs :|: (ba, bb)) k@((ka, kb) :&: ks) s |ba < kb = product bs k s |ba > kb = product b ks s |otherwise = product bs ks s + bb * ka
モジュール名はQtm.Entangleとしよう。プログラムの全体を示すと次のようになる。
{-#LANGUAGE GADTs #-} module Qtm.Entangle (Entangle (EnZero, (:&:)), esort, (+&), prEntangle, normalize, CoEntangle (EnZero', (:|:)), esort', (-|), prCoEntangle, normalize', (^**^))where import Data.Complex import Qtm.Entangle.KetEntangle import Qtm.Entangle.BraEntangle -- Inner Product of a Bra Entaglement and a Ket Entaglement infix 4 ^**^ (^**^) :: (Num a, Eq a, Ord a, Show a, RealFloat b, Show b) => CoEntangle a (Complex b) -> Entangle (Complex b) a -> Complex b (^**^) b k = product b k (0 :+ 0) where product EnZero' _ s = s product _ EnZero s = s product b@(bs :|: (ba, bb)) k@((ka, kb) :&: ks) s |ba < kb = product bs k s |ba > kb = product b ks s |otherwise = product bs ks s + bb * ka
同様にケットとブラの内積も、単独のモジュールKetBraで定義し、次のようにしよう。
{-#LANGUAGE GADTs #-} module Qtm.KetBra (Ket (KetZero, (:+:)), (+^), (-^), prKet, Bra (BraZero, (:-:)), (^+), (^-), prBra, (^*^), invK, invB) where import Qtm.KetBra.Ket import Qtm.KetBra.Bra infix 4 ^*^ (^*^) :: (Eq a, Ord a, Num a, Show a) => Bra a -> Ket a -> a (^*^) b k | b == Zero' = 0 | k == Zero = 0 | prKet (invB b) == prKet k = 1 | otherwise = 0
追伸:これまでのプログラム全体をGitHubからダウンロードできるようにしたので、興味ある方は、これを利用するとよい。
また、ケットとブラを利用するときは、モジュールQtm.KetBraを介して利用できる。Braで定義したZero'、また、KetでのZeroは、これまでユーザから見えて気持ち悪かったが、このモジュールを介することで隠蔽された。