2017-04-09

大雑把ではあるが

お住まい Gr(2,N) $M_{0,N}$ P^1(C) 
線形 wave equation (一般化)超幾何関数 Gauss超幾何関数
非線形 GASDYM方程式   Schlesinger   Painleve VI
量子論(非線形) KZ equation 量子Painleve VI

というような対応表がありそう。


非線形と書いているのは、ゲージ群がSL(2,C)の場合。Gr(2,N)はGrassmann多様体で、Wolf spaceというものである("Representation theory and ADHM-construction on quaternion symmetric spaces"という論文で、ADHM構成が一般化されている)と同時に、(一般化)超幾何関数も定義できる。また、$M_{0,N}$は種数$g=0$のN点付きRiemann面のモジュライ空間で、Gr(2,N)のChow quotientあるいはHilbert quotientというものとして実現できる(arXiv:alg-geom/9210002)。特に、N=4で特殊化したのが、最後の列。


#今の所、$M_{0,N}$の大域的な情報が必要になる場面はない気がするけど。

Equations for Chow and Hilbert quotients

https://arxiv.org/abs/0707.1801


それぞれの方程式がどこで定義されていると考えるのが一番自然であるかについて、コンセンサスがあるのかは分からない。比較的最近の論文を見ても、しばしば適当な局所アフィン座標上でのみ考えられていて、大域的な空間が何であるのかは書かれていないことも多い。表の意味としては、Gr(2,N)上の方程式を適当に簡約すると、$M_{0,N}$上の微分方程式が出るのだけど、希望的観測としては、Gr(2,N)上の方程式の解の"基底"をなす(古典非線形の場合は、線形性がないので、このようには言えないけど)のじゃないかと期待している。N=4の時、Gr(2,N)は複素Minkowski時空の共形コンパクト化であり、共形対称性も複素化して、sl(4,C)を考えるべきだと思うが、Gauss超幾何関数に於いて、この時空の対称性は、近接関係式として現れる。他のケースでは、時空の対称性は、どこに行ってしまったのか(私の知る限り)定かでないのだけど、超幾何関数同様、全部のパラメータをまとめて考えると、時空の対称性が見えてくるのでないかと思う(特に根拠はないけど)。CFTから時空の対称性を抽出する方法が分かれば僥倖という感じ


GASDYM(Generalized anti-self-dual Yang-Mills)方程式については、4次元以外では、2形式のHodge双対が2形式でないので、高次元化は自明でない。

Twistor Theory and the Schlesinger Equations

http://link.springer.com/chapter/10.1007%2F978-94-011-2082-1_3

では、twistor spaceの方で考えている。GASDYM方程式という名前が出てくるのは同著者らによる"Integrability, Self-duality, and Twistor Theory"という本のようである。4次元以外では、自己双対条件と反自己双対条件は、(少なくとも見た目は)互いに"双対"って感じではない


"量子論"の行は、古典論で対応するものは、量子化した後でも対応するだろうというだけのもので、そもそも、GASDYM方程式の量子化がよく分からないので、根拠は乏しい。まぁ、どちらかというと、この対応を手掛かりとして、量子GASDYM方程式を理解したいという気持ちがある

ノンパラメトリックベイズ(0)適応的棄却サンプリング

もうブームは去った気がするけど、ノンパラメトリックベイズの勉強をすることにした。統計学とかで、パラメトリックモデル/ノンパラメトリックモデルという概念があるけど、それとは関係ないように見える。infinite GMMを実装しようとしたら、適応的棄却サンプリング(ARS,Adaptive rejection sampling)を使うとか書いてあって、よく分からなかったので、そこから。


論文

adaptive rejection sampling for gibbs sampling(PDF)

http://www.math.chalmers.se/Stat/Grundutb/CTH/mve186/1415/adaptive.sampling.pdf

によると、元々はDevroyeという人の本に書いてある方法を改良したものらしい(?)。adaptive rejection samplingという名前は、この論文で命名されたのじゃないかと思うけど。


確率密度関数p(x)が解析的な式で与えられている状況で、普通の棄却サンプリングだと、

Rejection sampling

https://en.wikipedia.org/wiki/Rejection_sampling#Theory

提案分布(proposal distribution)は人間がいい感じに設定することになっているが、そんないい分布わかんねーよとかいうケースで、p(x)がlog-concave(文字通り、p(x)の対数が凹関数であるという条件)を満たす時に、p(x)の定義域上で、複数のxを選んで、各xにおいて、log p(x)の接線を引く。それらをつなぐと、log p(x)を上から近似する区分的線形関数が得られる(log-concaveである必要がここで生じる)ので、これのexponentialを取って正規化したものを提案分布とする、ということらしい(論文では、正規化してない関数を$u_k(x)$、正規化した確率密度関数を$s_k(x)$と書いている)。また、接線を計算するため、p(x)は一回以上微分可能である必要がある。逆関数法では、p(x)を積分する必要があるが、積分はできないけど、微分はできるというケースはよくある


区分的線形関数のexponentialを確率密度関数とするような乱数は、(少し面倒ではあるが)普通に逆関数法で生成できる。

逆関数法

https://ja.wikipedia.org/wiki/%E9%80%86%E9%96%A2%E6%95%B0%E6%B3%95

あと、棄却サンプリングで、提案分布に従う乱数xを発生させて、最終的に棄却された時、提案分布を作る時に選んだ"複数のx"に、これも追加して、提案分布を改善する(一番最初の点は人間が選ぶ必要がある。最低二点必要)。提案分布とp(x)の乖離が大きいxでは、棄却率が高く、これによって乖離の大きい部分が改善される可能性が高い。繰り返し行うと、提案分布の近似は、どんどんよくなっていくので"適応的"という名前が付いている。infinite GMMでは、毎回(Gibbsサンプリングの一ループ毎に)パラメータが変わって、提案分布も作りなおしになるけど

論文では、上から抑える関数とは別に下から抑える関数(論文でsqueezing functionと呼んでているもの)も作っていて、多分、元の確率密度関数を評価するよりも、区分線形関数のexponentialを評価する方が、一般的に計算量が少ないから、ということで、そうしているのだと思う。色々な改良やバリエーションがあるようだけど、区分線系関数のexponentialを使って、上(や下)から確率密度関数を抑える関数を作るという点は共通しているっぽい

※)論文2.2.2において、

¥exp(l_k(x^{*}) - u_k(x^{*})) ¥leq ¥exp(h(x^{*}) - u_k(x^{*}))

が成立するので、squeezing testはスキップしても結果は変わらない


最近、頭が悪くなった気がするので、これくらいだと理解できて良い。


以下に、単純な実装を置いておく。棄却されるたびに、h(x)とh'(x)を計算し直すのは、無駄の極みだけど、わかりやすさ重視。例として、ガンマ分布(np.random.gammaで生成できるが)

"""
This is an implementation of the following paper written in python 3.5

Adaptive Rejection Sampling for Gibbs Sampling
https://www.jstor.org/stable/2347565?seq=1#page_scan_tab_contents
"""

import numpy as np

def rnd_from_piecewise_exponential(coeffs , intercepts , points):
    """
       density function h(x) in [points[i] , points[i+1]]
       h(x) = exp(coeffs[i]*x + intercepts[i])
    """
    assert(len(coeffs)==len(intercepts)),(coeffs,intercepts)
    assert(len(coeffs)+1==len(points)),(coeffs,points)
    u = np.random.random()
    CDF = [0.0]  #--cumulative density value at each points
    for i in range(len(points)-1):
       z_cur = points[i]
       z_next = points[i+1]
       a = coeffs[i]
       b = intercepts[i]
       if a!=0.0:
           r = (np.exp(a*z_next+b) - np.exp(a*z_cur+b))/a
       else:
           r = (znext-z)*np.exp(b)
       r0 = CDF[-1]
       CDF.append( r + r0 )
    u = CDF[-1]*u    #--CDFが正規化されてないので
    for i in range(len(points)-1):
        if CDF[i] < u and u <=CDF[i+1]:
             a = coeffs[i]
             b = intercepts[i]
             z = points[i]
             """
                compute t such that
                ( exp(a*t+b) - exp(a*z+b) )/a == u - CDF[i]
             """
             if a!=0.0:
                 t0 = a*(u - CDF[i]) + np.exp(a*z+b)
                 assert(t0 > 0.0),t0
                 t = ( np.log(t0) - b )/a
             else:
                 t = (u - CDF[i])/np.exp(b) + z
             assert(t >= z and t <= points[i+1]),(t,z,points[i+1])
             return t



def ars(h , hprime , points , support=(0 , np.inf)):
     xs = [x for x in points]
     while 1:
         xs.sort()
         x0 = xs[0]
         xN = xs[-1]
         zs = [support[0]]
         coeffs = []
         intercepts = []
         for i in range(len(xs)-1):
             x = xs[i]
             xnext = xs[i+1]
             zi = (h(xnext) - h(x) - xnext*hprime(xnext)+x*hprime(x))/(hprime(x) - hprime(xnext))
             zs.append( zi )
             coeffs.append( hprime(x) )
             intercepts.append( h(x) - hprime(x)*x )
         zs.append( support[1] )
         coeffs.append( hprime(xN) )
         intercepts.append( h(xN) - hprime(xN)*xN )
         y = rnd_from_piecewise_exponential(coeffs , intercepts , zs)
         w = np.random.random()
#--      omit squeezing test
#         lkval = 0.0
#         for i in range(len(xs)-1):
#             if xs[i]<=y and y<=xs[i+1]:
#                 xcur = xs[i]
#                 xnext = xs[i+1]
#                 lkval = ( (xnext - y)*h(xcur) + (y-xcur)*h(xnext) )/(xnext-xcur)
#                 break
#         if w <= np.exp(lkval - ukval):
#             return y
         ukval = 0.0
         for i in range(len(zs)-1):
             if zs[i]<=y and y<=zs[i+1]:
                 ukval = h(xs[i]) + (y-xs[i])*hprime(xs[i])
                 break
         if w<=np.exp(h(y) - ukval):
             return y
         else:
             xs.append( y )


if __name__=="__main__":
   #-- gamma distribution
   alpha = 2.0       #-- shape parameter
   beta = 2.0        #-- rate parameter
   C = np.log(4.0)   #--  log( beta^alpha/Gamma(alpha) )
   def h(x):
      return ((alpha-1)*np.log(x) - beta*x + C)
   def hprime(x):
      return (alpha-1)/x - beta
   print( ars(h , hprime , [0.1 , 1.0 , 5.0]) )


ノンパラメトリックベイズ(0.5)Dirichlet Process Mixture ModelとInfinite GMM

Dirichlet process mixture model(DPMM)とinfinite Gaussian mixture model。まだ実装していないので(0.5)。infinite GMMを実装したら、次はinfinite HMMを理解したい



普通、サンプルデータを混合ガウス分布でfittingしようとする時、混合数は、人間が手動で与えるけど、混合数はいくらでも大きくなり得る(つまり∞)ようにしておいて、うまく推定する方法(母集団の分布として、無限混合モデルを仮定するようなものなので、パラメータが原理的には無限個あるけど、パラメトリックモデルではあると思う。混合数を決めないので、ノンパラメトリックらしいけど、しっくりこないネーミングではある)。Dirichlet process mixture model(DPMM)を最初に考えたのが誰かはよく分からない(多分、1974年のAntoniakの論文?)けど、Rasmussenという人が、2000年にハイパーパラメータも込みで推定する方法を考えて、Infinite Gaussian Mixture Modelという名前が付いた。これ以後、色んなInfinite XXXが生まれることになったっぽい。

The Infinite Gaussian Mixture Model

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.45.9111


多分、DPMMだと、正規分布の混合モデルである必要もないし、理屈上は、Infinite GMMでも、正規分布以外の混合モデルでも使うことはできるのだろうと思う。が、実用上は正規分布以外を考えることは、あんまりない気もする。Rasmussenの論文だと、MCMCでパラメータ・ハイパーパラメータの分布をサンプリングしてるだけのように見えるけど、多くのケースでは、"一番いい"パラメータ・ハイパーパラメータが欲しい気がする(つまり、ベイズ推定じゃなく、単にMAP推定したい)。これについては、MCMCで十分な数のサンプリングしてやって、その中で確率密度が最大になってるものを選べば、近似的に、真の最大確率密度を与える点を得られるというのが常套手法のよう



Rasmussenの論文では、ハイパーパラメータ(事前分布のパラメータをハイパーパラメータと呼ぶらしい)αの事前分布の導出が省略されすぎてて理解不能なのだけど

Hyperparameter estimation in Dirichlet process mixture models

http://citeseerx.ist.psu.edu/viewdoc/citations;jsessionid=A8264D1702C8FD7E1DDAEF8B1F6BD6B9?doi=10.1.1.51.6826

を読むといい気がする。この論文の一番最初に、Antoniakが与えた式として

P(k|¥alpha,n) = c_n(k) n! ¥alpha^k ¥frac{¥Gamma(¥alpha)}{¥Gamma(¥alpha+n)}

が出てくる。Antoniakの論文は数学の論文なので全体的に読みたくないが、この式は、Ewensの抽出公式というのと、第一種Stiring数の組み合わせ論的解釈からでる。

第一種Stirling数の組み合わせ数学における意味

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E6%95%B0#.E7.B5.84.E3.81.BF.E5.90.88.E3.82.8F.E3.81.9B.E6.95.B0.E5.AD.A6.E3.81.AB.E3.81.8A.E3.81.91.E3.82.8B.E6.84.8F.E5.91.B3

Ewens's sampling formula

https://en.wikipedia.org/wiki/Ewens%27s_sampling_formula


#Ewensの抽出公式は、1972年に、集団遺伝学の研究で導かれたものらしい。

これで、例えば、3つの要素{1,2,3}があったらクラスタリングの仕方は{{1,2,3}},{{1},{2,3}},{{2},{1,3}},{{3},{1,2}},{{1},{2},{3}}の4パターンあって、ハイパーパラメータαを決めると、それぞれの分割の出現確率が決まる。αは集団遺伝学の文脈では、突然変異"率"を表し、大きいほど、沢山のクラスターに分割されやすくなる(α→∞の極限で{{1},{2},{3}}への分割確率は1となる)。


正規分布のパラメータの事前分布としては、正規逆ガンマ分布というものを使う(これが、Dirichlet processの基底分布)。多変数(でfull共分散)の場合は、正規逆Wishart分布。この分布にも、パラメータ(ハイパーパラメータ)が入っており、これも決める必要がある。このへんの事前分布の決め方は、"In general the form of the priors are chosen to have (hopefully) reasonable modelling properties, with an eye to mathematical convenience (through the use of conjugate priors)"とか書いてあって、計算に都合のよさそうな形を選んだということ(?)



実装には、ガンマ分布に従う乱数の生成が必要になるけど、例えば、numpyを使う場合、

numpy.random.gamma

https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.gamma.html

の確率密度関数は、Rasmussenの論文の定義とは異なるものになっているに注意が必要。

p(x|k,¥theta) = x^{k-1} ¥frac{e^{-x/¥theta}}{¥theta^k ¥Gamma(k)}

がnumpyの確率密度関数で、論文のは

G(x|k,¥theta) = ¥frac{x^{k/2-1} e^{-k x/2¥theta}}{¥Gamma(k/2) (2¥theta/k)^{k/2}}

となっている。両者は

G(x|k,¥theta) = p(x|k/2 , 2 ¥theta/k)

という関係で結びついている。

スピン3以上のゲージ場(1)

物理に於ける代数的なテンソル計算の例

http://d.hatena.ne.jp/m-a-o/20170131#p1

の"おまけ"の続き。


狭い意味では、ゲージ場は定義によってスピン1であるけども、higher spin gauge fieldという言葉は(最近では?)一般的に使われているようなので、それを踏襲する。これは1996年のVasilievの論文(arXiv:hep-th/9611024)以降市民権を得たのだと思う(少なくとも、1980年頃の論文で用語自体は登場している)(私はVasilievの理論については、殆ど何も知らない)。この名称の背景には、質量0の(スピン0でない)ボソンは、"ポテンシャル"を持つことができ、スピン1の場合は、ベクトルポテンシャルと一致するという事実があり、これを以って、質量0の(スカラー場でない)ボソン場をhigher spin gauge fieldと呼ぶ。Vasilievの論文で引用されているいくつかの論文では、表現論的な議論は特にされていないが、

[1] Massless Fields as Unitary Representations of the Poincare Group

http://onlinelibrary.wiley.com/doi/10.1002/prop.19790270403/abstract

は表現論的視点から類似の議論を行っているように見える。これは1979年の論文で、大体この頃、higher spin gauge fieldに関するコンセンサスができたっぽい


通常の電磁場と一光子状態は、形式的には同じ形のMaxwell方程式を満たす(従って、共に"ベクトルポテンシャル"を持つ)ものの、前者は実数値の場で特に規格化されていない一方、後者は複素数値の場で自然なユニタリ内積が定まっていて(多分)規格化されているなど、大きな違いがある(規格化されていると積極的に考えるべき理由はないけど、定数倍しても観測量に影響がない)。Vasilievの理論は古典論であるので、前者のタイプの場を扱っている一方、論文[1]で扱っているのは、後者のタイプの場である。この2つの場の関係は、物理の教科書の説明では、以下のような感じだと思う。

『通常の電磁場を第二量子化することによって、光子の状態空間を得ることができ、この中には、光子数が正確にN個の状態が含まれていて、特に光子数が1個の状態からなる部分空間を取ってくることができる。これが、Poincare代数のスピン1のmasslessユニタリ表現(ヘリシティ±1のmassless既約ユニタリ表現の直和)と同値になる(はず)。そして、光子の状態空間は、この一光子状態空間の対称テンソル積として得られる』

この関係は、数学的に証明されている事柄ではないと思うので、どっちのタイプの場を扱ってるかは意識しておいたほうがいい気がする。以下では「相対論的場の理論の一粒子状態はPoincare代数の既約ユニタリ表現で分類される」という、教科書レベルで広く受け入れられてる(と思う)認識を元に、(0でない)整数ヘリシティを持つmassless既約ユニタリ表現に対応する一粒子状態が、"higher spin gauge fieldのsingle particle state"であるということにする。これは、Vasiliev理論で扱われている場とは正確には異なるものだ(と思う)けど、多くの数学的性質を共有しているっぽい



整数スピンsを持つmassless粒子は、Lorentz代数の表現D(s,0)+D(0,s)に値を取る場となっている。これはtwistor理論で完全に確立している事実で、ferimionでも同様に成立し、wave equationも分かっている。複素表現としては、D(s,0)とD(0,s)の2つの既約表現があり、helicityの正負と対応している。s=1の時は、D(1,0)+D(0,1)は2階の反対称テンソル場なので、これらの場がスピンsを持つゲージ粒子のfield strengthの場であると推測するのは自然。Lorentz代数の表現を忘れて単にベクトル空間として見れば

D(s,0) ¥simeq S^{2s}(¥mathbf{C}^2) ¥simeq ¥mathbf{C}^{2s+1}

D(0,s) ¥simeq S^{2s}(¥mathbf{C}^2) ¥simeq ¥mathbf{C}^{2s+1}

という同型があり、twistor理論で"既約なspinor場は対称spinor場となる"という事実(単にsl(2,C)の有限次元既約表現は自然表現の対称テンソル積表現で尽きるという事実の帰結)に関連している。論文[1]では、D(s,0)+D(0,s)が

¥bigotimes^{2s} D(1/2,1/2)

の部分表現として実現できる(D(1/2,1/2)はベクトル表現)という事実を使って、ランク$2s$のテンソル場として、扱っている。普通の(スピン1の)ゲージ場の曲率は2階の反対称テンソルで、Weylテンソルは4階のテンソルであることを思い出せば、自然な見方であるのかもしれない。


疑問)$V=D(1/2,1/2)$として、2階の反対称テンソルの空間は、分割(1,1)に対応するYoung symmetrizerの像として記述される。この空間は、gl(V)の既約表現であると同時に、so(4,C)の既約表現でもある。前回書いたように、分割(2,2)に対応するYoung symmetrizerの像は、代数的曲率の空間と呼ばれ、gl(V)の既約表現であるが、so(4,C)の表現としては可約である。この分解から、WeylテンソルとRicciテンソルが生じる(WeylテンソルはD(2,0)+D(0,2)で、RicciテンソルはD(1,1)+D(0,0)になる)。多分、一般相対論の教科書を見ると、Weylテンソルの名前が出ないことはあってもRicciテンソルの名前が出ないことはないだろうと思われるけど、gl(V)による既約分解を見ることは、意味のあることなのかもしれない。そうすると、スピンsの場合でも、代数的曲率空間に相当する何かがあるだろうか(例えば、分割(s,s)に対応するYoung symmetrizerの像だとか)。論文[1]の式(3.6)(I1)(I2)は、この高階テンソルがS^s(¥Lambda^2(V))に含まれるという条件に見える。



ゲージポテンシャル。スピン1の場合は、ベクトル場であり、D(1/2,1/2)に値を取る場となっていて、スピン2の場合は、D(1,1)場は対称トレースレステンソル場となるので、一般にはLorentz代数の表現D(s/2,s/2)に値を取る場をポテンシャルとして持つのだろうと予想される。s/2は半整数でないといけないので、これは、bosonの場合しか意味がない(massless fermionがポテンシャル場を持たないとは言えないが)。一般に

S^{k+2}(D(1/2,1/2)) ¥simeq D(k/2+1,k/2+1) ¥oplus S^k(D(1/2,1/2)

S^k(D(1/2,1/2)) ¥simeq ¥bigoplus_{j=0}^{¥[k/2¥]} D(k/2-j,k/2-j)

S^2(D(1/2,1/2)) ¥simeq D(1,1) ¥oplus D(0,0)

S^3(D(1/2,1/2)) ¥simeq D(3/2,3/2) ¥oplus D(1/2,1/2)

S^4(D(1/2,1/2)) ¥simeq D(2,2) ¥oplus D(1,1) ¥oplus D(0,0)

etc.

という既約分解が成立するので、物理の文献では、単にhigher spin gauge potential field=高階対称テンソル場として扱われているようである。


(※)D(1/2,1/2)の基底がe_0,e_1,e_2,e_3であるとして、Lorentz代数の標準的な表現を考えるとe_0 ¥otimes e_0 - e_1 ¥otimes e_1 - e_2 ¥otimes e_2 - e_3 ¥otimes e_3は明らかに2階の対称テンソルで、かつLorentz代数の作用は全て0となることは容易に分かる。これが2階の対称テンソルに於けるD(0,0)成分となっている。一般に2つの添字でトレースを取ることで

S^{k+2}(D(1/2),D(1/2)) ¥to S^k(D(1/2,1/2)

A_{¥mu_1 ¥mu_2 ¥cdots ¥mu_{k+2}} ¥mapsto A^{¥lambda}_{¥lambda ¥mu_3¥cdots ¥mu_{k+2}}

のように(k+2)階の対称テンソルから、k階の対称テンソルへの射影が得られる(対称テンソルなので、どの2つの添字を選んでも同じ)


#最近、「古典群の表現論と組み合わせ論(下)」という本を見ていたら、シンプレクティック群と直交群では、(symmetricとは限らない)traceless tensorの空間を、Schur-Weylの時と同様に分解することができて、更に、一般の直交群の対称トレースレステンソルの既約分解が、上の分解と同じように与えられていた(186ページ、命題8.26)。最高ウェイトベクトルもYoung symmetrizerを使って計算することができる。


#局所的には、一般相対論の計量は、$GL(4,R)/O(3,1)$に住んでいると言える。この計量の空間には線形性がない一方、上のスピン2のゲージポテンシャルは線形性がある。Lie環のレベルでは

gl(4,¥mathbf{C}) ¥simeq o(4,¥mathbf{C}) ¥oplus S^2(¥mathbf{C}^4)

という分解が成立し、右辺の第二成分は、2階の対称テンソルになっている(複素化しているのは、量子論では場が複素数値になるので、計量なども複素化されるべきだろうという理由から)。というわけで、少なくとも、線形近似の範囲で、計量はスピン2のゲージポテンシャルと見なすことが正当化される(と思われている)



次に、ポテンシャルとfield strengthの関係について。数学的に納得できる記述は見たことがなかったけど、論文[1]の8節に書いてある(完)。これを理解するには、Lorentz代数の表現だけ見ていても不十分で、「場」が必要になる。Lorentz代数の(既約とは限らない)有限次元表現空間$V$に対して、「$V$に値を取る場」というのは、通常

V ¥otimes C^{¥infty}(¥mathbf{R}^4)

の"ようなもの"をイメージしているのだと思う。4次元Euclid空間は、実Minkowski時空の場合もあるし、物理の人は、運動量空間をよく使う。これは論文[1]でもそんな感じ。こういうのは、代数的に扱いづらいので、もっと限定した形の空間として

V ¥otimes H_0

を考える。H_0はPoincare代数のhelicity 0のmassless既約表現。とりあえず、重要そうな話として

(1)この空間には、Poincare代数の表現が定義できる(一般にユニタリーではないが)

(2)この空間では、massless Klein-Gordon方程式が、いつでも自動的に成立している。

の2点が確認できる


H_0

Maxwell方程式の表現論(2)Gupta-Bleuler量子化の表現論的側面

http://d.hatena.ne.jp/m-a-o/20151106#p2

ではV_0と書いているのと同じもので

H_0 = ¥{f ¥in ¥mathbf{C}¥[z_1,z_2,z_3,z_4¥] | (z_1 ¥partial_1 + z_2 ¥partial_2-z_3 ¥partial_3 - z_4 ¥partial_4)f = 0¥}

という実現を持つ。Poincare代数の作用の仕方は、前にも書いたので省略。例えば、2階の反対称テンソル場は、以下のデータ

F_{¥mu ¥nu} ¥in H_0 (¥mu,¥nu=0,1,2,3)

F_{¥mu ¥nu} = -F_{¥nu ¥mu}

と同一視できる。というわけで、場とは、ある条件を満たす4変数多項式の多次元配列である(テストで書いたら0点になりそうな定義)。一般に、helicity hのmassless既約ユニタリ表現は

H_{h} = ¥{f ¥in ¥mathbf{C}¥[z_1,z_2,z_3,z_4¥] | (z_1 ¥partial_1 + z_2 ¥partial_2-z_3 ¥partial_3 - z_4 ¥partial_4)f = 2 h f¥}

で実現できる(Poincare代数の作用の仕方は全て同一)



以上の準備のもとで、論文[1]8節に書いてあることを、そのまま読み替えると、例えば、スピン2のゲージポテンシャルからfield strengthへの写像S^2(D(1/2,1/2)) ¥otimes H_0 ¥to D(1/2,1/2)^{¥otimes 4} ¥otimes H_0

C_{¥mu ¥nu ¥rho ¥sigma} = P_{¥mu} P_{¥rho} h_{¥nu ¥sigma} - P_{¥nu} P_{¥rho} h_{¥mu ¥rho} - P_{¥mu} P_{¥sigma} h_{¥nu ¥rho} + P_{¥nu} P_{¥sigma} h_{¥mu ¥rho}

となり、これは線形化したWeylテンソルとなっている(この写像がPoincare代数の作用と可換であることは別途確かめる必要がある)。これは、S^2(V) ¥otimes H_0全体で定義されるが、h_{ab}はtracelessと仮定することで、D(1,1) ¥otimes H_0上に制限できる。


また、スピン1の時と同様、以下のゲージ変換が存在する

h_{ab} ¥mapsto h_{ab} + P_{a} ¥eta_{b} + P_{b} ¥eta_{a}

ここでh_{ab}に、traceless条件とHilbertゲージ条件を課すことにすると、任意のゲージ変換が許されず¥eta_{a}にも条件が必要となる。traceless条件は単に

P^a ¥eta_{a} = 0

という条件になる。traceless条件がある場合、Hilbertゲージは

P^a h_{ab} = 0

となり、ゲージ変換部分が0となるには

P^a (P_a ¥eta_{b} + P_b ¥eta_{a}) = (P_0^2-P_1^2-P_2^2-P_3^2)¥eta_{b} + P_b(P^a ¥eta_{a}) = 0

で、第一項は、massless Klein-Gordon方程式より0になり、第二項は、さっきと同じ条件

P^a ¥eta_{a} = 0

から0になる(本来のHilbertゲージ条件は、任意のゲージ変換で保たれるので当然。このへんの計算は、重力波の計算で出てくるものと形式的には同一)。ところで、これはLorenzゲージ条件となっている。つまり、

V_{fix}^{(0)} = H_0

V_{fix}^{(1)} = ¥{ A_{a} ¥in V ¥otimes H_0 | P^a A_{a} = 0 ¥}

V_{g}^{(1)} = ¥{ A_{a} ¥in V ¥otimes H_0 | A_a = P_a f , f ¥in V_{fix}^{(0)} ¥}

V_{fix}^{(2)} = ¥{ h_{ab} ¥in S^2(V) ¥otimes H_0 | P^a h_{ab}=0,h^a_{a} = 0 ¥}

V_{g}^{(2)} = ¥{ h_{ab} ¥in S^2(V) ¥otimes H_0 | h_{ab} = P_a v_b + P_b v_a , v_a ¥in V_{fix}^{(1)} ¥}

などと置くと、これらは全部Poincare代数の表現空間となっていて

V_{phys}^{(1)} = V_{fix}^{(1)}/V_{g}^{(1)} ¥simeq H_{+1} ¥oplus H_{-1}

がスピン1のmassless粒子の空間(helicity +1/-1の既約ユニタリ表現の直和)で

V_{phys}^{(2)} = V_{fix}^{(2)}/V_{g}^{(2)} ¥simeq H_{+2} ¥oplus H_{-2}

がスピン2のmassless粒子の空間(helicity +2/-2の既約ユニタリ表現の直和)となる(と思う)。沢山の表現空間と写像があって(これらの写像は、大体、Poincare代数の作用と可換となっているはず)、ややこしいけど、曲率写像

 C: V_{fix}^{(2)} ¥to V^{¥otimes 4} ¥otimes H_0

については

 Ker(C) = V_{g}^{(2)}

が成立するはず。スピン1の時の計算は以前やったけど、Im(C)の具体的な記述も同様にできると思う(が、面倒なのでやらない)。論文[1]にはスピン3以上の場合の条件も書いており、同じような形となっている。


論文[1]にも書いてある通り、V_{fix}^{(s)}は、traceless条件から、D(s/2,s/2) ¥otimes H_0に含まれることが言え、これは[dim D(s/2,s/2)=(s+1)^2]個の独立な成分を持つ場で、ゲージ固定でdim D((s-1)/2,(s-1)/2)=s^2の自由度が消え、2s+1の自由度が残る。ところで、V_{g}^{(s)}V_{fix}^{(s-1)}から来るので、2(s-1)+1=2s-1個分の自由度はゲージ変換の自由度であり、従って(2s+1)-(2s-1)=2成分が残る。これは、電磁波、重力波に共通する自由度で、ヘリシティ正負の2成分があることに対応する。ということから、論文には書いてないけど

V_{fix}^{(s)} ¥simeq V_{g}^{(s+1)}

が成立すると思われる(多分)



それなりに色々な計算をした結果得られるものがH_{+s} ¥oplus H_{-s}なので、苦労した意味はあるのか、という疑問はある(古典的には、ポテンシャルを考えることは、物質場との相互作用を書くのに必須だったけど)


※)QED(Quantum Electrodynamics)の状態空間というのは、(電子と光子のみを考える場合)、Poincare代数のスピンs、質量mのユニタリ表現をV(s,m)とする(m>0の時は、通常の既約ユニタリ表現。m=0の時は、massless既約ユニタリ表現2つの直和)時、

H_{QED} = S^{*}(V(1,0)) ¥otimes ¥Lambda(V(1/2,m))

のはず。V(1,0)の対称テンソル積空間には、V(1,0)の基底ごとにボソンの生成・消滅演算子が作用し、V(1/2,m)の外積空間には、V(1/2,m)の基底ごとにフェルミオンの生成・消滅演算子が作用する。H_{QED}は可算個の基底しか持たないので、電子と光子の相互作用がなければ、H_{QED}にPoincare代数の表現が普通に定義できる。これは自由場の理論なので、特に凄くも何ともないけど、現代の場の量子論の標準的な考えでは、相互作用を入れても、H_{QED}そのものは変わらない(多分)。変わるのは、Poincare代数の作用の仕方で、例えば、Hamiltonian(=Poincare代数の無限小時間並進)には相互作用項が入り、形式的には、その形はよく知られている。Poincare代数では

¥[K_i , P_i¥] = i P_0 (i=1,2,3)

なので(ここで、K_i,P_iはLorentz boostと運動量演算子、P_0はHamiltonian)、Hamiltonian以外にも相互作用項が入らないと、Poincare代数の作用を整合的に変形できない(はず。全く計算してないけど、運動量と角運動量は、相互作用項とかでないので、boost operatorに付加的な項が出て、適切な交換関係を満たすのだと思う。教科書とかで、そんな記述見たことないけど)。そんで、Hamiltonianの相互作用項は、形式的には

H_{int} ¥propto  ¥displaystyle ¥int ¥frac{d ¥mathbf{p} d ¥mathbf{k}}{¥sqrt{|¥mathbf{k}|}} (c_{¥mathbf{k}}^{+} a_{¥mathbf{p}}^{+}a_{¥mathbf{p}+¥mathbf{k}} + c_{¥mathbf{k}} a_{¥mathbf{p}}^{+}a_{¥mathbf{p}-¥mathbf{k}})

という形で、これを

H_{int} = ¥sum_{¥alpha,i,j} p_{¥alpha,i,j} c_{¥alpha}^{+} a_{i}^{+} a_j + ¥sum_{¥alpha,i,j} q_{¥alpha,i,j} c_{¥alpha} a_{i}^{+} a_{j}

というふうに書けるだろうと思う(p,qは係数で、具体的な値を計算して決定できるはず)。但し、c_{¥alpha}^{+}は光子の生成演算子、a_{i}^{+}は電子の生成演算子、a_{j}は電子の消滅演算子で、¥alphaは一光子の状態空間V(1,0)の基底を走り、i,jは一電子の状態空間V(1/2,m)の基底を走る



結局、(少なくともQEDくらいの)場の量子論が数学的に怪しいことになるのは平面波基底を使うからで、平面波基底は、上のQED状態空間の元でないし(勿論、並進演算子の連続スペクトル状態ではある)(そもそも、数学的な意味では厳密には基底ですらない)、上のQED状態空間は、可算個の基底を持つので、それでHamiltonianとか他の演算子を、ちゃんと書けば何も問題は起きないのでないかというようなことを、1.5年前くらいから考えていて、頑張れば、数学的に厳密なQED Hamiltonianを書けるのじゃないかと思うけど、一向に計算を進める気が起きないので、いくつかやるべき計算について書いておく(各問題につき、できたら10万円支払いますので、できた方は教えてください)


問題1:de Sitter代数so(4,1)の適当な既約ユニタリ表現のcontractionから、Poincare代数iso(3,1)のmassive既約ユニタリ表現を具体的に基底を取って書く(スピン0,1/2の場合くらいあれば十分)


問題2:問題1で計算したPoincare代数のmassive既約ユニタリ表現の基底に対応するMinkowski時空上の関数を具体的に決定すること(これも、スピン0と1/2の場合だけでOK)



問題1について。so(4,1)の既約ユニタリ表現は一杯あるけど、

GENERALIZED EIGENVECTORS AND GROUP REPRESENTATIONS - THE CONNECTION BETWEEN REPRESENTATIONS OF SO(4, 1) AND THE POINCARE GROUP

http://link.springer.com/chapter/10.1007%2F978-94-010-2669-7_8

を読むと、できそうな感じ。練習として、so(2,1)=su(1,1)の既約ユニタリ表現から、contractionによって、iso(1,1)の既約ユニタリ表現を作るというようなことをやるといいと思う。iso(1,1)の(contractionによらない)既約ユニタリ表現については

(1+1)-次元Poincare代数の表現論

http://formalgroup.tumblr.com/post/124635771365/1-1-%E6%AC%A1%E5%85%83poincare%E4%BB%A3%E6%95%B0%E3%81%AE%E8%A1%A8%E7%8F%BE%E8%AB%96

などを参考。



問題2は必須というわけでもないけど、masslessの場合の計算は、

Maxwell方程式の表現論

http://d.hatena.ne.jp/m-a-o/20150621#p1

でやっているので、massive版も一応やろうという話。

若干気になるのは、masslessの場合、光円錐上で特異性を持っていて、以前計算した時は、ただの有理関数として代数的に扱ったけれども、massiveの時は、多分Bessel関数とか出てきて代数的に扱えないかもしれない。それでも、やっぱりある超曲面上で特異になるんじゃないかと思うので、そのへんの扱いをどうするか。予想では、基底は全て同じ超曲面上に特異性を持つので、この超曲面を除いた領域で考えればいいと思う。masslessの場合は、どの基底もt^2-x^2-y^2-z^2=0上でのみ値が定まらず発散する。勿論、Poincare群の作用には並進があり、並進作用によって、光円錐は動くので、一見奇妙な気がするけど、並進は、Poincare代数の演算子のexponentialで、基底の(可算)無限個の和となるので、光円錐が動くことに問題はない。有限個の基底の和を考える限りは、同じ光円錐t^2-x^2-y^2-z^2=0上で特異となる


#似たような状況として、1/x,1/x^2,1/x^3,...を考えると、x>aにおいて

1/(x-a) = 1/x ( 1 / (1 - a/x) ) = 1/x(1 + a/x + (a/x)^2 + .... )

という等式が成立する。1/(x-a)は1/xを並進で動かしたものでx=aで特異であるけど、一方、右辺は、1/x,1/x^2,1/x^3,...の無限和であり、個々の関数はx=0で特異となっている

あまり綺麗な解決というわけでもないので、もっといい理解の仕方があるかもしれない。



問題をやるのに、物理の知識は微塵も必要ないけど、数学を多少出来る必要はある。これができれば、QED状態空間の具体的な記述がわかり、相互作用のない場合は、Hamiltonian、運動量、角運動量、boost演算子の全てが具体的に書ける。相互作用がある場合は、上に書いたように、Hamiltonianとboost operatorに相互作用項が入ると思うので、それを決めればいい。まぁダメだったら私の頭が悪かったというだけだし、これで、"QED Hamiltonian"が書けても、それが本当に通常のQEDの結果を再現するのかということは別途示す必要があるので、先は長い。

水素原子の表現論・零(二次元の場合)

水素原子の表現論

http://d.hatena.ne.jp/m-a-o/20140130#p1

で、4次元だと、どうなるか考えたりしたけど、一番簡単な2次元をやってないことに、気付いたので、計算してみた

2次元量子kepler系の束縛状態

http://formalgroup.tumblr.com/post/153902406125/2%E6%AC%A1%E5%85%83%E9%87%8F%E5%AD%90kepler%E7%B3%BB%E3%81%AE%E6%9D%9F%E7%B8%9B%E7%8A%B6%E6%85%8B


普通にやっても面白くないけど、3次元のKustaanheimo-Stiefel変換(KS変換)と類似するLevi-Civita変換があり、調和振動子に帰着させると計算が楽(個人的には、いくつもある計算方法の中で一番簡単な気がする)。Levi-Civita変換では、調和振動子の空間で$O(1)$の作用があって($(u_1,u_2) \to (-u_1 , -u_2)$)、これによって、Levi-Civita変換の行き先は不変に保たれる。そして、O(1)の作用は固有値±1を持ち、シンプレクティック代数の表現空間(振動子表現)も、それに従って既約分解し、その一つ(不変部分を取るので、O(1)作用の固有値+1部分)が水素原子の束縛状態の空間となる。



本編(二次元の場合)終わり。で、3次元に戻ると、KS変換がある。それは例えば

x = 2(u_1 u_3 + u_2 u_4)

y = 2(-u_1 u_4 + u_2 u_3)

z = u_1^2+u_2^2-u_3^2-u_4^2

などと書ける。今度は、4次元空間から3次元空間への写像となっている。KS変換は、3次元球面に制限すると、Hopf写像と同じものになる(S^3のS^2上のHopf fibrationを与える)。

Hopf Map

http://mathworld.wolfram.com/HopfMap.html

また、quaternionで回転行列を書こうとする(つまり、SU(2)をquaternionのノルム1の元と同一視して、SU(2)からSO(3)への準同型を作る)と、行列の成分に、やはり同じ式が出てくるのは、CG関係の仕事とかしてる人は見たことあると思う。他にも

Cayley-Klein parameterの量子化と量子化に関わる諸々

http://d.hatena.ne.jp/m-a-o/20100322#p2

でも、同じ式が出ている。KS変換はどこにでもあるような、ありふれた式と言える



Levi-Civita変換の時と同様、KS変換でも$(u_1,u_2,u_3,u_4)$の取り方には、任意性があり、$u$空間上のある群作用によって、$(u_1,u_2,u_3,u_4)$を動かしても、$(x,y,z)$の値は変わらないということが起きる。二次元Kepler系の場合と違って、今度は、連続群で、$U(1)$と同型になる。連続群なので、無限小変換を考えればいい。生成子は

 L = u_1 ¥frac{¥partial}{¥partial u_2} - u_2 ¥frac{¥partial}{¥partial u_1} - u_3 ¥frac{¥partial}{¥partial u_4} - u_4 ¥frac{¥partial}{¥partial u_3}

となる。Lをx,y,zに作用させて消えることを確認すればいい(これで尽きるということを言うには、多少議論が必要だけども、省略)


Lは、4次元の調和振動子の波動関数に作用する。調和振動子の波動関数の空間というのは、振動子表現のことといっていい。シンプレクティック代数sp(8,R)の中で、$L$が生成するLie環$u(1)$と交換する代数は$u(2,2)$であり、これは水素原子のspectrum generating algebra$so(4,2)$と$L$自身からなる。これは、Howe dualityの簡単な例となっていて、$(u(1),u(2,2))$はdual pairであるという。特に、Lの作用で消える、調和振動子の波動関数全体が、水素原子の束縛状態の空間であり、$so(4,2)$の極小表現である。$L$の固有値で振動子表現を固有空間分解すると、0以外の固有値に属する固有空間にも$so(4,2)$の作用があり、既約表現を得る。これが、ladder representationというものになる(4次元共形代数の整数helicityを持つmassless既約ユニタリ表現でもある。この場合、Lの固有値はヘリシティの二倍と等しい)。


参考)調和振動子の対称性とspectrum generating algebra

http://d.hatena.ne.jp/m-a-o/20161117#p1


古典論に於いて、Lに対応するのは、調和振動子の相空間への$U(1)$作用に関する運動量写像

¥Phi = q_1 p_2 - q_2 p_1 - q_3 p_4 + q_4 p_3 ¥in Map(T^{*}(¥mathbf{R}^4 ¥backslash ¥{0¥}) ¥to ¥mathbf{R})

なので、$L$は量子化運動量写像であるという見方もある。そうすると、水素原子のspectrum generating algebraは、調和振動子の対称性のうち、$U(1)$作用に関する量子化運動量写像と交換するもののみが、(quantum) Hamiltonian reductionの後も残る、という理解になる($L$自身は、水素原子の束縛状態に作用すると0になるので実質的に見えなくなってしまう)

#普通、quantum Hamiltonian reductionという時は、代数の簡約だけを考えて、表現については、何も言わないので、ここの言葉の使い方はあまり正しくはない

#KS変換と、水素原子のspectrum generating algebraは1960年代に見つかっているけど、上のような運動量写像を考えて、Kepler系の相空間を、調和振動子系の相空間のHamiltonian reductionとして理解する、というのは、もうちょっと後の1980年代くらいの論文あたりで普通になっているようである。真面目にsurveyしたわけではないので、もう少し古い論文もあるかもしれないけど、MarsdenとWeinsteinがsymplectic reductionの論文を出したのが1974年らしいから、何となく気付いていた人はいるのかもしれないけど、明確化したのは、それより後じゃないかと思う。振動子表現/Weil表現も、数学の方では、1960年代前半あたりのよう。Howe dualityは1970年代にpreprintを出したけど、完全版が出版されたのは1989年だったらしい(と、Wikipediaに書いてあった)


水素原子のspectrum generating algebraは、原論文を読むと天下り的に出てきた感が強い(とはいえ、本当に何もないところからは出てこない。角運動量とRLベクトルは知られており、一方、動径方向にはsu(1,1)作用があることが知られていたので、それを統一するという視点で得たのでないかと思う)けど、KS変換は、それに比べれば、随分自然にも見える(それで調和振動子に帰着できるというのは、やっぱり不思議なことではあるけど)ので、初学者向けの説明としては、例えば

(1)調和振動子の説明。特に、Heisenberg代数の既約表現とシンプレクティック代数の振動子表現の説明

(2)KS変換による水素原子の束縛状態のエネルギー準位計算

(3)KS変換から量子化運動量写像とspectrum generating algebraを導出

みたいな順序で説明すると、比較的抵抗が少なくて済みそう(表現論前提ではあるので、初めて量子力学を勉強する人向きかどうかは知らないけど)



更に高次元。2次元Kepler系ではLevi-Civita変換ときて、3次元Kepler系ではKS変換と来たけど、4次元Kepler系には、直接の類似物はないっぽい(束縛状態の空間のso(5,2)の既約ユニタリー表現としての構造は別の方法で調べることはできる。任意次元に於けるspectrum generating algebraとKepler系の表現論的記述は、既に知られている)。少し視点を変えると、次に"Hopf fibration"が現れるのはS^7->S^4であり、

参考)Quaternionic Hopf fibrations

https://en.wikipedia.org/wiki/Hopf_fibration#Quaternionic_Hopf_fibrations

5次元Kepler系の相空間が8次元調和振動子のHamiltonian reductionで出ると予想される。ファイバーはS^3であり、これはSp(1)=SU(2)=Spin(3)という群構造を持つ。これは、既に結果が知られている

The geometry of the SU(2) Kepler problem

http://www.sciencedirect.com/science/article/pii/039304409090004M

The Sp(1)-Kepler Problems

https://arxiv.org/abs/0805.0840


試しに少し計算してみると、quaternionic Hopf mapも二次の多項式写像で書けて

x_1 = u_1^2 + u_2^2 + u_3^2 + u_4^2 - u_5^2 - u_6^2 - u_7^2 - u_8^2

x_2 = 2(u_1 u_5 - u_2 u_6 - u_3 u_7 - u_4 u_8)

x_3 = 2(u_1 u_6 + u_2 u_5 + u_3 u_8 - u_4 u_7)

x_4 = 2(u_1 u_7 - u_2 u_8 + u_3 u_5 + u_4 u_6)

x_5 = 2(u_1 u_8 + u_2 u_7 - u_3 u_6 + u_4 u_5)

r=|x| = ¥sum_{i=1}^8 u_i^2

となる。

次の3つの無限小変換で、$x_1,x_2,x_3,x_4,x_5$は消え、これらはLie環$su(2)$と同型な閉じた実Lie環をなす。

D_1 = (u_1 ¥partial_2 - u_2 ¥partial_1) - (u_3 ¥partial_4 - u_4 ¥partial_3) - (u_5 ¥partial_6 - u_6 ¥partial_5) - (u_7 ¥partial_8 - u_8 ¥partial_7)

D_2 = (u_1 ¥partial_3 - u_3 ¥partial_1) + (u_2 ¥partial_4 - u_4 ¥partial_2) - (u_5 ¥partial_7 - u_7 ¥partial_5) - (u_6 ¥partial_8 - u_8 ¥partial_6)

D_3 = (u_1 ¥partial_4 - u_4 ¥partial_1) - (u_2 ¥partial_3 - u_3 ¥partial_2) - (u_5 ¥partial_8 - u_8 ¥partial_5) - (u_6 ¥partial_7 - u_7 ¥partial_6)

確かめていないけど、シンプレクティック代数sp(16,R)の中で、この$D_1,D_2,D_3$と交換するもの全体が、Lie環$so(6,2)$と同型になるのだと思う(上の論文によれば$(su(2),so(6,2))$もdual pair)。一応、Risa/Asirで以下の計算は確認した。


def assert(V){
   if(!V){error(V);}
   return 1;
}


X1 = u1^2 + u2^2 + u3^2 + u4^2 - u5^2 - u6^2 - u7^2 - u8^2;
X2 = 2*(u1*u5 - u2*u6 - u3*u7 - u4*u8);
X3 = 2*(u1*u6 + u2*u5 + u3*u8 - u4*u7);
X4 = 2*(u1*u7 - u2*u8 + u3*u5 + u4*u6);
X5 = 2*(u1*u8 + u2*u7 - u3*u6 + u4*u5);

/*以下は、全部0になる。*/

assert(diff(X1,u1)*u2-diff(X1,u2)*u1-diff(X1,u5)*u6+diff(X1,u6)*u5+( -diff(X1,u3)*u4+diff(X1,u4)*u3-diff(X1,u7)*u8+diff(X1,u8)*u7)==0);
assert(diff(X2,u1)*u2-diff(X2,u2)*u1-diff(X2,u5)*u6+diff(X2,u6)*u5+( -diff(X2,u3)*u4+diff(X2,u4)*u3-diff(X2,u7)*u8+diff(X2,u8)*u7)==0);
assert(diff(X3,u1)*u2-diff(X3,u2)*u1-diff(X3,u5)*u6+diff(X3,u6)*u5+( -diff(X3,u3)*u4+diff(X3,u4)*u3-diff(X3,u7)*u8+diff(X3,u8)*u7)==0);
assert(diff(X4,u1)*u2-diff(X4,u2)*u1-diff(X4,u5)*u6+diff(X4,u6)*u5+( -diff(X4,u3)*u4+diff(X4,u4)*u3-diff(X4,u7)*u8+diff(X4,u8)*u7)==0);
assert(diff(X5,u1)*u2-diff(X5,u2)*u1-diff(X5,u5)*u6+diff(X5,u6)*u5+( -diff(X5,u3)*u4+diff(X5,u4)*u3-diff(X5,u7)*u8+diff(X5,u8)*u7)==0);

assert(diff(X1,u1)*u3-diff(X1,u3)*u1-diff(X1,u5)*u7+diff(X1,u7)*u5-( -diff(X1,u2)*u4+diff(X1,u4)*u2-diff(X1,u6)*u8+diff(X1,u8)*u6)==0);
assert(diff(X2,u1)*u3-diff(X2,u3)*u1-diff(X2,u5)*u7+diff(X2,u7)*u5-( -diff(X2,u2)*u4+diff(X2,u4)*u2-diff(X2,u6)*u8+diff(X2,u8)*u6)==0);
assert(diff(X3,u1)*u3-diff(X3,u3)*u1-diff(X3,u5)*u7+diff(X3,u7)*u5-( -diff(X3,u2)*u4+diff(X3,u4)*u2-diff(X3,u6)*u8+diff(X3,u8)*u6)==0);
assert(diff(X4,u1)*u3-diff(X4,u3)*u1-diff(X4,u5)*u7+diff(X4,u7)*u5-( -diff(X4,u2)*u4+diff(X4,u4)*u2-diff(X4,u6)*u8+diff(X4,u8)*u6)==0);
assert(diff(X5,u1)*u3-diff(X5,u3)*u1-diff(X5,u5)*u7+diff(X5,u7)*u5-( -diff(X5,u2)*u4+diff(X5,u4)*u2-diff(X5,u6)*u8+diff(X5,u8)*u6)==0);

assert(diff(X1,u1)*u4-diff(X1,u4)*u1-diff(X1,u5)*u8+diff(X1,u8)*u5+( -diff(X1,u2)*u3+diff(X1,u3)*u2-diff(X1,u6)*u7+diff(X1,u7)*u6)==0);
assert(diff(X2,u1)*u4-diff(X2,u4)*u1-diff(X2,u5)*u8+diff(X2,u8)*u5+( -diff(X2,u2)*u3+diff(X2,u3)*u2-diff(X2,u6)*u7+diff(X2,u7)*u6)==0);
assert(diff(X3,u1)*u4-diff(X3,u4)*u1-diff(X3,u5)*u8+diff(X3,u8)*u5+( -diff(X3,u2)*u3+diff(X3,u3)*u2-diff(X3,u6)*u7+diff(X3,u7)*u6)==0);
assert(diff(X4,u1)*u4-diff(X4,u4)*u1-diff(X4,u5)*u8+diff(X4,u8)*u5+( -diff(X4,u2)*u3+diff(X4,u3)*u2-diff(X4,u6)*u7+diff(X4,u7)*u6)==0);
assert(diff(X5,u1)*u4-diff(X5,u4)*u1-diff(X5,u5)*u8+diff(X5,u8)*u5+( -diff(X5,u2)*u3+diff(X5,u3)*u2-diff(X5,u6)*u7+diff(X5,u7)*u6)==0);


で、Wikipediaには、もうひとつOctonionic Hopf fibrations S^15->S^8があると書いてある。そうすると、16次元調和振動子から9次元Kepler系への簡約が存在するのか考えたくなる。ファイバーであるところのS^7は、残念ながらコンパクトLie群の構造を持たないので、今までとは違う事情がありそうな感じである。good newsとしては、(9次元Kerpler系のspectrum generating algebraである)so(10,2)がsp(32,R)の部分代数として実現できる(らしい)という事実がある。それで、こういうものも調べた論文があるんじゃないかと思って、ググると、色々見つかったりするもので。

On the SO(10, 2) dynamical symmetry group of the MICZ-Kepler problem in a nine-dimensional space

http://aip.scitation.org/doi/10.1063/1.3606515

Exact analytical solutions of the Schrödinger equation for the nine-dimensional MICZ-Kepler problem

http://aip.scitation.org/doi/abs/10.1063/1.4921171?journalCode=jmp

という論文が出ており、9次元Kepler系を16次元調和振動子に帰着して解けるらしい。ただ、内容自体は簡単な計算をしただけ(端的に言って、殆ど何も新しいことはない)のもので、特に"低次元"のKS変換にいたO(1)=Spin(1),U(1)=Spin(2),Sp(1)=SU(2)=Spin(3)に相当するものが、どうなるのかについて情報がなく、相空間の簡約があるのかどうかは不明


#以下の論文によれば、更に高い次元でも類似の構成が存在するらしい(私は、きちんと確認していないので本当かどうかは知らない)。"一般化KS変換"の作り方は、Clifford代数$Cl_{0,n}$の$2^n$次元表現を利用しているように見える(論文の式(3)には、謎の条件Sp(¥Gamma_{¥lambda})=0というのが付いてるけど、何のことか不明)。論文が正しければ、例えば17次元Kepler系を32次元調和振動子に帰着して解くことができる(so(18,2)がsp(64,R)の部分Lie代数になる?)。しかし、相空間の簡約が存在するのかどうかは分からない。

Theory of the generalized Kustaanheimo-Stiefel transformation

http://www.sciencedirect.com/science/article/pii/037596019390520A


#Hopf fibrationの存在はdivision algebraの存在と関連しているのだと思う(S^15->S^31->S^16というfibrationは存在しないらしい)。一方、一般化KS変換の存在は、もうちょっと広いCayley-Dickson代数というものと関係しているらしい。Cayley-Dickson代数は、通常の実数・複素数・四元数・八元数を含んで、更に16元数(sedenion),etc.と無限に続く。これらの文脈では、Hopf写像と呼ばずに、Hurwitz変換と呼ばれていることが多いっぽい。同じものに、違う名前が一杯ついていて辛い。。とりあえず"Kustaanheimo"のスペルが何回書いても覚えられそうにないので、違う名前を採用して欲しい(まぁ、CFL条件とか、Courant以降誰だっけって感じだけど、CFL条件という名前で覚えているので、KS変換という名前で普及していけば関係ないかもしれない)


#d次元Kepler系のspectrum generating algebraは、D=d+1次元の共形代数で、d=2,3,5,9に対応するのは、D=3,4,6,10である。これらの次元は、SUSY関連ではよく見る。so(10,2)がsp(32,R)の部分Lie環になるというのも、その手の文献に書いてあった(ので、自分では何も確認してない)。これらの次元が重要な理由は、division algebraの存在と関係しているらしい。

super Poincare Li algebra#Lie algebra cohomology

https://ncatlab.org/nlab/show/super+Poincare+Lie+algebra#LieAlgebraCohomology


#KS変換は、(古典力学特に天文周りの文献では)KS正則化という名前で登場することも多い。重力は原点に特異点があり衝突時の計算に問題を引き起こすが、この特異点を何らかの方法で除去することを正則化と呼ぶらしい(量子力学側では、正則化しても表現としては同値になってるので、その観点を強調する意味は薄いかもしれない)。別の方法として、(負エネルギーの)Kepler系を球面上の測地流と"同一視する"というMoserの方法がある(これはKS変換と違って、任意次元で使える)。測地流は量子化すると、ただのラプラシアンである。S^nの共形変換はSO(n+1,1)なので、水素原子(3次元Kepler系)のspectrum generating algebraのうち、so(4,1)までは自然に見える。この方法は量子力学側ではFockによる解法として知られている。Moserの方法で正エネルギー(散乱状態)を扱う場合、hyperboloid上の測地流を扱うことになるようである(量子力学側では、spherical harmonicsの代わりに"hyperbolic harmonics"を考えることになる)

Regularization of kepler's problem and the averaging method on a manifold

http://onlinelibrary.wiley.com/doi/10.1002/cpa.3160230406/abstract


##Moserの正則化/Fockの解法の表現論的理解については、以下の論文などを参照

On the dynamical symmetries of the Kepler problem

http://aip.scitation.org/doi/abs/10.1063/1.524511

Quantization of the Kepler manifold

https://projecteuclid.org/euclid.cmp/1104160353


##so(4,1)の既約表現に実はso(4,2)の作用があるというのは不思議なことで、何でこういうことが起きるのか、よく分からない(似た事例として、Poincare代数のmassless規約ユニタリ表現に共形代数の作用があるというのがある)。Liouville可積分性の立場から見ると、so(4,1)からso(4,2)へ拡大する時、ラプラシアンと交換する作用素が一個増える



最後に、今計算しようという気は全然起きないけど、octonionic Hopf mapの式だけ書いておく。間違えそうなので、Risa/Asirで。

X1 = (u1^2+u2^2+u3^2+u4^2+u5^2+u6^2+u7^2+u8^2)-(u9^2+u10^2+u11^2+u12^2+u13^2+u14^2+u15^2+u16^2);
X2 = 2*(u1*u9-u2*u10-u3*u11-u4*u12-u5*u13-u6*u14-u7*u15-u8*u16);
X3 = 2*(u1*u10+u2*u9+u3*u12-u4*u11+u5*u14-u6*u13-u7*u16+u8*u15);
X4 = 2*(u1*u11-u2*u12+u3*u9+u4*u10+u5*u15+u6*u16-u7*u13-u8*u14);
X5 = 2*(u1*u12+u2*u11-u3*u10+u4*u9+u5*u16-u6*u15+u7*u14-u8*u13);
X6 = 2*(u1*u13-u2*u14-u3*u15-u4*u16+u5*u9+u6*u10+u7*u11+u8*u12);
X7 = 2*(u1*u14+u2*u13-u3*u16+u4*u15-u5*u10+u6*u9-u7*u12+u8*u11);
X8 = 2*(u1*u15+u2*u16+u3*u13-u4*u14-u5*u11+u6*u12+u7*u9-u8*u10);
X9 = 2*(u1*u16-u2*u15+u3*u14+u4*u13-u5*u12-u6*u11+u7*u10+u8*u9);


/*
fctr(X1^2+X2^2+X3^2+X4^2+X5^2+X6^2+X7^2+X8^2+X9^2);
が
[[1,1],[u1^2+u2^2+u3^2+u4^2+u5^2+u6^2+u7^2+u8^2+u9^2+u10^2+u11^2+u12^2+u13^2+u14^2+u15^2+u16^2,2]]
になってれば多分OK
*/

2017-01-31

一般に、滑らかな多様体X上の主G束Pがあると、associated bundleの構成によって、G-表現の圏Rep(G)からベクトル束の圏Vect(X)への関手が作られる。それぞれ、K群を作って、表現環R(G)から、K(X)への環準同型が得られることになる(特に名前はないっぽい)。引き続き、主G束Pを固定しておくと、似たような写像として、Chern-Weil mapというのがいた。これは、Lie環Lie(G)上のG-不変な多項式関数I(G)から、コホモロジー$H_{dR}(X)$への準同型を与える。この2つの写像を結びつけるものとしては、Chern characterがいる。これはK(X)から、H^{*}(X,Q)への写像である。というわけで、以下の3つの写像が在る(以下、係数体/係数環は、必要に応じて適宜読み替えること)

R(G) -> K(X)
         |
         |Chern character
         ↓
I(G) -> H^{*}(X) 

こういう風に書くと、この図を可換にするR(G) -> I(G)への写像がいないのは不自然な気持ちになる。

I(G) = H^{*}(BG,R)

はChern-Weil mapの元である(BGは分類空間)し、R(G)->K(BG)も簡単に得られる(K(BG)はR(G)と同型ではないが、Atiyah-Segal completion theoremというものがあって、"殆ど同型"らしい)ので、Chern characterによって、以下のような写像が得られる。

R(G) -> K(BG) -> H^{*}(BG,Q)

ということで、R(G)->I(G)も結局Chern characterによって書ける。しかし、私の知る限り、この写像は幾何学的動機がないと考えてみようとは思わないタイプのもので、代数的に重要となる場面はないようである(ついでに、難しいことでないにも関わらず、文献で明示的に書かれているのを見かけない)。R(G)もI(G)も純代数的対象であるにも関わらず、不思議なことだと思う。ついでに、R(G)に謎のgradingを入れることができて、gr R(G)とI(G)を同型にできるらしい(この観点からすると、R(G):I(G)=K群:Chow群と思うべきようである)


参考)Chern classes for representations of reductive groups

https://arxiv.org/abs/math/0104031

The connection between representation theory and Schubert calculus

https://arxiv.org/abs/math/0306414


(Question)ところで、Gが有限群の時に、I(G)を定義する方法は、分類空間のコホモロジーを考えるのと、R(G)にaugmented lambda-ringの構造を入れてgr R(G)を作る2種類が考えられる。この2つは一致するのだろうか。私は、この分野(有限群のコホモロジー)について何も知らないので、答えはwell-knownである可能性は高いが


ついでに、Riemann-Rochの定理に出てくる登場人物として、Chern character以外に、Todd classがいるが、これはDuflo isomorphismというLie代数的な対象との関係が指摘されている(形式的には、(x/2)/sinh(x/2)あるいはx/(1-e^{-x})という形式的べき級数がどちらでも出てくる)

Lectures on Duflo isomorphisms in Lie algebras and complex geometry

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.184.5273

物理に於ける代数的なテンソル計算の例

特に新しい話(tensorネットワークとか、そういうの)はない


その1。弾性係数テンソルは、2階の歪テンソルから、2階の応力テンソルへの線形変換である。面倒なので、添字を全部おろしておくとする。$V$を$O(3)$の3次元表現として、弾性係数テンソルは単純にはV ¥otimes V ¥otimes V ¥otimes Vに住んでいて、次元は3^4=81である。$V$の基底$v_1,v_2,v_3$を取って

c = ¥sum c_{ijkl} v_i ¥otimes v_j ¥otimes v_k ¥otimes v_l ¥in V ¥otimes V ¥otimes V ¥otimes V

とする時、弾性係数テンソルが満たすべき条件は

c_{ijkl} = c_{jikl}

c_{ijkl} = c_{ijlk}

c_{ijkl} = c_{klij}

である。4階テンソルの空間には、GL(V)の作用と可換な四次対称群の作用があり、この条件は、四次対称群の群環の元でテンソルが消えるという形で書けるので、基底の取り方には依存しない。最初の2つは、(i,j)<->(j,i)の入れ替えと(k,l)<->(l,k)の入れ替えで弾性係数テンソルが不変という条件で、これは、応力テンソルと歪テンソルが対称であることからやってくる条件。言い換えれば、最初の2つの条件は、弾性係数テンソルが実際にはS^2(V) ¥otimes S^2(V)に住んでいることを言っている。S^2(V)は対称テンソル積空間で、今の場合、次元は6なので、S^2(V) ¥otimes S^2(V)の次元は36となる。最後の条件は、ポテンシャルエネルギーが存在するというような物理的仮定からやってくるものである。最後の条件によって、弾性係数テンソルはS^2(S^2(V))に住んでいるということになる。この次元は、21である。ここまでは、O(3)は全く必要なく、GL(V)だけでいい


多くの物質では、等方性を仮定する。これは、S^2(S^2(V))の中の$O(3)$自明表現に相当する部分を取り出すことに相当する。この次元を計算してみる。これは、sl(2,C)の表現のテンソル積の分解と同じなので、表現論に馴染みがある人には、暗算でできるレベル。まず、

S^2(V) = V_1 ¥oplus V_5

である。$V_1$及び$V_5$は、$O(3)$の1次元既約表現と5次元既約表現で、どちらも次元のみから同型を除いて一意に決まる。この分解は、体積ひずみと偏差ひずみへの分解などに対応している。で、更にこれのテンソル積を既約分解すると

S^2(V) ¥otimes S^2(V) = V_1 ¥oplus V_5 ¥oplus V_5 ¥oplus (V_9 ¥oplus V_7 ¥oplus V_5 ¥oplus V_3 ¥oplus V_1)

のようになる。この段階で、自明表現$V_1$は2つしかない。このことから、等方性を仮定する場合には、弾性係数テンソルに関する3つ目の条件がなくても構わない、ということを意味する。一応

S^2(S^2(V)) = 2 ¥cdot V_1 ¥oplus 2 ¥cdot V_5 ¥oplus V_9

なので、自明表現は2つとなる。以上から、等方的な弾性係数テンソルの独立な成分は2つであるということが分かる。2つの成分の取り方は色々ある

等方均質材料の弾性率の相関関係

https://ja.wikipedia.org/wiki/%E5%BC%BE%E6%80%A7%E7%8E%87#.E7.AD.89.E6.96.B9.E5.9D.87.E8.B3.AA.E6.9D.90.E6.96.99.E3.81.AE.E5.BC.BE.E6.80.A7.E7.8E.87.E3.81.AE.E7.9B.B8.E9.96.A2.E9.96.A2.E4.BF.82

粘性係数についても、全く同様の議論により、第一粘性係数と第二粘性係数が存在するけれども、物理的な理由により、通常、第二粘性係数は無視される



その2。リーマン曲率テンソル。弾性係数テンソルと同じく添字が4つある。リーマン幾何なら、群として$SO(n)$や$O(n)$を考えればいいけど、相対論的な状況を意識して、$SO(3,1)$で考えることにする(まぁ、有限次元表現を考えている段階では、殆ど一緒なのだけど)。$V$を$SO(3,1)$の自然表現として(ある一点に於ける接空間と思えばいい)、今回も添字を全部下におろしておく。素朴には、添字が4つあるので、曲率テンソルの住んでいる空間はV ¥otimes V ¥otimes V ¥otimes Vで、次元は4^4=256である。弾性係数テンソルと類似して、添字に関する対称性が存在している

R_{ijkl} = -R_{jikl}

R_{ijkl} = -R_{ijlk}

R_{ijkl} = R_{klij}

弾性係数テンソルの時と同様に考えれば、曲率テンソルはS^2(¥Lambda^2(V))に住んでいることになる。この次元は、21である。加えて、第一Bianchi恒等式がある

R_{ijkl} + R_{iklj} + R_{iljk} = 0

賢い導出が思いつかなかったので、天下り的に、以下のYoung symmetrizerを導入する

 c = (1 - s_{12})(1 - s_{34})(1 + s_{13})(1 + s_{24}) : V^{¥otimes 4} ¥to V^{¥otimes 4}

ここで、$s_{ij}$はi番目の成分とj番目の成分を入れ替える対称群の元。Young symmetrizerは、Young tableauxごとに定義できる表現論の道具の一つ。あからさまに書くと項が16個出てきてめんどくさいが

c(X ¥otimes Y ¥otimes Z ¥otimes W) = X ¥otimes Y ¥otimes Z ¥otimes W - Y ¥otimes X ¥otimes Z ¥otimes W - X ¥otimes Y ¥otimes W ¥otimes Z + Y ¥otimes X ¥otimes W ¥otimes Z + Z ¥otimes Y ¥otimes X ¥otimes W ¥¥ - Y ¥otimes Z ¥otimes X ¥otimes W -  Z ¥otimes Y ¥otimes W ¥otimes X + Y ¥otimes Z ¥otimes W ¥otimes X + X ¥otimes W ¥otimes Z ¥otimes Y - W ¥otimes X ¥otimes Z ¥otimes Y - W ¥otimes X ¥otimes Y ¥otimes Z +¥¥ X ¥otimes W ¥otimes Z ¥otimes Y + Z ¥otimes W ¥otimes X ¥otimes Y - W ¥otimes Z ¥otimes X ¥otimes Y - Z ¥otimes W ¥otimes Y ¥otimes X + W ¥otimes Z ¥otimes Y ¥otimes X

のようになる(多分)。cの像がリーマン曲率テンソルの条件を全部満たすことは簡単に分かる。また、簡単な計算によって、

c(R) = 12 R

R = ¥sum_{ijkl} R_{ijkl} v_i ¥otimes v_j ¥otimes v_k ¥otimes v_l

であることが分かる。計算のコツとしては、第一成分を固定したのをひとまとめとして見てやって

R_{ijkl} + R_{ilkj} - R_{ijlk} - R_{iklj} = R_{ijkl} - R_{iljk} + R_{ijkl} + (R_{ijkl} + R_{iljk}) = 3 R_{ijkl}

など。


というわけで、Im(c)がリーマン曲率テンソルの空間(代数的曲率テンソル空間の名前で知られる)であるが、これはGL(V)の表現論から、partition(2,2)に付随する既約表現S_{2,2}(V)と同型であることが分かる。この次元は、dim V=nとするとn^2(n^2-1)/12であることも、次元を計算する公式があるので、分かる。n=2の時は、1次元で、n=4の時は、20次元となる。別の見方をするとGL(V)の表現として

S^2(¥Lambda^2(V)) = S_{2,2}(V) ¥oplus ¥Lambda^4(V)

のように既約分解するので、第一Bianchi恒等式は、(他の条件が成立している元で)この完全反対称成分が消えることと同値。


4次元に戻って、代数的曲率空間を$SO(3,1)$の表現空間として既約分解する。以下、複素化して有限次元既約表現を非負半整数の組(n,m)で表すことにする。$so(3,1)$は実単純であるが、複素化した$so(4,C)$は2つの$sl(2,C)$の直和であり、$sl(2,C)$のスピンn表現とスピンm表現のテンソル積空間に、$so(4,C)$の有限次元既約表現が一つ作れる。特に、$SO(3,1)$の自然表現$V$(の複素化)はD(1/2,1/2)である。

¥Lambda^2(V) = D(1,0) ¥oplus D(0,1)

¥Lambda^2(V) ¥otimes ¥Lambda^2(V) = D(2,0) ¥oplus D(0,2) ¥oplus D(1,0) ¥oplus D(0,1) ¥oplus 2 ¥cdot D(1,1) ¥oplus 2 ¥cdot D(0,0)

はすぐ分かる。ちょっと手を動かすと

S^2(¥Lambda^2(V)) = D(2,0) ¥oplus D(0,2) ¥oplus D(1,1) ¥oplus D(0,0) ¥oplus D(0,0)

になるので、

S_{(2,2)}(V) = D(2,0) ¥oplus D(0,2) ¥oplus D(1,1) ¥oplus D(0,0)

が分かる。最初の2つの成分が、Weylの共形曲率テンソルで、3つ目がtraceless Ricci tensor、最後がスカラー曲率に対応する。複素化して考えているので、D(1,0)+D(0,1)とかD(2,0)+D(0,2)は可約であるけども、real representationとしては既約になる。古典論やリーマン幾何学の範囲では、実既約表現を考える方が自然な気がするけど、量子論まで行くと、この分解はhelicityの正負に対応しているので、複素既約表現を考えるほうが自然に思われる(D(1,0)+D(0,1)の分解は、幾何学的には、Hodge作用素による2-形式の固有分解に対応するが、Lorentz時空の場合はHodge作用素の固有値は+i/-iであるので、実空間上での分解はできない)


# 物理的にはどうでもいいことだと思うけど、以上の議論を、多様体上のテンソル場/ベクトル束に持っていくには、適当なG束のassociated bundleを取ればいい。微分形式(完全反対称テンソル場)は、フレーム束とGL(n,R)の自然表現の外積表現からassociated bundleを作り切断を取ったものだった。同様に、正規直交フレーム束と上に出てきた、色々な表現からassociated bundleを作れば、議論は、そのままベクトル束に持っていける。


第一Bianchi恒等式を扱ったら、第二Bianchi恒等式もやらないと不公平である。第二Bianchi恒等式は

R_{abcd;e} + R_{abde;c} + R_{abec;d} = 0

という形で、微分を含んでいることを忘れれば、5階のテンソルに対する恒等式のように見える。実際、

(¥partial_1 , ¥cdots ,¥partial_n)

はGL(n)の表現空間とみなせるから、代数的曲率空間にVを一個テンソルした空間を考えればいい。次の既約分解

V ¥otimes S_{2,2}(V) ¥simeq S_{3,2}(V) ¥oplus S_{2,2,1}(V)

があるのだけど、この2つ目の既約成分が0になるというのが、第二Bianchi恒等式と同値になる。この場合も、Young symmetrizerがあって

c = (1-s_{12})(1-s_{34}) ¥rho_{135} (1+ s_{24})

というのを考えるといい(はず)

¥rho_{135}( T_{abcde} ) = T_{abcde} + T_{cbade} + T_{ebcda} + T_{abedc} + T_{cbeda} + T_{ebadc}

という1,3,5成分を置換したものを全部足すような対称化演算子。計算は、やや面倒であるけども、見通しはそれほど悪くないはず



おまけ。重力波/重力子を担うのは、D(1,1)なのかD(2,0)+D(0,2)なのかという話。D(1,1)は対称トレースレステンソルで実現でき(勿論、重力場が弱い時の計量の摂動部分として出る)、D(2,0)+D(0,2)はWeylテンソルで実現できる。そもそもの話としては、Poincare代数の離散ヘリシティを持つmassless規約表現空間には、共形代数の作用が定義でき、この共形代数の表現は、振動子表現から作ることができる。この構成は数学的には簡単であって、物理学の怪しい議論が入る余地のないところであるが、標準的な物理に於ける電磁気学や重力理論(一般相対論)との関係が全く明らかではない点が問題となる。


[1] GROUP THEORY OF THE MASSLESS SPIN 2 FIELD AND GRAVITATION

http://link.springer.com/article/10.1007/BF00762448

は1975年の論文であるけど、"The most popular choice for the massless spin 2 field is a symmetric tensor of rank 2, i.e. D = D(1,1)."という記述があり(ちなみに、対称テンソルだとD(1,1)+D(0,0)で、D(1,1)はsymmetric traceless tensorとして実現できるので、微妙に記述が間違っている)、その後、色々な理由で、D(1,1)はダメなので、D(2,0)+D(0,2)を使いますということが書いてある。この時点ではコンセンサスがなかったことが読み取れる。一方、1986年の論文

[2] On solution spaces of massless field equations with arbitrary spin

http://aip.scitation.org/doi/abs/10.1063/1.527037?journalCode=jmp

では、各成分がmassless Klein-Gordon方程式を満たす対称トレースレステンソルの空間から、どのように重力子の状態空間を作るか、ということが書いてある。この構成は、量子電気力学に於けるGupta-Bleuerの構成と類似したものといえる


光子の時は、

Maxwell方程式の表現論(2)Gupta-Bleuler量子化の表現論的側面

http://d.hatena.ne.jp/m-a-o/20151106#p2

で書いた通り、

・各成分がKlein-Gordon方程式の解となってるベクトル(つまりD(1/2,1/2))場から、適当な2つの部分表現の商表現を作ると、一光子の状態空間が得られること(Gupta-Bleuerの構成)

・各成分がKlein-Gordon方程式の解となってる2階の反対称テンソル( D(1,0)+D(0,1) )場の部分表現として、一光子の状態空間が得られること(Maxwell方程式は、この部分表現を定義するための条件として自然にでてくる)

を直接計算で確認した


重力子(現時点で重力子は観測されてないと思うけど、ここでは、単にヘリシティ±2の質量0の粒子を指す)の時は、論文[1][2]から私が読み取れる情報と、光子の時との類似を元に推測すると

・各成分がKlein-Gordon方程式の解となってる対称トレースレステンソル(D(1,1))場から、適当な2つの部分表現(定義は、論文[2]のSec VのDを参照)の商表現を作ると、一重力子の状態空間が得られる

・各成分がKlein-Gordon方程式の解となってるWeylテンソル(D(2,0)+D(0,2))場の部分表現として、一重力子の状態空間が得られ、second Bianchi identityは、この部分表現を定義する条件として得られる(というのが、多分[1]の言ってること。これは、twistor理論から出てくる重力子の運動方程式でもあるはず)

という風になっているのだと思う(未確認)。光子の時にやった計算と同じことをやって、この2つの予想が合ってるか(あるいは間違ってるか)確認するのは、難しくないはず


疑問。論文[2]によれば、整数スピンnのmassless粒子の状態空間は、D(n/2,n/2)に値を取る場から類似の構成で得られるらしい。D(n,0)+D(0,n)についても、類似のことが成立するのかは不明。また、n=1,2の時には、D(n/2,n/2)に値を取る場とD(n,0)+D(0,n)に値を取る場の間には、それぞれ関係があった。n=1の時は、外微分で前者から後者を得ることができ、n=2の時は、計量から曲率を構成するのと同じ手順で前者から後者を得ることができると思う。一般のnでも何かあるのだろうけど詳細は分からない。また、massiveな場合は、Bargmann-Wigner方程式が、運動方程式として知られているけども、(Klein-Gordon方程式以外の場合)これらも同様に対称性から(論文[1]の言い方を使えば、ユニタリ条件として)導くことができるのか気になる


よく知らない話。物理を念頭にLorentz計量を考えたけども、Euclid計量の場合も、SO(4)がSO(3)2つの直積に分解するので、有限次元の表現論を同様に考えることができる。特に、Weylテンソルが自己双対成分と反自己双対成分に分かれるという点は共通する。Lorentz計量の場合と違い、この分解は、実表現としての分解になっているので、幾何学的に扱うことができる。微分幾何のことはよく知らないが、Weylテンソルが自己双対であるとか反自己双対である時に、Riemann多様体をSDであるとかASDであると呼ぶことにすると、Euclid型符号を持つ場合、Ricci平坦な単連結ASD4次元多様体は(複素二次元)ハイパーケーラー多様体になるらしい(Sp(1)とSU(2)の同型のおかげで、4次元ではRicci平坦なケーラー多様体としても特徴づけられる)。運動方程式であるところの第二Bianchi恒等式は、リーマン幾何では恒等式なので、表立って重要な働きはしないで、主要な条件はASD条件とRicci平坦性であるが、Ricci-flat Kähler=>ASDが知られているらしいので、Ricci平坦条件が残る。


おまけ2。テンソルとは何の関係もない話。4次元の実線形時空には、Euclid/Lorentz以外に、もう一つ(2,2)符号という選択肢がある(確立した名称がないけど、neutral signatureと呼ぶ)。実Lie環so(2,2)はso(2,1)2つの直和に分解するので、実空間で、SD/ASD成分への分解ができる。この時空の共形群の普遍被覆Spin(3,3)はSL(4,R)と同型である。この3種類の4次元実線形時空は、複素Grassmann多様体Gr(2,4)の部分空間として実現できる。これはtwistor理論では複素Minkowski時空の共形コンパクト化として出てくる。Gr(2,4)の局所アフィン座標として、2行2列の行列$Z$の成分がよく使われる(これは、[Z|I]という形で2x4行列を作ることによってGrassmann多様体上の点を定める)。これは複素座標であるが、この"実部"の取り方を変えることによって、Euclid/Minkowski空間及び、neutral signatureを持つ線形時空が実現できる。例として

Euclid

Z = ¥left( ¥begin{array} x_1 + i x_2 & x_3 + i x_4 ¥¥ -x_3 + i x_4 & x_1 - i x_2 ¥end{array} ¥right)

Minkowski

Z = ¥left( ¥begin{array} x_1 + x_2 & x_3 + i x_4 ¥¥ x_3 - i x_4 & x_1 - x_2 ¥end{array} ¥right)

neutral

Z = ¥left( ¥begin{array} x_1 & x_2 ¥¥ x_3 & x_4 ¥end{array} ¥right)

など。行列式を取ると、時空の"計量"が得られる。Euclid時空の場合は四元数の複素行列表現でもある。各時空の共形代数は、sl(4,C)の異なる非コンパクト実形を与える


何か関係あるのかどうかわからないけど、Gr(2,4)上のGelfandの超幾何微分方程式系の主要な部分をZの座標で書くと

 ¥left( ¥frac{¥partial^2}{¥partial Z_{11} ¥partial Z_{22}} - ¥frac{¥partial^2}{¥partial Z_{12} ¥partial Z_{21}} ¥right) F = 0

で、この方程式を、各実線形時空上で考えると、Laplace方程式やmaaless Klein-Gordon方程式、超双曲方程式が得られる。これらの方程式は共形対称性を持つ。 超双曲方程式には、X線変換で解を作ることができるという有名な性質がある。arXiv:0812.3692(The Penrose Transform in Split Signature)によると、X線変換はPenrose変換として理解でき、SL(4,R)の"極小表現"のcohomologicalな実現が得られるらしい(su(2,2)の場合も極小表現は、massless Klein-Gordon方程式のある解空間と見なせた)。この"極小表現"は、小林-Ørstedによって(通常の極小表現を意識して)定義されたもの。初出論文はわからないけど、

Conformal Geometry And Branching Laws For Unitary Representations Attached To Minimal Nilpotent Orbits

http://www.sciencedirect.com/science/article/pii/S0764444298801158

で定義されている。よく引用されているのは

Analysis on the minimal representation of O(p,q) I. Realization via conformal geometry

http://www.sciencedirect.com/science/article/pii/S0001870803000124

su(2,2)の場合は古くから知られた表現だったので、色々簡単だったが、sl(4,R)のは、比較的新しい話なこともあって、大分難しい。



※)突然、超幾何微分方程式系が出てくるのは偶然というわけでもないのだと思う。以前からGauss超幾何関数の"対称性"としてsl(4,C)の存在は知られている(個人的な意見としては、対称性があるというだけでは大して重要な情報とは言えないと思う)

Lie Theory and Generalizations of the Hypergeometric Functions

http://epubs.siam.org/doi/abs/10.1137/0125026

また、以下の事実は簡単に確認できる。

g(x_1,x_2,x_3,x_4) = x_1^{c-1} x_2^{-a} x_3^{-b} f(x_1 x_4/x_2 x_3)

という関係のある関数f,gについて、fがGauss超幾何微分方程式

 z(1-z) f’’(z) + (c - (1+a+b)z) f’(z) - ab f(z)=0

を満たすことと、gが超双曲方程式

(¥partial_1 ¥partial_4 - ¥partial_2 ¥partial_3) g = 0

を満たすことが同値。これも、Gauss超幾何関数を使って書ける超双曲方程式の解があるというだけのことだが、この特殊解をX線変換を使って書こうと思うと、超幾何積分が出てくる(Selected Topics in Integral Geometryという本のChapter2を参照)。このへんのことは状況証拠で、超双曲方程式の対称性とGauss超幾何関数の"対称性"が同じといっても、これらがcompatibleであることも確認しないといけないし、sl(4,C)の非コンパクト実形のうち、sl(4,R)がGauss超幾何関数にとって重要なのかどうかは分からない(超双曲方程式にX線変換があるように、例えばLaplace方程式にはBateman変換があるわけで。。)


Gelfandの超幾何系のアウトラインについては、例えば以下の文献は割と好み

Transformations and contiguity relationsfor Gelfand's hypergeometric functions

http://repository.dl.itc.u-tokyo.ac.jp/dspace/handle/2261/1588


ほとんど何も知らないけど線形でない話も少し。1993年、C^4上のSL(2,C)反自己双対Yang-Mills方程式(複素時空上の複素ゲージ群を持つASDYM方程式)をPainleve VI方程式に簡約できることが見つかったらしい

Self-duality and the Painleve transcendents

http://iopscience.iop.org/article/10.1088/0951-7715/6/4/004/meta

一方で、Pinleve VI方程式の解で超幾何関数を使って書けるものが知られていたらしいけど、これはSL(2,C) ASDYM方程式に対するWard ansatz solutionに対応するらしい

Painlevé VI, hypergeometric hierarchies and Ward ansätze

http://iopscience.iop.org/article/10.1088/0305-4470/39/39/S17

私はPainleve方程式のことはよく知らないが、Lemma1を見ると、上に書いたような、超双曲方程式とGauss超幾何方程式の関係が出ている。Painleve方程式は、古典Hamilton力学系としての定式化が知られているので、量子化することは自然に思える(Hamiltonianは二次以上の項が入っているし、時間変数も含んでいるので自然ではあるが自明ではない)。量子Painleve方程式については色々研究されているようだけど、どういう表現論を考えればいいのかは謎。

ただの多次元配列は如何にテンソルか

何となく検索してみた結果、世間には

・ただの多次元配列はテンソルじゃない

・テンソルは多次元配列と思って問題ない(「問題ない」という言い方は、"厳密に言うと正しくない(不正確だ)けど..."というニュアンスを感じる)

・テンソルは多次元配列である

という3種類くらいの意見があるっぽい。


有限の添字集合I={1,...,n}と体$F$に対して$Map(I,F)$は自然にF上のベクトル空間となり、かつ、同様に$J,K$を有限集合とすると、ベクトル空間の同型

Map(I ¥times J,F) ¥simeq Map(I,F) ¥otimes Map(J,F)

Map(I ¥times J ¥times K,F) ¥simeq Map(I,F) ¥otimes Map(J,F) ¥otimes Map(K,F)

etc.

があり、これらの同型の左辺はベクトル空間の構造を忘れれば、ただの多次元配列(の集合)になる。テンソル積の普遍性による定義とかだと、存在を証明してやらないといけないけど、この同型の左辺はベクトル空間のテンソル積の存在を証明するのに使える。つまり、n次元ベクトル空間Vの基底を(順序込みで)適当に選べば、VとMap(I,F)の同型が作れる(この同型は、基底の取り方に依存しているのでcanonicalではない)ので、あとは、Map(I × J , F)が、テンソル積の普遍性に関する条件を満たすことを示すという手順。というわけで、多次元配列の集合は、テンソル積ベクトル空間の具体的な構成を与えるし、これをテンソル積の定義と思っても差し支えない。テンソル積は高級な概念でも深遠な概念でもないので、雰囲気で計算してれば、あとのことは、そのうち分かるようになる気がする


ところで、ベクトルはベクトル空間の元であるけど、ベクトル空間のテンソル積はベクトル空間なので、テンソルはテンソル積空間の元です、という言い方はおかしなものになる。なので、数学では、テンソルという言葉を単体で使うことは少ない気がする(大体、テンソル積で一単語)。物理の人は、直交群O(n)や一般線形群GL(n)やLorentz群O(3,1)の自然表現をベクトル表現と呼ぶことがあって、この場合テンソルというのは、ベクトル表現(と、その双対表現)の何個かのテンソル積表現空間の元という意味で使われる。ベクトル場・テンソル場に於ける「ベクトル」「テンソル」も同様の(狭い方の)意味で使われている。

2016-11-17

最近見た面白い論文のコーナー

Special functions and the Mellin transforms of Laguerre and Hermite functions

https://arxiv.org/abs/math-ph/0612085

Hermite多項式とLaguerre多項式のMellin変換は、ゼロ点がRe(s)=1/2上にある(そして、全て単純零点)という事実が、1980年代から知られているらしい。

このMellin変換が超幾何関数の特殊値で表せて(パラメータ(a,b,c)がsの関数として表せる)、関数等式が超幾何関数のKummerの関数等式の帰結として出てくるというのが新しい発見のよう(そして、Kummerの関数等式は、GL(4)のWeyl群作用からの解釈がある)

そしてまた、任意次元の水素原子の固有エネルギー状態のMellin変換(この場合のMellin変換の定義は論文参照)も、Re(s)=1/2上にのみゼロ点を持ち、いずれも単純零点であるとのこと。これの背景には、調和振動子の適当な波動関数($O(n)$対称性のある既約表現に属するという条件がついている)のMellin変換を考えると、やはりRe(s)=1/2上にゼロ点があるという話があるらしい。

A Local Riemann Hypothesis, I

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.23.7311


水素原子の束縛状態の空間(3次元の場合はso(4,2)の極小表現)は、振動子表現(Weil表現/Segal-Shale-Weil表現)の部分空間としての実現を持つけど、表現の異なる実現に於いて、このような性質を共有するのは意外。KS変換する前と後でMellin変換の結果が同じものになるのかどうかは確認していないけど、もし一致するのであれば、表現の実現の仕方に依存しない形で、Mellin変換が理解できるのか興味がある。わたしは数論には興味がないし、Riemann予想は解けたら何が嬉しいのか、さっぱり分からないので、今まで興味がなかったけど、表現論的に何か面白いことがあるのかもなぁという感じ

調和振動子の対称性とspectrum generating algebra

ただのSegal-Shale-Weil表現(振動子表現という名前もある)の話。無限次元既約ユニタリー表現の研究は、Lorentz群やPoincare群で始まったけど、ある意味では、それより以前から知られていた、最初の無限次元既約ユニタリー表現の例でもある。


水素原子の表現論

http://d.hatena.ne.jp/m-a-o/20140130#p1

水素原子の表現論(1.5-2)spectrum generating algebra

http://d.hatena.ne.jp/m-a-o/20161010#p1

などで、

・3次元Kepler系の相空間には、群$SO(4,2)$が推移的にsymplectic変換として作用し、symplectic等質多様体であること

・水素原子の束縛状態の空間は、Lie環$so(4,2)$のある既約ユニタリー表現(極小表現)であり、$so(4,2)$はspectrum generating algebraという名前で呼ばれること

を書いた。また、Hamiltonianと交換する保存量として、角運動量とRunge-Lenzベクトルがあり、対応して、古典的にはエネルギー等値面上に、(エネルギーの大きさに応じて)$SO(4)$や$SO(3,1)$などの群が作用している。そして、水素原子に於ける主量子数はLie環$so(4,2)$の既約ユニタリー表現を$so(4)$に制限した時の分岐則として理解できる。というわけで、Kepler系では、相空間の幾何学的対称性とHamiltonianの対称性が、古典力学と量子力学を共に統制している様子を見ることができる。



調和振動子については、Heisenberg群/Heisenberg代数の表現論による記述がよく知られている。調和振動子の相空間$\mathbf{R}^{2n}$はHeisenberg群の余随伴軌道であって、幾何学的量子化が完璧に機能する。一方、(振動数が全て同一の$D$次元)調和振動子が、$su(D)$の(無限小)対称性を持つことも知られている。$su(D)$対称性は、(知らなくてもエネルギー固有値を計算できるし、そもそも一次元しか扱わない場合も多いので)量子力学の教科書には必ずしも書いていないことが多い気がするけど、調和振動子のエネルギーの縮退は、$su(D)$対称性の存在によって説明できる。調和振動子は明らかに回転対称性を持つが、これは、この調和振動子の対称性の一部で、このあたりの事情は、水素原子のエネルギーの縮退が、回転対称性より大きな対称性代数$so(4)$の表現によって説明されるのと似ている。


ところで、調和振動子の対称性$su(D)$はHeisenberg代数の部分Lie環になっていない。これ自体は、珍しいことでもないので、別に構わないという立場もありうるけど、「水素原子の表現論(1.5-2)」で触れたJosephの論文

Minimal realizations and spectrum generating algebras

https://projecteuclid.org/euclid.cmp/1103859776

には、symplectic代数$sp(2n,\mathbf{R})$が調和振動子のspectrum generating algebraであると書いてある。シンプレクティック群$Sp(2D,\mathbf{R})$は$\mathbf{R}^{2D}$に推移的には作用してないけど、稠密な開軌道は持つ。


Heisenberg代数とsymplectic群/代数との関係は、symplectic群がWeyl代数の環同型として作用することから来る(Weyl代数が、Euclid空間の余接空間の量子化であることを思い出せば自然)(Weyl代数の自己同型群自体は、もっとずっと大きい。 arXiv:math/0512169などを参照)。調和振動子の状態空間は、Heisenberg代数の既約ユニタリー表現空間であるが、この既約ユニタリー表現は、symplectic代数とHeisenberg代数の半直積の既約ユニタリー表現に一意に拡張でき、Segal-Shale-Weil表現と呼ばれる。この既約ユニタリー表現をsymplectic代数に制限すると、可約になって2つの既約表現に直和分解する。この2つの既約表現は極小表現になっていることが知られている。


注)Segal-Shale-Weil表現は、シンプレクティック群の射影表現にしかならない。量子力学で、幾何学的対称性の群の射影表現を考える必要が最初に生じたのは、スピン表現だと思うけど、事情は似ていて、スピン表現が$SO(3)$の二重被覆$SU(2)$の表現にはなっているように、シンプレクティック群の二重被覆であるメタプレクティック群の表現にはなる。まぁ、群で考えると、計算が面倒になるだけで特にメリットもないので、以下計算する時はLie環の方で考える。



というわけで、調和振動子の状態空間への$sp(2D,\mathbf{R})$の作用や、Hamiltonianの対称性$su(D)$の$sp(2D,\mathbf{R})$の部分Lie代数としての実現を見て、分岐則を調べれば、調和振動子のエネルギー固有値ごとに縮退した状態が、対称性$su(D)$の既約表現として得られるっぽいことを見る。この分岐則は、Segal-Shale-Weil表現の説明に必ず書いてあるようなことではあるし、特に複雑な計算もない(が、よい教科書は知らない)。以下、D>1を仮定する(D=1の時は、$su(1)$は自明になり、エネルギーに縮退もないので)


bosonの生成・消滅演算子と調和振動子のHamiltonianを、通常のように

 ¥[a_i^{-} , a_j^{+}¥] = ¥delta_{ij}

 ¥[a_i^{¥pm} , a_j^{¥pm} ¥] = 0

 H = ¥omega ¥sum_{k=1}^{D} (a_{k}^{+}a_k^{-} + ¥frac{1}{2})

で定める。容易な計算で

 X_{ij} = a_i^{+} a_j^{-}

は全てHamiltonianと可換になることが分かる。また簡単な計算によって

 ¥[X_{ij} , X_{kl} ¥] = ¥delta_{jk} X_{il} - ¥delta_{il} X_{kj}

なので、これがLie環$gl(D,\mathbf{C})$と同型なLie代数の基底をなすことが分かる。


Hamiltonianの対称性だけ見ていると、これで十分なのだけど、(後でspectrum generating algebraの基底も見ると)これでは(複素化した)spectrum generating algebraの部分Lie環にならないことが分かるので、

 X_{ij} = a_i^{+} a_j^{-} + ¥frac{1}{2} ¥delta_{ij}

とする必要がある。これも、依然としてLie環$gl(D,\mathbf{C})$の基底となるけど、おまけで付いてくる1/2のせいで、この表現は、一般線形群$GL(D,\mathbf{C})$の表現には持ち上がらない(群に拘りたい場合は、一般線形群の二重被覆metalinear群を考えることもできる)。しかし、$sl(D,\mathbf{C})$のCartan部分環は、標準的な基底として

 h_{i} = X_{ii} - X_{i+1,i+1}

を取ることができ、うまいこと1/2が相殺してくれるので、特殊線形群の表現には持ち上がる。$sl(D,\mathbf{C})$に入らない残りの一次元分の対称性は

 ¥sum_{k=1}^D X_{ii} = ¥sum_{k=1}^D (a_k^{+} a_k^{-} + ¥frac{1}{2})

で、定数倍を除けばHamiltonianそのものである。


#群に表現が持ち上がるかどうかという観点では、$SL(D,\mathbf{C})$や$SU(D)$は単連結だが、$GL(1)$や$U(1)$はそうでないというあたりから、面倒さがやってくる。$D$変数多項式環への$gl(D,\mathbf{C})$の作用として、行列単位に対して

 E_{ij} = x_i ¥partial_j + s ¥delta_{ij}

を取れる。対応する一般線形群$GL(D,\mathbf{C})$の表現は形式的には

 ¥pi_{s}(A)f(¥mathbf{x}) = ¥det(A)^{s} f(¥mathbf{x} A)

であるが、$s$が非整数の時、群の表現の方は$(det A)^{s}$が一価でない。しかし、$det A=1$の時に限定すれば問題はなくなり、特殊線形群$SL(D,\mathbf{C})$の表現は定まる。


spectrum generating algebraの実現。まず、複素化した$sp(2D,\mathbf{C})$を考えたほうがわかりやすい。次のように基底を取る

A_{ij} = ¥begin{pmatrix} E_{ij} & O ¥¥ O & -E_{ji} ¥end{pmatrix}

B_{ij} = ¥begin{pmatrix} O & E_{ij}+E_{ji} ¥¥ O & O ¥end{pmatrix}

C_{ij} = ¥begin{pmatrix} O & O ¥¥ E_{ij}+E_{ji} & O ¥end{pmatrix}

対応する演算子をbosonの生成・消滅演算子を使って

X_{ij} = a_i^{+} a_j^{-} + ¥frac{1}{2} ¥delta_{ij}

Y_{ij} = a_i^{+} a_j^{+}

Z_{ij} = a_i^{-} a_j^{-}

とする。これが、symplectic代数と同型なLie環をなすことは計算するのみ。Heisenberg代数にderivationとして作用していることも簡単な計算で分かる。Cartan対合$s$を

s(A_{ij}) = -A_{ji}

s(B_{ij}) = C_{ij}

で定める。このCartan対合に関する実型は$sp(2D,\mathbf{R})$と同型(証明略)。特に、上で作ったLie環$gl(D,\mathbf{C})$は部分Lie環になってることが分かり、このLie環の元のうち、Cartan対合で不変なもの全体は実Lie環$u(D)$をなす。


以上の定義によって、調和振動子の状態空間への$sp(2D,\mathbf{C})$と$sl(D,\mathbf{C})$(あるいは$sp(2D,\mathbf{R})$と$su(D)$)の作用が定まった(ユニタリー表現になることなどは示されてないけど)。symplectic代数の作用を見ると、振動子の個数を変化させないか、2個増減させることが分かるので、少なくとも振動子の個数の偶奇によって、2つの表現に直和分解する。


調和振動子の状態空間を、$su(D)$の表現として既約分解する。試みとして、|0>を基底状態として

 v_i = a_{i}^{+} |0 ¥rangle

を基底とする、ベクトル空間(振動子が一個の状態全体)を考える。そうすると

 a_{i}^{+} a_{j}^{-} (v_{k}) = ¥delta_{jk} v_{i}

なので、$su(D)$が自然表現として作用していることが分かる。一般に振動子$N$個の状態空間は、$su(D)$の自然表現の$N$次対称テンソル積表現となっていて、これらは全て既約表現である($N$次斉次多項式の空間と同一視できるので、適当に基底を取って、最高ウェイトetc.を直接計算すれば示せる。また、この事実から、上で書いた$sp(2D,\mathbf{R})$の2つの表現が既約であることが従う)。$su(D)$を複素化すると$sl(D,\mathbf{C})$なので、振動子の状態空間は、$sl(D,\mathbf{C})$の自然表現の対称テンソル積代数(必要なら、適当に完備化したもの)と同定できる。


Liouville可積分性について。調和振動子の場合、$su(D)$のCartan部分環は、$D-1$個の独立でinvolutiveな保存量を与える。Hamiltonian自身を合わせて、相空間の次元の半分の個数のinvolutieな保存量が得られる。各振動子の振動数ωが異なっていても、Liouville可積分ではあるが、対称性は、$su(D)$の部分代数に落ちていく。最も退化した場合は、$u(1)^{D-1}$となる


Heisenberg vs symplectic。量子Kepler系/水素原子との関連で考えると、Heisenberg代数でなく、symplectic代数をspectrum generating algebraとした方が自然ではある。水素原子については、調和振動子の$U(1)$作用によるHamiltonian reductionとして得られる(散乱状態の場合は、"虚の振動数"を持つHamiltonianを考える)けど、

M = ¥sum_{i=1}^2 X_{ii} - ¥sum_{i=3}^{4} X_{ii}

と可換な$sp(8,\mathbf{R})$の部分Lie代数が、$u(2,2)$と同型であるということが、Kepler系のspectrum generating algebraが$su(2,2)$であることの、1つの説明を与える。この$M$は$U(1)$作用の量子化運動量写像を与えると解釈でき、$u(1)$部分は、Hamiltonian reductionを取る際に0に取るので、結局$su(2,2)$が残る


#古典的な場合、Kustaanheimo-Stiefel変換と、このHamiltonian reductionの関係は

On the regularization of the Kepler problem

https://projecteuclid.org/euclid.cmp/1103921049

の3章に簡潔にまとまっている。


#また、Kepler系の相空間は、$su(2,2)$の極小軌道であった。一般に(symplectic群の)dual pairがあった場合、pairの片割れによる簡約相空間は、残りのpairの余随伴軌道(の閉包)と同型になることは、漠然と予想されているっぽい。が、この対応が、いつ正しいのか、正確なところは、よく分からない。

Examples of singular reduction

http://www.math.cornell.edu/~sjamaar/papers/lms.pdf

の4節(特に定理4.3)には、かなり限定的な条件ではあるが、dual pairの簡約相空間と余随伴軌道の対応について、証明がある(1990年頃のものなので、今ではもっと一般的な事実が知られていてもよさそうではある)。Kepler系の相空間が、極小軌道となることも、こうした事実の一類型となっている。



余談。Segal-Shale-Weil表現は、symplectic代数の表現としては既約表現になってない点に不満がある。Heisenberg代数とsymplectic代数の半直積を考えるという道もありそうではある。群としては、シンプレクティック群とHeisenberg群の半直積を考えることになり、この群はJacobi群という名前が付いている。Jacobi群という名前は

Jacobi group

https://en.wikipedia.org/wiki/Jacobi_group

によると、EichlerとZagierによる命名らしい。彼らはJacobi形式の研究のために、使ったとか。物理の方では、squeezed stateをJacobi群のgeneralized coherent statesとして理解できる、と書いている人がいる。私は、量子光学を知らないので、squeezed状態が何か知らないし、これが妥当なのかも確認していない(Segal-Shale-Weil表現は、Jacobi群の表現としては当然射影表現にしかならない)

Generalized squeezed states for the Jacobi group

https://arxiv.org/abs/0812.0717

The Jacobi group and the squeezed states - some comments

https://arxiv.org/abs/0910.5563



余談その2。私は全然興味がないけど、テータ関数の変換公式をWeil表現から導出するという話があったりするらしい

リー群の表現から見たテータ関数

http://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/48222

で、主に、$SL(2,R)$の場合に絞って考え方を理解しやすく解説してくれている


調和振動子は量子力学の模型としては簡単で面白くもない部類のものだけど、振動子表現は、表現論的になかなか面白いものである。


その他の初等的な可積分系について。

まず、(massiveな)自由粒子。自由粒子は教科書の最初に出てくる最も簡単な系にも関わらず、表現論的に理解するのは、それほど自明ではない。明らかに重要な代数として、(非相対論的な場合には)ガリレイ代数、(相対論的な場合には)ポアンカレ代数がいる。こいつらは、Hamiltonianと可換でない演算子(Galilean boost,Lorentz boost)を含み、対称性代数をこれらの部分代数と考えることができる。一方、Wignerの仕事によって、粒子状態の空間は、ガリレイ代数/ポアンカレ代数の既約ユニタリー表現と理解できるはずで、これを対称性代数に制限した時の既約分解を考えると、エネルギー固有状態に対応する表現が得られると予想される。エネルギースペクトルが離散的でないことから、分岐則は、直和の形ではなく直積分の形になると思われる。


#ガリレイ代数は、粒子の質量と関連する中心拡大を持つ。相空間に作用する幾何学的変換としては、この項は見えない。波動関数の変換としては、位相の回転と関連し、ガリレイ群の射影表現を考える必要があることの表れでもある。まぁ、群で考えると、計算が面倒になるだけで特にメリットもないのでry


#masslessな自由粒子としては、光子が代表的であるけども、これについては

Maxwell方程式の表現論(1)(2)

http://d.hatena.ne.jp/m-a-o/20150621#p1

http://d.hatena.ne.jp/m-a-o/20151106#p2

で書いたものに相当する。これらは量子力学系に相当するけど、対応する古典論は"幾何光学"と呼ばれるべきものである。通常の意味の幾何光学と同一なのか知らないけど、正準理論の起源が幾何光学にあった(らしい)ことを思うと、面白い。またmasslessなスカラー粒子は、素粒子として存在するのか知らないけど、対応する既約ユニタリー表現は、水素原子の束縛状態全体の空間と同じである。masslessスカラー粒子の場合と、水素原子の場合では、Hamiltonianは異なるので、対称性と分岐則も異なる


個人的に、よく分からない例として、自由剛体がある。可積分なコマとしては、Euler top,Lagrange top,Kovalevski topがあるけど、特にEuler topを理解したい。この系はHamiltonian以外に1つの保存量を持つLiouville可積分系であり、古典的には、楕円関数を使って解を書ける。量子論の場合、明らかに、$so(3)$の既約ユニタリー表現空間に作用し、それは全て有限次元空間なので、Hamiltonianの行列要素を具体的に書くことができ、原理的には解ける。とはいえ、有限次元空間に作用しているから解けますというのでは、Heisenberg模型(XXX模型)なんかも自明ということになってしまう。

Lamé equation, quantum top and elliptic Bernoulli polynomials

https://arxiv.org/abs/math-ph/0508068

なんかは、quantum Euler topの面白さと非自明さが現れているのでないかと思う。Euler topは、調和振動子や量子Kepler系のように、Lie環の表現の分岐則を見れば殆どの情報が得られるというような、単純な話にはなっていない。

また、以下のようなRisa/Asirコード書いて計算すると、半整数スピン(Nが偶数)の時は、ハミルトニアンの固有多項式がF(x)^2の形に因数分解できるらしい。つまり、理由はわからないけど、半整数スピンの時は、全ての固有状態が二重に縮退している。不思議なことである

N=5;  /*  2s+1  */

Emat = newmat(N,N);
Fmat = newmat(N,N);
Hmat = newmat(N,N);

Umat = newmat(N,N);

for(I=0;I<N-1;I++){
   Emat[I][I+1] = I+1;
   Fmat[I+1][I] = N-I-1;
   Hmat[I][I] = (N-1-2*I);
   Umat[I][I] = 1;
}
Hmat[N-1][N-1] = -(N-1);
Umat[N-1][N-1] = 1;

S1 = Emat+Fmat;
S2 = @i*(-Emat+Fmat);
S3 = Hmat;

H = a*S1*S1+b*S2*S2+c*S3*S3;

fctr(det(H-4*x*Umat));

(量子力学の入門的な教科書には載っていないという意味で)初等的でない例として、rational Calogero-Moser模型に興味がある(trigonometricなSutherland模型も殆ど同じことになると思うけど)。この模型は、一次元空間上の相互作用する多体粒子系と説明される。表現論的には、粒子が何次元空間に住んでるとか、多体系か否かは副次的な解釈の問題に過ぎないので、どうでもいいが。1970年代はじめに、量子可積分系として発見され、1978年には、Kazhdan-Kostant-Sternbergによって、Calogero-Moser spaceという"真の相空間"が構成されている。量子系の方は、Dunkl作用素という、調和振動子に於ける生成・消滅演算子のようなものを導入して解かれる。Dunkl operatorは1980年代終わり頃発見されたものだけど、90年代以降も、非常に多くの研究があり、多くの一般化や様々な代数との関連が議論されている。

The Quantum Calogero-Moser Model: Algebraic Structures

https://www.jstage.jst.go.jp/article/jpsj1946/62/9/62_9_3035/_article

Integrability and algebraic structure of the quantum Calogero-Moser model

http://www.sciencedirect.com/science/article/pii/0960077993900497

Exact Solvability of the Calogero and Sutherland Models

https://arxiv.org/abs/hep-th/9506105

Lectures on Calogero-Moser systems

https://arxiv.org/abs/math/0606233

Dunkl operators: Theory and applications

https://arxiv.org/abs/math/0210366

SBMLによる生化学ネットワークの記述と計算

SBMLは、Systems Biology Markup Languageの略。シグナル伝達や代謝系などの生化学ネットワークのモデルを形式的に記述するXML仕様で、2000年頃から継続的に策定と改訂が行われているらしい。生物分野で古典的な数理モデルといえば、酵素反応速度論(Michaelis-Menten式etc.)、Hodgkin-Huxley方程式、Turingの反応拡散系などがあるけど、前の2つは、SBMLで記述されるモデルのプロトタイプと言っていいと思う。これらのモデルは、数個の変数しかない単純なモデルだけど、最近では細胞内の生化学ネットワークを調整する遺伝子たちが沢山同定されて、複雑な生化学ネットワークを、そのままモデル化して調べるという道ができた。


その極致として、2012年に、500個の遺伝子を持つ細菌マイコプラズマの全細胞シミュレーションが行われている

A whole-cell computational model predicts phenotype from genotype.

https://www.ncbi.nlm.nih.gov/pubmed/22817898

いずれ、線虫(細胞数1000、遺伝子数20000弱)くらいの生物で全細胞シミュレーションができれば面白いと思うけど、全ての要素をモデル化するだけでも大変そう(マイコプラズマの場合でも、シミュレーションの結果から新しい酵素が見つかったとかあったようだし)


#関連する話題として、最近、RIKENで同じくマイコプラズマの全原子分子動力学シミュレーションを行ったという報告があった

バクテリア細胞質の全原子分子動力学計算(プレスリリース)

http://www.riken.jp/pr/press/2016/20161101_3/

こっちは、20nsを数カ月かけて計算するというものらしいので、計算量的に何かへ応用するというには、難しいけれど。


More Detailed Summary of SBML

http://sbml.org/More_Detailed_Summary_of_SBML

に、もう少し詳しいSBMLの説明と、ミカエリス・メンテン型酵素反応の例が載っている。


既に知られているモデルの場合は、SBMLを

BioModels Database

http://www.ebi.ac.uk/biomodels-main/

とかから見つけてこれるかもしれない。Curatedでないモデルは色々ダメなことが多いっぽいので、使えるモデルは600ちょっとと思っておいたほうがよさげではある。まぁ、この手のシミュレータを実装すること自体は、難しいことでもないと思うけど、何気にパラメータが多くて、論文などから適切な値を探すのが面倒だったりするので、モデルをまとめて公開してくれているとありがたい。


SBMLのシミュレータはいくつも公開されている。

SBML Software Matrix

http://sbml.org/SBML_Software_Guide/SBML_Software_Matrix

にソフトウェアのリストがある。libSBMLとかあるけど、こいつにはシミューレション機能とかはなく、SBMLファイルの読み書きをするだけで、割とどうでもいい。対応しているSBMLのバージョン、実装されている機能や計算速度、継続的にメンテナンスがされているのかなどを考慮して決めたいのだけど、いまいちよく分からないので、自分で実装した方が早そうであった



最も単純な利用法は、常微分方程式系に変換してソルバーに投げるというのだと思う。細胞は非常に小さく、分子種によっては分子数が非常に少ない場合があり、ゆらぎが無視できない場合もあると考えられており、その場合は確率モデルを用いる必要があると考えられている。その他にも、目的に応じて、適用したい解析手法は多数あると思う。

自分でシミュレータを実装する場合は

SBML Test Suite

http://sbml.org/Software/SBML_Test_Suite

から、テストデータやらを引っ張ってこれるっぽいので、確認用に使える。



例として、カルシウム振動のモデル

http://www.ebi.ac.uk/compneur-srv/biomodels-main/BIOMD0000000184

を使う。アストロサイトにおけるカルシウム振動の(多分最も単純な)モデル。変数としては細胞質のカルシウム濃度とIP3(イノシトール3リン酸)濃度と、ERのカルシウムの濃度。

(1)細胞外から細胞内へのCa2+の流入及び流出

(2)ERから細胞質へのカルシウムの放出(IP3受容体を介するもの)

(3)細胞質からERへのカルシウムの浸透

(4)ERから細胞質へのカルシウムの漏れ

(5)IP3の合成(カルシウム濃度依存。ホスホリパーゼCの活性がカルシウムによる調節を受けるらしい)

(6)IP3の分解

が考慮される。3つの変数が振動を起こすことが確認できる。計算結果では、振動周期は3分程度である。これが、カルシウム振動のモデルとして適切なのかどうかは不明


とりあえず、これくらいのモデルがPython(+numpy/scipy/matplotlib)で動くようにした

・多分、2.7と3.5の両方で動く

・Test Suiteは通してないし、仕様の確認もしてないので、仕様を網羅もしてないと思う

・凄く遅い


いうて、常微分方程式やし、簡単にできると思ったが、色々面倒くさいことがわかった。とりあえずミカエリス・メンテン型反応とカルシウム振動の計算結果を貼っておく

f:id:m-a-o:20161117232853p:image:w360

f:id:m-a-o:20161117232851p:image:w360

from scipy.integrate import ode
import xml.etree.ElementTree as et
import math
from numpy import prod


def sbml_root_fn(xs):
    if len(xs)==1:
        return math.sqrt(xs[0])
    elif len(xs)==2:
        return math.pow(xs[1] , 1.0/xs[0])
    else:
        assert(False),"invalid argument in sbml_root_fn:{}".format(str(xs))

class Closure:
    def __init__(self , _vars , fnbody):
        self.vars = _vars
        self.fndef = fnbody
        self.env = {}
    def __call__(self , args):
        assert(len(args)==len(self.vars)),"invalid closure call"
        saved_env = {}
        for (key,val) in zip(self.vars , args):
            if key in self.env:
                saved_env[key] = self.env[key]
            self.env[key] = val
        ret = eval_math(self.fndef , self.env)
        for key in self.vars:
            del self.env[key]
        for (key,val) in saved_env.items():
            self.env[key] = val
        return ret


def parse_math(e):
    def parse_cn(e):
       assert(e.attrib.get('type',None)!="rational"),"rational cn@parse_cn"
       return eval(e.text)
    def parse_apply(es):
       fn = None
       args = []
       for e0 in es:
          _ , tagname  = e0.tag.split('}')
          if tagname=="plus":
              fn = (lambda x:x[0]+x[1])
          elif tagname=="minus":
              fn = (lambda x:x[0]-x[1])
          elif tagname=="divide":
              fn = (lambda x:x[0]/x[1])
          elif tagname=="times":
              fn = (lambda x:prod(x))
          elif tagname=="power":
              fn = (lambda x:math.pow(x[0],x[1]))
	  elif tagname=="exp":
	      fn = (lambda x:math.exp(x[0]))
          elif tagname=="root":
              fn = sbml_root_fn
          elif tagname=="apply":
              args.append( parse_math(e0) )
          elif tagname=="degree":
              assert(fn==sbml_root_fn)
              assert(len(e0.getchildren())==1),"error in parse_apply@degree"
              e1 = e0.getchildren()[0]
              _ , tagname1  = e1.tag.split('}')
              if tagname1=="ci":
                 args.append( e1.text.strip() )
              elif tagname1=="cn":
                 assert(e0.attrib.get('type',None)!="rational"),"rational cn@parse_math"
                 args.append( eval(e1.text) )
              else:
                 assert(False),"failed to parse degree"
          elif tagname=="ci":
              if fn!=None:
                  args.append( e0.text.strip() )
              else:
                  fn = e0.text.strip()
          elif tagname=="cn":
              assert(e0.attrib.get('type',None)!="rational"),"rational cn@parse_math"
              args.append( eval(e0.text) )
          else:
              assert(False),"@parse_math:unknown tag {}".format(tagname)
       assert(fn!=None),et.tostring(es)
       return (fn,args)
    def parse_lambda(es):
       varnames = []
       for e0 in es:
          _ , tagname  = e0.tag.split('}')
          if tagname=="bvar":
              for it in e0.getchildren():
                  varnames.append( it.text.strip() )
          elif tagname=="apply":
              fnbody = parse_apply(e0.getchildren())
              return Closure(varnames , fnbody)
          else:
              assert(False),"unknown tag name@parse_lambda:{}".format(tagname)
    _ , tagname  = e.tag.split('}')
    if tagname=="math":
         assert(len(e.getchildren())==1),"error in parse_math"
         return parse_math(e.getchildren()[0])
    elif tagname=="lambda":
         return parse_lambda(e.getchildren())
    elif tagname=="apply":
         return parse_apply(e.getchildren())
    elif tagname=="cn":
         return parse_cn(e)
    else:
         assert(False),"unknown tagname@parse_math:{}".format(tagname)


def eval_math(e , env):
   if type(e)==tuple:
      fn,_args = e
      args = [eval_math(x,env) for x in _args]
      if type(fn)!=str:
          return fn(args)
      else:
          closure = env[fn]
          closure.env = env
          return closure(args)
   elif type(e)==str:
      if e in env:
          return env[e]
      else:
          assert(False),"Unknown variable in env:{}".format(e)
   else:
      return e



class Model:
   def __init__(self):
      self.args = []
      self.species = []
      self.namemap = {}
      self.env = {}
      self.reactions = []
      self.compartment = {}
      self.rules = {}
   def values(self):
      ret = []
      for key in self.args:
          v = self.env[key]
	  if type(v)==float or type(v)==int:
             ret.append( self.env[key] )
          else:
	     ret.append( eval_math(v ,self.env) )
      return ret
   def __call__(self , t , y):
      assert(len(y)==len(self.args)),"invalid input"
      ret = [0.0 for _ in y]
      for (name,val) in zip(self.args , y):
          self.env[name] = val
      rest = self.rules.keys()
      Nmax = len(rest)
      #-- process assignment rules
      for _ in range(Nmax):
          if len(rest)==0:break
          for (key,sm) in self.rules.items():
	      if key in rest:
	         try:
	            self.env[key] = eval_math(sm , self.env)
		    rest.remove(key)
		 except:
		    pass
      #-- process reactions and rate rules
      for (reactants , products , sm , local_env) in self.reactions:
          saved_env = {}
          for key,val in local_env.items():
              if key in self.env:
                 saved_env[key] = self.env[key]
              if type(val)==str:
                 self.env[key] = self.env[val]
              else:
                 self.env[key] = val
          try:
              v = eval_math(sm , self.env)
          except:
              assert(False),("failed to evaluate math expresion",sm)
          for r in reactants:
	      try:
                 idx = self.args.index(r)
	         if r in self.compartment:
                     ret[idx] -= v/self.env[self.compartment[r]]
	         else:
	             ret[idx] -= v
	      except:
	         pass
          for r in products:
	      try:
                 idx = self.args.index(r)
	         if r in self.compartment:
                     ret[idx] += v/self.env[self.compartment[r]]
	         else:
	             ret[idx] += v
	      except:
	         pass
          for key in local_env:
              del self.env[key]
          for key,val in saved_env.items():
              self.env[key] = val
      return ret


def readsbml(root):
   ns = {'sbml' : root.tag[1:-5] , 'mml':"http://www.w3.org/1998/Math/MathML"}
   ret = Model()
   for it in root.find('.//sbml:listOfCompartments' , namespaces=ns).getchildren():
       key,value = it.attrib['id'] ,float( it.attrib['size'] )
       ret.env[key] = value
   for it in root.find('.//sbml:listOfSpecies' , namespaces=ns).getchildren():
       if it.attrib.get('boundaryCondition' , 'false')!='true':
           ret.args.append( it.attrib['id'] )
       if 'name' in it.attrib:
           ret.species.append( it.attrib['name'] )
	   ret.namemap[ it.attrib['id'] ] = it.attrib['name']
       else:
           ret.species.append( it.attrib['id'] )
	   ret.namemap[ it.attrib['id'] ] = it.attrib['id']
       ret.compartment[ it.attrib['id'] ] = it.attrib['compartment']
       if "initialAmount" in it.attrib:
            vol = ret.env[it.attrib["compartment"]]
            key,val = it.attrib['id'] , float(it.attrib['initialAmount'])/vol
            ret.env[key] = val
       elif "initialConcentration" in it.attrib:
            vol = ret.env[it.attrib["compartment"]]
            key,val = it.attrib['id'] ,  float(it.attrib['initialConcentration'])
            ret.env[key] = val
       else:
            pass
   for it in root.findall('.//sbml:listOfParameters' , namespaces=ns):
       for r in it.getchildren():
           if 'value' in r.attrib:
               ret.env[ r.attrib['id'] ] = eval(r.attrib['value'])
   for it in root.findall('.//sbml:functionDefinition' , namespaces=ns):
       fndef = it.find('.//mml:math' , namespaces=ns)
       key = it.attrib['id']
       if fndef!=None:
           fn = parse_math(fndef)
           ret.env[key] = fn
   listOfInitialAssignments = root.find('.//sbml:listOfInitialAssignments' ,  namespaces=ns)
   if listOfInitialAssignments!=None:
       for it in listOfInitialAssignments.getchildren():
           varname = it.attrib['symbol']
	   ret.env[varname] = eval_math(parse_math(it.getchildren()[0]) , ret.env)
   listOfRules = root.find('.//sbml:listOfRules' , namespaces=ns)
   if listOfRules!=None:
       for it in listOfRules.getchildren():
           _ , tagname  = it.tag.split('}')
           key = it.attrib['variable']
	   if tagname=="assignmentRule":
	       rule = parse_math(it.getchildren()[0])
	       ret.rules[key] = rule
	   else:
	       ret.args.append( key )
	       ret.reactions.append( ([] , [key] , parse_math(it.getchildren()[0]) ,{}) )
   for r in root.find('.//sbml:listOfReactions' , namespaces=ns).getchildren():
       reactants = []
       products = []
       local_env = {}
       listOfReactants = r.find('.//sbml:listOfReactants' , namespaces=ns)
       if listOfReactants!=None:
           for it in listOfReactants.getchildren():
               reactants.append( it.attrib['species'] )
               if 'id' in it.attrib:
                    local_env[ it.attrib['id'] ] = it.attrib['species']
       listOfProducts = r.find('.//sbml:listOfProducts' , namespaces=ns)
       if listOfProducts!=None:
           for it in listOfProducts.getchildren():
               products.append( it.attrib['species'] )
               if 'id' in it.attrib:
                    local_env[ it.attrib['id'] ] = it.attrib['species']
       listOfModifiers = r.find('.//sbml:listOfModifiers' , namespaces=ns)
       if listOfModifiers!=None:
           for it in listOfModifiers.getchildren():
               if 'id' in it.attrib:
                    local_env[ it.attrib['id'] ] = it.attrib['species']
       listOfLocalParameters = r.find('.//sbml:listOfLocalParameters' , namespaces=ns)
       if listOfLocalParameters!=None:
           for it in listOfLocalParameters.getchildren():
               local_env[ it.attrib['id'] ] = eval(it.attrib['value'])
       sm = r.find('.//mml:math' , namespaces=ns)
       ret.reactions.append( (reactants , products , parse_math(sm) , local_env) )
   return ret


try:  #-- python2
   from urllib2 import urlopen
except: #-- python3
   from urllib.request import urlopen


import matplotlib.pyplot as plt


def runsbml(path , t0 , t1, dt):
   try:
      root = et.parse(path).getroot()
   except:
      req = urlopen(path)
      s = req.read()
      root = et.fromstring(s)
   m = readsbml(root)
   r = ode(m, None).set_integrator('vode', method='bdf', nsteps=1500 , with_jacobian=False)
   r.set_initial_value(m.values() , t0)
   res = []
   times = []
   while r.successful() and r.t < t1:
      _ = r.integrate(r.t+dt)
      times.append( r.t )
      res.append( r.y )
   for n,name in enumerate(m.args):
      dat = [x[n] for x in res]
      plt.plot(times , dat , label=m.namemap[name])
   plt.legend()
   plt.show()


if __name__=="__main__":
 #-- calcium oscillation
  runsbml("http://www.ebi.ac.uk/compneur-srv/biomodels-main/download?mid=BIOMD0000000184" , 0.0 , 2000.0 , 0.5)

2016-10-10

水素原子の表現論(1.5-2)spectrum generating algebra

前回の補足など。


前回、極小表現上で消えるU(so(4,2))の元全体をJosephイデアルと呼んでしまったけど、Josephイデアルの(数学者が一般的に採用する)定義は、複素単純Lie代数の普遍展開環のcompletely prime primitive idealであって、so(4,2)は複素単純ではないし、Josephイデアルは、A型"以外の"複素単純Lie環では一意に決まるが、A型の複素単純Lie環ではwell-definedではない。so(4,2)は複素化すると、so(6,C)であるが、これはsl(4,C)と同型なので(実形で見れば、so(4,2)とsu(2,2)の同型がある)、U(so(6,C))のJosephイデアルは、上の意味では定義されないことになる。

Josephイデアルのこの定義は、Josephのオリジナルの論文で採用されている定義でもあり、

The minimal orbit in a simple Lie algebra and its associated maximal ideal

https://eudml.org/doc/81975

前回の最後に書いたGarfinkleの論文の結果

A new construction of the Joseph ideal

https://dspace.mit.edu/handle/1721.1/15620#files-area

も、今回の問題では使えない。


#結局今回は不要になったので、ちゃんと読んでないのだけど、Josephイデアルの一意性証明にはgapがあると、以下の論文に書いてある(新しい証明も)

UNIQUENESS OF JOSEPH IDEAL

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.153.6344&rank=1


いつからminimal representationという名前が一般的になったのか分からないけど、極小表現の"極小"という名前の由来は、極小冪零軌道の量子化と見なせる/見なしたいという気持ちから来ているのだと思う(Gelfand-Kirillov次元が最小という意味もあるかもしれない)。このへんの問題意識と事情は、Josephイデアルの論文のIntroductionにも書かれている。タイトルの"minimal orbit"=極小軌道というのは、(自明な軌道以外で)次元が最小という意味で、A型以外の場合は、半単純軌道も含めて一つしかなく、極小冪零軌道と同じもので、A型の場合は、冪零軌道の中で次元が最小のもの=極小冪零軌道が一意に存在するが、極小冪零軌道と次元が等しい半単純軌道が無数に存在する。


現在、A型以外の複素単純Lie環では、annihilatorがJosephイデアルであることを以て、極小表現を定義することも、しばしばある。この定義だと、A型の場合は、極小表現が定義されないことになってしまうが、A型の場合もこれが極小表現だというのはあって、ただ、統一的かつ自然に見える定義というのがない(極小冪零軌道の量子化とは何かというのが、きちんと定義されて、それで定義するというのが王道だろうとは思う)

The Uniqueness of the Joseph Ideal for the Classical Groups

https://arxiv.org/abs/math/0512296

という論文では、(A_1以外の場合に)Josephイデアルを定義している(Josephイデアルが定義できれば、そのannihilatorが極小表現であるという定義を、拡張できる)。生成元を明示的に与えるということをやってのけていて、スマートな定義とはいいがたいけど、計算には使いやすい。極小冪零軌道の変形量子化を考えている人もいて、その場合も、$A_1$型を除く$sl(n,C)$で変形量子化は一意であるらしい(例えば、arXiv:math/0010257)


#極小表現が極小冪零軌道の量子化という時は、"幾何学的量子化"と同じ意味で、極小表現は量子力学の波動関数の空間に相当する。極小冪零軌道の変形量子化を考えるときは、与えられるのは、物理的な言い方では、波動関数ではなく、物理量の代数の方になる


水素原子の束縛状態を考えている今は、具体的な表現は分かっていて、そのannihilatorの生成元を知りたいだけなので、Josephイデアルとか極小表現の定義は重要ではないけれど、用語としては、そんな感じで、ちょっと揺れがある。



本題。色々論文を眺めていたら、Josephの論文

Minimal realizations and spectrum generating algebras

https://projecteuclid.org/euclid.cmp/1103859776

は、Josephイデアルや極小表現と深く関連する、"量子化運動量写像"(今の場合、局所化したWeyl代数への環準同型写像)を構成していて面白かった。abstractには、"与えられた半単純Lie環が入るような自由度最小の量子力学系の決定"云々と書かれていて、タイトルの"minimal realizations"とは、このことを指す。


この論文の5章に、「運動量空間に於ける水素原子のspectrum generating algebraの実現」というものが与えられている。論文通り計算すると、Chevalley生成元は、以下の式で与えられる

$e_1 = q_1$

$e_2 = q_2 p_1$

$e_3 = q_3 p_2$

$h_1 = -2 q_1 p_1 - q_2 p_2 - q_3 p_3$

$h_2 = q_1 p_1 - q_2 p_2$

$h_3 = q_2 p_2 - q_3 p_3$

$f_1 = -(q_1 p_1 + q_2 p_2 + q_3 p_3)p_1$

$f_2 = q_1 p_2$

$f_3 = q_2 p_3$

論文に書いてある通り、これによって、sl(4,C)の(3変数)多項式環への作用が与えられるけども、極小表現は、この多項式環の中で実現されるわけではない。


上記の量子化運動量写像(Lie環の普遍展開環からWeyl代数への環準同型。普通の運動量写像がLie環の対称代数からPoisson代数へのPoisson準同型を与えることの類似)には、当然、対応して、古典的な運動量写像も存在し、その像は極小冪零軌道の閉包になってるのじゃないかと期待したい。次元を数えると、sl(3,C)の極小冪零軌道は4次元であり、相空間の方の次元(=Weyl代数の生成元の数)も4だから一致している。同様に、$sl(4,C)$の極小冪零軌道は6次元であり、相空間の方の次元も6で一致する。これらは、次元最小の軌道ではあるが、sl(n,C)の場合は、半単純な次元最小の軌道(極小軌道)が存在するので、次元の勘定だけで、像が極小冪零軌道であるとは言えない。


しかし、変数$q_i,p_j$を消去してやれば、像(の閉包)の定義方程式は得ることができるし、極小冪零軌道の定義方程式も群作用をexplicitに書いて、変数消去すれば直接計算で得られる。闇雲に変数を消去しても、同じ定義式が出るとは限らないので、被約グレブナー基底を計算して比較するのがいい。グレブナー基底による変数消去計算については、グレブナー基底の演習問題


#冪零軌道の次元については、例えば、$sl(4)$の場合、Collingwood,McGovern "Nilpotent Orbits In Semisimple Lie Algebra"の4.3節などに、そのまま書いてある


まず、Chevalley生成元以外の基底、他のCartan-Weyl basisを、以下のように

$e_4 = [e_1 , e_2]$

$e_5 = [e_2 , e_3]$

$e_6 = [e_1 , e_5]$

$f_4 = [f_1 , f_2]$

$f_5 = [f_2 , f_3]$

$f_6 = [f_1 , f_5]$

で定義する。それぞれ対応するCartan部分環の元は

$h_4 = [e_4 , f_4] = -(h_1+h_2)$

$h_5 = [e_5 , f_5] = -(h_2+h_3)$

$h_6 = [e_6 , f_6] = h_1+h_2+h_3$

のようになる。


これらの準備の下で、以下のRisa/Asirコードによって、$sl(3)$と$sl(4)$のそれぞれの場合で、運動量写像の像(の閉包)の定義方程式を具体的に得ることができる(この計算は、手元の貧弱なノートPCでも一瞬で終わる)

/* Josephの運動量写像のkernelの計算 */

load("noro_pd.rr");
/* sl(3)-case */
B = [e1-q1 , e2-q2*p1 , e3-q2 , h1+2*q1*p1+q2*p2 , h2-q1*p1+q2*p2 , 
     f1+q1*p1*p1+q2*p1*p2 , f2-q1*p2 , f3+(q1*p1+q2*p2)*p2];
V = [q1,q2,p1,p2,e1,e2,e3,h1,h2,f1,f2,f3];
G = nd_gr_trace(B,V,1,1,[[0,4],[0,8]]);
D = noro_pd.elimination(G,[e1,e2,e3,h1,h2,f1,f2,f3]);


/* sl(4)-case */
B = [e1-q1 , e2-q2*p1 , e3-q3*p2 , e4-q2 , e5-q3*p1 , e6-q3 ,
     h1+2*q1*p1+q2*p2+q3*p3 , h2-q1*p1+q2*p2 , h3-q2*p2+q3*p3,
     f1+(q1*p1+q2*p2+q3*p3)*p1,f2-q1*p2,f3-q2*p3 , f4-(q1*p1+q2*p2+q3*p3)*p2 , f5+p3*q1 , 
     f6+(q1*p1+q2*p2+q3*p3)*p3];
V = [q1,q2,q3,p1,p2,p3,e1,e2,e3,e4,e5,e6,h1,h2,h3,f1,f2,f3,f4,f5,f6];
G = nd_gr_trace(B,V,1,1,[[0,6],[0,15]]);
D = noro_pd.elimination(G,[e1,e2,e3,e4,e5,e6,h1,h2,h3,f1,f2,f3,f4,f5,f6]);

$sl(3)$の場合は11本の斉次式が、そして$sl(4)$の場合は44本の斉次式が、被約グレブナー基底として出てくる。極小冪零軌道の定義方程式を計算しなくても、斉次式になってる時点で、冪零だって分かるし、後は上に書いたように次元勘定から、極小冪零軌道だと分かる


一応、念のため、$sl(3)$の場合、極小冪零軌道(の閉包)の定義方程式(の被約グレブナー基底)は、以下のRisa/Asirコードで得られる。これは、上の計算結果と一致する

/* defining equations for a minimal nilpotent orbit of sl(3) */
load("noro_pd.rr");

A = newmat(3,3,[[a11,a12,a13],[a21,a22,a23],[a31,a32,a33]]);   /* SL(3) */

M = (invmat(A)[0])*newmat(3,3,[[0,1,0],[0,0,0],[0,0,0]])*A;   /* orbit */

B = [e1 - 6*M[1][0] , e2 - 6*M[2][1] , e3-6*M[2][0] ,
     h1-12*M[0][0]-6*M[2][2] , h2+12*M[2][2]+6*M[0][0] , 
     f1-6*M[0][1] , f2-6*M[1][2] , f3-6*M[0][2] , det(A)-1];
V = [a11,a12,a13,a21,a22,a23,a31,a32,a33,e1,e2,e3,h1,h2,f1,f2,f3];
G = nd_gr_trace(B,V,1,1,[[0,9],[0,8]]);
D2 = noro_pd.elimination(G,[e1,e2,e3,h1,h2,f1,f2,f3]);

つまり、Josephの論文のminimal realizationの自由度というのは、Lie環の極小軌道の次元の半分となる。半分なのは、自由度=配位空間の次元で、極小軌道の次元=相空間の次元だから、ということで、極小軌道を量子化すれば、求めるminimalな"量子力学系"が得られる。よかった。


Hamiltonianが得られるわけではないので、"量子力学系"というのは、やや違和感があるけど、古典的には、相空間の構造が明らかになるという状況に対応する。冪零軌道はsymplectic等質多様体となっているという意味で、かなり特殊な相空間であるといえる(一般のsymplectic等質多様体と余随伴軌道の関係は、 Kirillov-Kostant-Souriau Theorem)


実際のKepler問題でも、群$SO(4,2)$はKepler多様体に推移的に作用して、相空間はsymplectic等質多様体となっている。spectrum generating algebraは相空間のsymplectic構造を保つ幾何学的対称性だというのが、一つの解釈になる。実際には、symplectic等質多様体でない相空間の方が普通なので、この解釈は狭すぎる。spectrum generating algebraは相空間上の関数環を量子化した代数(短くて的確な呼称が欲しい)で、相空間がsymplectic等質多様体の場合は、その代数は、Lie環の普遍展開環の商として得られると理解するほうが一般性があるのだと思う。Hamiltonianの与え方は色々な可能性があり可積分になるとは限らない


# 元々、素朴にはKepler問題は、3次元Euclid空間を配位空間としている(原点では、ポテンシャルが発散するので、原点を除きたければ除く)。相空間は、素朴には、これの余接空間。$SO(4,2)$をこの相空間に作用させた場合、行き先がwell-definedでないことは起こりうる(実際、どうなってるのか知らないけど)。似たような状況として、共形変換群のEuclid空間やMinkowski空間への作用で、特殊共形変換の行き先は"無限遠点"の場合がある。共形変換群は、数学的に厳密にはEuclid空間やMinkowski空間に推移的に作用しない。が、原点を動かさない部分群全体は分かるので、共形変換群を、そのような部分群で割ってやると、等質空間が得られる。こうした操作は、共形コンパクト化と呼ばれ、4次元Euclid空間の共形コンパクト化はS^4となる。Kepler問題の相空間の場合も、事情は同じようなことと思う。可積分系界隈では、物理とかで扱う素朴な相空間と、数学的に自然な相空間が、若干異なるということは、時々ある(けど、明示的に事情を説明してくれていることは少ない)


# ところで、水素原子の場合、包合的な第一積分は、丁度3つある($so(4)$のCartan部分環から2つとHamiltonian自身)。これらは独立なので、Kepler系はLiouvilleの意味で可積分。ところが、水素原子が3自由度という結論は古典的な場合からの推測であって、$so(4,2)$の極小表現とか一般の既約ユニタリー表現を、ぽっと与えても、その自由度は定義から明らかなものではない。妄想の一つとして、Gelfand-Kirillov次元で自由度を定義するということが考えられる。定義するのは自由で、Liouville-Arnoldの定理の量子力学版を示すというようなことをやらないと意味がないけど


などと考えると、以前書いた

http://d.hatena.ne.jp/m-a-o/20140130#p1

『主量子数n+1の電子殻のヒルベルト空間は、so(4)の最高ウェイト(n,0)を持ついくつかの既約表現の直和で書けることが分かったけど、各既約表現が何個出てくるかということは、表現論的に知る方法はなくて、Schrodinger方程式を解く(あるいは、Pauliの時は、まだSchrodinger方程式がなかったのでHeisenberg方程式でやっていたようだけど)しかないように思う(状態のHilbert空間を、どう取るかは物理的な理由によって決まるべきもので、表現論の立場から決める原理はないから)』

については、水素原子の状態空間は、かなり表現論的な理由のみによって決められるのかもしれない。とはいえ、一方で、状態が束縛状態か散乱状態かは、少なくとも一見ではHamiltonianに依存する概念なので、そのへん、どう理解すればいいのか分からない



おまけ。Josephイデアルは、大雑把に言って、極小冪零軌道の定義方程式の非可換版。極小冪零軌道の定義方程式の計算は、グレブナー基底でできたので、Josephイデアルの生成元を決めるのは、非可換グレブナー基底を使えばできるだろうと考える。残念ながら、この計算は、$sl(3)$の場合ですら、3日くらい待っても終わらなかったので、断念した。

非可換グレブナー基底の実装は

[1] Bergman

http://servus.math.su.se/bergman/

[2] GAPのGBNP

http://www.gap-system.org/Packages/gbnp.html

[3] Singular

A.6.1 Left and two-sided Groebner bases

https://www.singular.uni-kl.de/Manual/4-0-3/sing_883.htm

などがある。Singularは定番。GAPは有限群メインと思ってたら、最近は半単純Lie代数計算用のパッケージとかあって、冪零軌道を扱うための諸々が入ってたりする。Bergmanは、未だに使い方が謎でよく分からないのだけど、以前どこかで見たベンチマークでは結構早かった気がする(他と違うアルゴリズムが使われていたはず)。Bergmanで計算する場合、以下のような感じ(終わらないけど)

[1]> (purelexify)
NIL
[2]> (noncommify)
NIL
[3]> (algforminput)
algebraic form input> vars q1,q2,p1,p2,h1,h2,e1,e2,e3,f1,f2,f3;
e1-q1,
e2-q2*p1,
e3-q2,
h1+2*q1*p1+q2*p2,
h2-q1*p1+q2*p2,
f1+q1*p1*p1+q2*p1*p2,
f2-q1*p2,
f3+q1*p1*p2+q2*p2*p2,
p1*q1-q1*p1-1,
p2*q2-q2*p2-1;
T
[4]> (homogeniseinput)
NIL
[5]> (groebnerinit)
NIL
[6]> (groebnerkernel)

余談と妄想。

$SU(2,2)$に付随する力学系

http://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/83876

では、4自由度の力学系の$U(1)$作用による、Hamiltonian reductionとして、Kepler系を得ている。簡約前の相空間は、"4次元Euclid空間から原点を除いた空間の余接空間で、従って、symplectic群Sp(8,R)が自然に作用している。一方、$su(2,2)$の極小表現は、Metaplectic群$Mp(8,R)$のSegal-Shale-Weil表現の部分空間上に実現されるのだった。この部分空間を定める拘束条件が、上記$U(1)$作用から定まるmoment mapが0となる条件の量子化と思える形になっている(Sp(8,R)の自然な作用に対応する運動量写像を正準量子化することによって、Segal-Shale-Weil表現は得られる)。きちんと確認したわけではないけれど、古典的には、極小冪零軌道と$U(1)$-Hamiltonian reductionの2通りの方法で、Kepler問題の相空間が得られ、表現論では、後者の構成が極小表現のladder representationによる実現と対応している形になると推測するのは自然


このHamiltonian reductionによる構成は、もうちょっと一般化できそうな気がする。多分、きちんと読んでないけど

The U(1)-Kepler Problems

https://arxiv.org/abs/0805.0833

The Sp(1)-Kepler Problems

https://arxiv.org/abs/0805.0840

あたりが、そういうことを考えているらしい。可積分系としては(初等的な表現論のみで解けてしまうので)それほど面白いわけでもないが。論文では相空間は明示的に出てこないが、(群$G$が空間$X$に自由に作用する場合)簡約相空間$T^{*}X // G$は$T^{*}(X/G)$に同型なので同じことをやっていると言える。もっと一般のdual pairに、このような構成がないかは分からない

HOL Lightの実装を理解したい(0)

理解したい。問題は、OCaml読めないことと、HOL Lightが、どういうものか微塵も分からんので、とりあえず、HOL Lightを動かしてみたメモ。ソースコード落とすと、中にTutorialがあるので適当に見れば良い気がする。


Coqと双璧をなすかどうかは知らないけど、HOL系のproof assistantは、よく見かける。Isabelle/HOLというのが一番(?)有名っぽい。こいつは

seL4という、マイクロカーネルタイプOSの形式検証

https://github.com/seL4/l4v

とかいう実績があるらしい。


HOL Lightは、

Kepler予想の証明を形式化したflyspeckプロジェクト

https://github.com/flyspeck/flyspeck

で使われたらしい。


HOL Light開発の経緯として

https://en.wikipedia.org/wiki/HOL_(proof_assistant)

には、'The second current implementation is HOL Light. This started as an experimental "minimalist" version of HOL. Although it has subsequently grown into another mainstream HOL variant, its logical foundations remain unusually simple.'と書いてある。Isabelleで書かれた証明とHOL Lightの証明は、全く似てなかったりするけど、できることは、基本的に同じと考えて、差し支えなさそう?


Towards self-verification of HOL Light

https://www.cl.cam.ac.uk/~jrh13/papers/holhol.html

の冒頭には"The HOL Light prover is based on a logical kernel consisting of about 400 lines of mostly functional OCaml, whose complete formal verification seems to be quite feasible."という一文がある。別にformal verificationしたいとは思わないのだけど、400行なら、なんか理解する気になると思った(あと、apt-get install hol-lightってしたらインストールされたので)


# HOL Lightのソースは

The HOL Light theorem prover (moved from Google code)

https://github.com/jrh13/hol-light

で公開されている。この中のfusion.mlが、『400行程度のlogical kernel』に相当する部分っぽい?コメント入れて670行くらい。冒頭で、lib.mlというのが、参照されているっぽいけど、curryだのuncurryだのの関数とか、リスト操作関連関数が定義されているだけ。Wikipediaの

HOL Light#Logical Foundations

https://en.wikipedia.org/wiki/HOL_Light#Logical_foundations

にあるのと、同じ名前の関数が定義されている(REFLとかMK_COMBとかetc.)。大体わかった(適当


HOL LightとCoqで、どういう差があるのか、よく分かってないけど、HOL Lightでは

・命題はただのブール値であり排中律が成立する

・functional exntensionalityが成立する

・選択公理も成立する(?)

・依存型はない

という感じであるらしい。



HOL Lightの例1。

# let thp= ASSUME `p:bool`;;
val thp : thm = p |- p
# let thq = ASSUME `q:bool`;;
val thq : thm = q |- q
# let thpq = CONJ thp thq;;     
val thpq : thm = p, q |- p /\ q

何をしてるかは見ればわかる。`...`は、何かtermというものになるっぽい

# let t0 = `x+1`;;
val t0 : term = `x + 1`
# `1+2`;;
val it : term = `1 + 2`

実数(というか浮動小数点数?)はダメらしい

# `3.4`;;
Exception: Failure "Unparsed input following term".

何もつけないと

# 3;;
val it : int = 3

となる。簡単な計算もできる

# (NUM_REDUCE_CONV `2 + 2`);;
val it : thm = |- 2 + 2 = 4

fusion.ml見ても、ASSUMEはあるけど、CONJはないし、NUM_REDUCE_CONVもない。CONJはbool.mlに定義されている

let CONJ =
  let f = `f:bool->bool->bool`
  and p = `p:bool`
  and q = `q:bool` in
  let pth =
    let pth = ASSUME p
    and qth = ASSUME q in
    let th1 = MK_COMB(AP_TERM f (EQT_INTRO pth),EQT_INTRO qth) in
    let th2 = ABS f th1 in
    let th3 = BETA_RULE (AP_THM (AP_THM AND_DEF p) q) in
    EQ_MP (SYM th3) th2 in
  fun th1 th2 -> substitute_proof (
    let th = INST [concl th1,p; concl th2,q] pth in
    PROVE_HYP th2 (PROVE_HYP th1 th))
  (proof_CONJ (proof_of th1) (proof_of th2));;

なるほど、よく分からん。これの少し上の方に

let AND_DEF = new_basic_definition
 `(/\) = \p q. (\f:bool->bool->bool. f p q) = (\f. f T T)`;;

というのがある。やりたいことはわかる


termの型はtype_ofで取れる

# type_of `1`;;
val it : hol_type = `:num`
# type_of `1=2`;;
val it : hol_type = `:bool`
# type_of `[1,2,3]`;;
val it : hol_type = `:(num#num#num)list`

hol_typeはfusion.mlで定義されている

  type hol_type = Tyvar of string
                | Tyapp of string * hol_type list

だと思う


自然数は最初から組み込まれているが、自分で定義する場合は、以下のようにするとできる。

# let nat_ind , nat_rec = define_type "Nat = Zero | Suc Nat";;
val nat_ind : thm = |- !P. P Zero /\ (!a. P a ==> P (Suc a)) ==> (!x. P x)
val nat_rec : thm =
  |- !f0 f1. ?fn. fn Zero = f0 /\ (!a. fn (Suc a) = f1 a (fn a))

これで、

# type_of `Zero`;;
val it : hol_type = `:Nat`
# type_of `Suc Zero`;;
val it : hol_type = `:Nat`

とか、使えるようになる。


一方、組みこまれてる奴は

# type_of `SUC`;;
val it : hol_type = `:num->num`
# mk_comb(`SUC`,`0`);;
val it : term = `SUC 0`

という感じ。


組み込みのnumの方は

# NUM_REDUCE_CONV `(SUC 0)`;;  
val it : thm = |- SUC 0 = 1

勝手に、human-friendlyな方に正規化してくれる。


帰納法。HOL LightにもCoq同様、tacticがある。forall(x:num),x+0=xは

# let thm0 = prove(`!x.x+0=x`,INDUCT_TAC THEN ASM_REWRITE_TAC[ADD_CLAUSES]);;
val thm0 : thm = |- !x. x + 0 = x

のように書ける(!はforallを表す)。proveは以下の型を持つ関数

# prove;;
val it : term * tactic -> thm = <fun>

ほとんどの(多分全ての)人類は極めてIQが低く愚かなので、複雑なケースではtacticを一発で書くのは難しい。Coqのように、subgoalを確認しながら進める場合

# g `!x.x+0=x`;;
val it : goalstack = 1 subgoal (1 total)

`!x. x + 0 = x`

# e INDUCT_TAC;;
val it : goalstack = 2 subgoals (2 total)

  0 [`x + 0 = x`]

`SUC x + 0 = SUC x`

`0 + 0 = 0`

# e (ASM_REWRITE_TAC[ADD_CLAUSES]);;
val it : goalstack = 1 subgoal (1 total)

  0 [`x + 0 = x`]

`SUC x + 0 = SUC x`

# e (ASM_REWRITE_TAC[ADD_CLAUSES]);;
val it : goalstack = No subgoals
# let thm1 = top_thm();;
val thm1 : thm = |- !x. x + 0 = x



numはnums.mlで定義されている

let NUM_REP_RULES,NUM_REP_INDUCT,NUM_REP_CASES =
  new_inductive_definition
   `NUM_REP IND_0 /\
    (!i. NUM_REP i ==> NUM_REP (IND_SUC i))`;;

let num_tydef = new_basic_type_definition
  "num" ("mk_num","dest_num")
    (CONJUNCT1 NUM_REP_RULES);;

let ZERO_DEF = new_definition
 `_0 = mk_num IND_0`;;

let SUC_DEF = new_definition
`SUC n = mk_num(IND_SUC(dest_num n))`;;

だと思う。

# num_tydef;;
val it : thm * thm =
  (|- mk_num (dest_num a) = a, |- NUM_REP r <=> dest_num (mk_num r) = r)

nums.mlのもうちょっと下の方を見ると

# prove(`_0 = 0`,REWRITE_TAC[NUMERAL]);;
val it : thm = |- _0 = 0

みたくできるのがわかる。NUMERALの定義は

# NUMERAL;;
val it : thm = |- !n. NUMERAL n = n
# type_of `NUMERAL`;;
val it : hol_type = `:num->num`

となっている。紛らわしいけど、項としてのNUMERALは、numからnumへの関数で、定理NUMERALは、単にそれが恒等関数であることを主張している。

let NUMERAL =
  let num_ty = type_of(lhand(concl ZERO_DEF)) in
  let funn_ty = mk_fun_ty num_ty num_ty in
  let numeral_tm = mk_var("NUMERAL",funn_ty) in
  let n_tm = mk_var("n",num_ty) in
new_definition(mk_eq(mk_comb(numeral_tm,n_tm),n_tm));;

なので、 `!n. NUMERAL n = n`は実際にはNUMERALの定義なのだと思う。で、`0`は内部的には`NUMERAL _0`として扱われているっぽい


tactic嫌いな人間は

# INST [`_0` ,`n:num`] (List.hd(mk_rewrites false NUMERAL []));;
val it : thm = |- 0 = _0

のようにやる。



線形代数をやることを考える。Multivariate/vector.mlに色々定義がある。realという型は、起動時点で作られている。

# needs "Multivariate/vectors.ml";;

とか打つと、何か一杯出てきて使えるようになる。で

# `!x:real^N. x dot x >= real(0)`;;
val it : term = `!x. x dot x >= real 0`

と書けるようになる。しかしNってなんだ。どっから来たんだって感じである

# types();;
val it : (string * int) list =
  [("4", 0); ("3", 0); ("2", 0); ("finite_sum", 2); ("cart", 2);
   ("finite_image", 1); ("int", 0); ("real", 0); ("hreal", 0); ("nadd", 0);
   ("char", 0); ("list", 1); ("option", 1); ("sum", 2); ("recspace", 1);
   ("num", 0); ("ind", 0); ("prod", 2); ("1", 0); ("bool", 0); ("fun", 2)]

を見てもいない。


別に、Nじゃなくてもいいらしい

# `!x:real^M. x dot x >= real(0)`;; 
val it : term = `!x. x dot x >= real 0`
# `!x:real^hoge. x dot x >= real(0)`;;
val it : term = `!x. x dot x >= real 0`

以下は、正しくない命題だが

# `!x:real^N.x dot x < real (dimindex(:N)) `;;
val it : term = `!x. x dot x < real (dimindex (:N))`

とか書ける。HOL Lightは依存型とかがないので、"forall (n:num) (u v:real^n),...."みたいなことが書けない。代わりに、(実)n次元ベクトル空間を{1,2,...,n} -> realみたいな関数と同一視する。"forall (X:Type) (u v:X->real),..."みたいには書けないけど、HOL Lightでは、forall (u v :X->real),...みたいに書いてあると、Xは型なんだなと推論してくれる仕組みがあるっぽい?(嘘かも)。考えてみると、リストを操作する関数とかで、こういう多相関数を許す仕組みがないと、辛いことになる


fusion.mlにあるmk_vartypeというのを使うと

# mk_vartype "X";;
val it : hol_type = `:X`

というのが作れる。内部的には、(Tyvar "X")という風になっているはず。"HOL Light: an overview"という論文に"HOL Light's logic is simple type theory with polymorphic type variables"と書いてあって、polymorphic type variablesというのは、このTyvarを指しているっぽい。


dimindexはcart.mlで定義されているけど

let dimindex = new_definition
`dimindex(s:A->bool) = if FINITE(:A) then CARD(:A) else 1`;;

みたいに書いてある。dimindexとかFINITEとか、直接、型を引数に取ることはできないのだけど、sets.mlで

# UNIV;;
val it : thm = |- (:A) = (\x. T)

みたいのが定義されている。で、printer.ml見ると

(* Print the universal set UNIV:A->bool as "(:A)".                           *)

とか書いてあったり。なんか、そういうtrickが使われている


そんなわけで

# `!f:A->B x:A.f(x)=f(x)`;;
val it : term = `!f x. f x = f x`

もOK.

自明だけど証明してみる

# g`!f:A->B x:A.f(x)=f(x)`;;
val it : goalstack = 1 subgoal (1 total)

`!f x. f x = f x`

# e STRIP_TAC;;
val it : goalstack = 1 subgoal (1 total)

`!x. f x = f x`

# e STRIP_TAC;;
val it : goalstack = 1 subgoal (1 total)

`f x = f x`

# e REFL_TAC;;
val it : goalstack = No subgoals

まとめ。Coq使ったことある人は、あまり戸惑うこともなさそうな感じ。実装も、かなり単純で、読めば大体分かる気がする(読んだことあるproof assistantの実装が、HOL Lightとcubical interpreterしかないけど、cubical interpreterは、それほど自明じゃない感じがある)。proof assistant使ったことない人には、あまり親切とは言えないと思う(そもそも、情報が少ない)。flyspeckの人は、なぜHOL Lightを選んだのか謎である。

2016-06-14

水素原子の表現論(1.5)spectrum generating algebra

水素原子の束縛状態全体は、Lie代数so(4,2)の極小表現になっていることが知られている。このso(4,2)は、dynamical symmetryと呼ばれたり、spectrum generating algebraと呼ばれていたりする。個人的には、ハミルトニアンと可換でないものを"symmetry"と呼ぶのは紛らわしいと思うので、spectrum generating algebraという名前を使用する。spectrum generatingというのも、いまいちな名前とは思う。そして、伝説によれば、散乱状態の全体も、同様にso(4,2)の既約ユニタリー表現になっているらしいのだけど、散乱状態の方は、出典不明で、本当かどうかも、よく分からない。


#表現論的に理解したいこととして、一つには、散乱状態の全体を、何かよい基底を見つけて、so(4,2)の作用を書きたいというのがある。もう一つは、極小表現がso(4)の既約ユニタリ表現の直和に分解できるのと同様、散乱状態の方も、エネルギー一定の状態はso(3,1)の既約ユニタリ表現をなすので、散乱状態全体は、これらの表現の直積分で書けるというようなことが期待される。知る限り、そのような説明を見たことがない


束縛状態に関しては、spectrum generating algebraの具体的な実現は分かっているし、一方で、全ての束縛状態も分かっていて、極小表現は最低ウェイト表現であるから、基底状態(1s軌道解)に対して、最低ウェイト条件と特異ベクトルが消えるという条件の成立を確認すれば、水素原子の束縛状態がso(4,2)の極小表現であるということは証明できる。so(4,2)の極小表現を、so(4)に制限した時の既約分解の仕方などは、表現論の知識のみで分かる


ところで以前、

http://d.hatena.ne.jp/m-a-o/20140130#p1

で『主量子数n+1の電子殻のヒルベルト空間は、so(4)の最高ウェイト(n,0)を持ついくつかの既約表現の直和で書けることが分かったけど、各既約表現が何個出てくるかということは、表現論的に知る方法はなくて、Schrodinger方程式を解く(あるいは、Pauliの時は、まだSchrodinger方程式がなかったのでHeisenberg方程式でやっていたようだけど)しかないように思う(状態のHilbert空間を、どう取るかは物理的な理由によって決まるべきもので、表現論の立場から決める原理はないから)』と書いた


けれどもし、

(1)spectrum generating algebraの生成元が分かって

(2)束縛状態はspectrum generating algebraの何らかの既約ユニタリー表現であるということは分かっているが

(3)にも関わらず、シュレディンガー方程式の解き方は分からない

というような人がいたとしたら、束縛状態の全体について、どのくらいのことが分かるか、考えたい。現在のところ、条件(2)とか、束縛状態の全体が何故so(4,2)の極小表現となる理由を、シュレディンガー方程式を解かずに理解する方法はないと思うけど


とりあえず考えることとして、spectrum generating algebraの生成元の間には、いくつかの非自明な代数的関係式(角運動量とRunge-Lenzベクトルが直交するというような)が成立し、それらの関係式によって、U(so(4,2))の両側イデアル$J$が決定される。この両側イデアルは、極小表現上では、当然0になるはずである。$J$が消えるような、既約ユニタリー表現は、比較的限定されるだろうと期待したい。


一方、極小表現上で消えるU(so(4,2))の元全体を考えることができ、やはり両側イデアルをなす(これにはJosephイデアルという名前が付いている)。まずは、この2つのイデアルに、どれくらいの差があるか、ということを調べたい



Kepler問題に於けるspectrum generating algebraの生成元の具体的な式は、例えば、以下の論文に書いてある

SO(4,2)‐Formulation of the Symmetry Breaking in Relativistic Kepler Problems with or without Magnetic Charges

http://scitation.aip.org/content/aip/journal/jmp/12/5/10.1063/1.1665653


簡単のため、長さをBohr半径で規格化して、プランク定数も1とすると、生成元は、以下の15個

角運動量

L_1 = -y ¥frac{¥partial}{¥partial z} + z ¥frac{¥partial}{¥partial y}

L_2 = -z ¥frac{¥partial}{¥partial x} + x ¥frac{¥partial}{¥partial z}

L_3 = -x ¥frac{¥partial}{¥partial y} + y ¥frac{¥partial}{¥partial x}

scaled Runge-Lenz vector

A_1 = -¥frac{1}{2} x (¥frac{¥partial^2}{¥partial x^2} + ¥frac{¥partial^2}{¥partial y^2} + ¥frac{¥partial^2}{¥partial z^2}) + ¥frac{¥partial}{¥partial x} ¥cdot ( x¥frac{¥partial}{¥partial x} + y ¥frac{¥partial}{¥partial y} + ¥frac{¥partial}{¥partial z}) - ¥frac{1}{2} x

A_2 = -¥frac{1}{2} y (¥frac{¥partial^2}{¥partial x^2} + ¥frac{¥partial^2}{¥partial y^2} + ¥frac{¥partial^2}{¥partial z^2}) + ¥frac{¥partial}{¥partial y} ¥cdot ( x¥frac{¥partial}{¥partial x} + y ¥frac{¥partial}{¥partial y} + ¥frac{¥partial}{¥partial z}) - ¥frac{1}{2} y

A_3 = -¥frac{1}{2} z (¥frac{¥partial^2}{¥partial x^2} + ¥frac{¥partial^2}{¥partial y^2} + ¥frac{¥partial^2}{¥partial z^2}) + ¥frac{¥partial}{¥partial z} ¥cdot ( x¥frac{¥partial}{¥partial x} + y ¥frac{¥partial}{¥partial y} + ¥frac{¥partial}{¥partial z}) - ¥frac{1}{2} z


dual Runge-Lenz vector

B_1 = A_1 + x

B_2 = A_2 + y

B_3 = A_3 + z


other generators

¥Gamma_1 = r ¥frac{¥partial}{¥partial x}

¥Gamma_2 = r ¥frac{¥partial}{¥partial y}

¥Gamma_3 = r ¥frac{¥partial}{¥partial z}

T_1 = -¥frac{r}{2}(¥frac{¥partial^2}{¥partial x^2} + ¥frac{¥partial^2}{¥partial y^2} + ¥frac{¥partial^2}{¥partial z^2}) - ¥frac{r}{2}

T_2 = x ¥frac{¥partial}{¥partial x} + y ¥frac{¥partial}{¥partial y} + z ¥frac{¥partial}{¥partial z} + 1

T_3 = -¥frac{r}{2}(¥frac{¥partial^2}{¥partial x^2} + ¥frac{¥partial^2}{¥partial y^2} + ¥frac{¥partial^2}{¥partial z^2}) + ¥frac{r}{2}


そして、Chevalley生成元を以下のように決める。

e_1 = (A_1 + L_2 + i(L_1 - A_2))/2

f_1 = (A_1 - L_2 + i(L_1 + A_2))/2

h_1 = -(A_3 + i L_3)

e_2 = i(T_1+T_2+B_3-¥Gamma_3)/2

f_2 = i(T_1-T_2+B_3+¥Gamma_3)/2

h_2 = A_3+T_3

e_3 = (A_1 + L_2 -i(L_1 -A_2))/2

f_3 = (A_1 - L_2 -i(L_1+A_2))/2

h_3 = -A_3 + i L_3

末尾に、Risa/Asirでの確認用コードを載せてある。ただし、多項式係数でない微分作用素は扱いづらいので、付加的な変数$r,r'$を使って

p_x = ¥frac{¥partial}{¥partial x} + r’ x ¥frac{¥partial}{¥partial r} - r’^3 x ¥frac{¥partial}{¥partial r’}

etc.

などとして、関係式r’ = r^{-1} , r^2 = x^2+y^2+z^2によるmoduloを取ることで、計算している


長さをBohr半径で規格化しているので、1s軌道解は、規格化定数を無視すれば、単にexp(-r)である。最低ウェイト条件と特異ベクトルが消えることを確認するのは容易い。確認すべき条件は

Maxwell方程式の表現論

http://d.hatena.ne.jp/m-a-o/20150621#p1

で書いた(極小表現は、helicity0のmassless既約表現と同じ)。

e_1 ¥phi = e_3 ¥phi = 0

f_1 ¥phi = f_2 ¥phi = f_3 ¥phi = 0

h_1 ¥phi = (h_2-1)¥phi = h_3 ¥phi = 0


ここまでが準備。それで両側イデアル$J$を計算したいし、多分、機械的に計算していくことは可能だけど、直接計算は面倒そうなので、Josephイデアルの生成元を調べて、それらは勿論極小表現の上では消える(はず)だけど、微分作用素として恒等的に消えるかどうかチェックするという手順を取ろうと思う(続く)


Josephイデアルの構造については、Garfinkleによる結果が知られている

A new construction of the Joseph ideal

https://dspace.mit.edu/handle/1721.1/15620#files-area


その他、本題とは関係ない補足

(1)Josephイデアルのassociated varietyは、極小冪零軌道の閉包になっていて、極小冪零軌道は、Kepler問題の古典的相空間とみなすことができる(散乱状態は無視している)。これには、Kepler多様体という名前がついているらしい。また、表現空間の中で、generalized coherent states全体を考えることができ、Kepler多様体と同型になると思う(要確認)

(2)Coulomb problemは、(一種の拘束条件付きの)4次元調和振動子へ変換できることが知られている(この座標変換にはKustaanheimo-Stiefel変換という名前がついているらしい。この変換は水素原子の経路積分でも使われたらしい(要確認))。数学的にみると、極小表現の4変数多項式環での実現(Segal-Shale-Weilによる?)と同じもの。この実現は

Maxwell方程式の表現論(2)Gupta-Bleuler量子化の表現論的側面

http://d.hatena.ne.jp/m-a-o/20151106#p2

にも書いてある。次数$n$の多項式が(n+1)次元で、量子数n+1の電子軌道と対応する。発見の順番とか、歴史的経緯とかは知らない(この実現自体は、sp(4,R)のmetaplectic表現を、su(2,2)に制限して得られ、metaplectic表現は、物理にinspireされて生まれたと見たことがある気がする)。Kustaanheimo-Stiefel変換はある種のmagicのように私には見えるけど、表現論的には、同じ表現を二通りの方法で実現して、その間のintertwinnerを作っているのだ、と理解できる。そのような理解を得るためには、so(4)対称性だけ見ていたのでは不十分である


(3)普遍展開環$U(so(4,2))$をJosephイデアルで割った代数$hs(4,2)$は、higher spin algebraという名前で、最近(というのは主に21世紀になってから)、物理の人が調べたりしているらしい


/**** common stuffs ****/
load("noro_pd.rr");
load("noro_matrix.rr");

def assert(V){
   if(!V){error(V);}
   return 1;
}


def appdiff_rat(P , F , V){
   N = length(V)/2;
   if(type(P)==9){  /* 分散多項式表現の時 */
      DP = dp_dtop(P, V);
   }else if(type(P)<=2){
      DP = P;
   }else{
      return;
   }
   Terms = p_terms(DP , V , 2);
   for(Ret = 0 , Terms = Terms; Terms!=[] ; Terms=cdr(Terms)){
      T = car(Terms);
      if(type(F)==9){
           Tmp = dp_dtop(F , V);
      }else{
           Tmp = F;
      }
      if(T==1){
         Ret += p_nf(DP , V , V ,0)*Tmp;
      }else{
         C = p_nf(sdiv(DP-p_nf(DP,[T],V,0) , T) , V , V , 0);  /* 単項式Tの係数 */
         for(I = 0 ; I < N ; I++){
            Deg = deg(T , V[N+I]);
            for(J = 0 ; J < Deg ; J++){
               Tmp = red(diff(Tmp , V[I]));
            }
         }
         for(I = 0 ; I < N ; I++){
            Deg = deg(T , V[I]);
            Tmp *= V[I]^Deg;
         }
         Ret += C*Tmp;
      }
   }
   return red(Ret);
}


def appdiff_complex(P , F , V){
    if(type(P)==9){
        DP = dp_dtop(P,V);
    }else{
        DP = P;
    }
    RP = real(DP);
    IP = imag(DP);
    if(type(F)<=2){
        RF = real(F);
        IF = imag(F);
    }else if(type(F)==3){ /*有理式*/
        DN_conj = conj(dn(F));
        if(DN_conj != dn(F)){
           TF = red(DN_conj*nm(F)/(DN_conj*dn(F)));
        }else{
           TF = F;
        }
        RF = red(real(nm(TF))/dn(TF));
        IF = red(imag(nm(TF))/dn(TF));
    }
    Ret = red( appdiff_rat(RP , RF , V) - appdiff_rat(IP,IF,V) );
    Ret += @i*red( appdiff_rat(IP,RF,V) + appdiff_rat(RP,IF,V) );
    return Ret;
}

/* 
微分作用Pを式Fに作用させる 
Vは変数のリスト(dp_dtopなどで使われるのと同様の形式)
*/
def appdiff(P,F,V){
    if(type(P)!=6){
        if(type(F)<=3){
           return appdiff_complex(P,F,V);
        }else if(type(F)==5){   /* vector */
           Ret = newvect(length(F));
           for(I=0;I<length(F);I++){
              Ret[I] = appdiff_complex(P, F[I] , V);
           }
           return Ret;
        }
    }else{ /*行列*/
        Sz = size(P);
        N = Sz[0];
        M = Sz[1];
        if(type(F)==5){
           Ret = newvect(N);
           for (I = 0 ; I < N ; I++){
              for(J = 0 ; J < M ; J++){
                Ret[I] += appdiff_complex(P[I][J] , F[J] , V);
              }
              Ret[I] = red(real(nm(Ret[I]))/dn(Ret[I])) + @i*red(imag(nm(Ret[I]))/dn(Ret[I]));
           }
           return Ret;
        }else if(type(F)==6){
            Sz2 = size(F);
            N2 = Sz2[0];
            M2 = Sz2[1];
            Ret = newmat(N,M2);
            for (I = 0 ; I < N ; I++){
                for(J = 0 ; J < M2 ; J++){
                    for(K = 0 ; K < M ; K++){
                       Ret[I][J] += appdiff_complex(P[I][K] , F[K][J] , V);
                    }
                }
            }
            return Ret;
        }
    }
}


def dp_weyl_matmul(A,B){
    Sz1 = size(A);
    Sz2 = size(B);
    L = Sz1[0];
    M = Sz1[1];
    N = Sz2[0];
    Ret = newmat(L,N);
    for(I = 0; I < L ; I++){
       for(J = 0 ; J < N ; J++){
          for(K = 0 ; K < M ; K++){
               Ret[I][J] += dp_weyl_mul(A[I][K] , B[K][J]);
          }
       }
    }
    return Ret;
}

/*===== end of common stuffs =====*/


/* stuffs for 3D hydrogen atom */
V=[x1,x2,x3,r,ri,d1,d2,d3,dr,dri];
X1=dp_ptod(x1,V);
X2=dp_ptod(x2,V);
X3=dp_ptod(x3,V);
R=dp_ptod(r,V);
RI=dp_ptod(ri,V);
D1=dp_ptod(d1,V);
D2=dp_ptod(d2,V);
D3=dp_ptod(d3,V);
DR = dp_ptod(dr,V);
DRI = dp_ptod(dri,V);
P1 = D1 + dp_weyl_mul(RI*X1 , DR) - dp_weyl_mul(RI*RI*RI*X1 , DRI);
P2 = D2 + dp_weyl_mul(RI*X2 , DR) - dp_weyl_mul(RI*RI*RI*X2 , DRI);
P3 = D3 + dp_weyl_mul(RI*X3 , DR) - dp_weyl_mul(RI*RI*RI*X3 , DRI);
I=gr([r*ri-1,r*r-x1*x1-x2*x2-x3*x3],V,0);
Delta = dp_weyl_mul(P1,P1)+dp_weyl_mul(P2,P2)+dp_weyl_mul(P3,P3); /* Laplacian */


/* angular momentum */
L1 = -dp_weyl_mul(X2,P3) + dp_weyl_mul(X3,P2);
L2 = -dp_weyl_mul(X3,P1) + dp_weyl_mul(X1,P3);
L3 = -dp_weyl_mul(X1,P2) + dp_weyl_mul(X2,P1);

/* check [L1,L2]=L3 , [L2,L3] = L1 , [L3,L1] = L2 */
assert(dp_weyl_mul(L1,L2)-dp_weyl_mul(L2,L1)==L3);
assert(dp_weyl_mul(L2,L3)-dp_weyl_mul(L3,L2)==L1);
assert(dp_weyl_mul(L3,L1)-dp_weyl_mul(L1,L3)==L2);

T1 = (1/2)*(-R*Delta-R);
T2 = X1*P1 + X2*P2 + X3*P3 + 1;
T3 = (1/2)*(-R*Delta+R);
/* check [T1,T2]=T3 , [T2,T3]=-T1 , [T3,T1]=T2 */
/* T1,T2,T3 generates so(2,1) */
assert(p_nf(dp_dtop(dp_weyl_mul(T1,T2)-dp_weyl_mul(T2,T1)-T3,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T2,T3)-dp_weyl_mul(T3,T2)+T1,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T3,T1)-dp_weyl_mul(T1,T3)-T2,V),I,V,0)==0);



/* scaled Runge-Lenz vector */
A1 = -(1/2)*X1*Delta + dp_weyl_mul(P1,X1*P1+X2*P2+X3*P3) - X1/2;
A2 = -(1/2)*X2*Delta + dp_weyl_mul(P2,X1*P1+X2*P2+X3*P3) - X2/2;
A3 = -(1/2)*X3*Delta + dp_weyl_mul(P3,X1*P1+X2*P2+X3*P3) - X3/2;

/* dual Runge-Lenz vector */
B1 = -(1/2)*X1*Delta + dp_weyl_mul(P1,X1*P1+X2*P2+X3*P3) + X1/2;
B2 = -(1/2)*X2*Delta + dp_weyl_mul(P2,X1*P1+X2*P2+X3*P3) + X2/2;
B3 = -(1/2)*X3*Delta + dp_weyl_mul(P3,X1*P1+X2*P2+X3*P3) + X3/2;
   

assert(dp_weyl_mul(A1,A2) - dp_weyl_mul(A2,A1) == -L3);
assert(dp_weyl_mul(A2,A3) - dp_weyl_mul(A3,A2) == -L1);
assert(dp_weyl_mul(A3,A1) - dp_weyl_mul(A1,A3) == -L2);
assert(dp_weyl_mul(A1,L2) - dp_weyl_mul(L2,A1)==A3);
assert(dp_weyl_mul(@i*A1+L1,@i*A2+L2)-dp_weyl_mul(@i*A2+L2,@i*A1+L1)==2*(@i*A3+L3));


assert(dp_weyl_mul(B1,B2)-dp_weyl_mul(B2,B1)==L3);
assert(dp_weyl_mul(B2,B3)-dp_weyl_mul(B3,B2)==L1);
assert(dp_weyl_mul(B3,B1)-dp_weyl_mul(B1,B3)==L2);
assert(dp_weyl_mul(B1,L2) - dp_weyl_mul(L2,B1)==B3);
assert(dp_weyl_mul(B2,L3) - dp_weyl_mul(L3,B2)==B1);
assert(dp_weyl_mul(B3,L1) - dp_weyl_mul(L1,B3)==B2);
assert(dp_weyl_mul(B1+L1,B2+L2)-dp_weyl_mul(B2+L2,B1+L1)==2*(B3+L3));


assert(dp_weyl_mul(A1,B1)-dp_weyl_mul(B1,A1)==T2);
assert(dp_weyl_mul(A2,B2)-dp_weyl_mul(B2,A2)==T2);
assert(dp_weyl_mul(A3,B3)-dp_weyl_mul(B3,A3)==T2);
assert(dp_weyl_mul(T2,A1)-dp_weyl_mul(A1,T2)+B1==0);
assert(dp_weyl_mul(T2,A2)-dp_weyl_mul(A2,T2)+B2==0);
assert(dp_weyl_mul(T2,A3)-dp_weyl_mul(A3,T2)+B3==0);
assert(dp_weyl_mul(T2,B3)-dp_weyl_mul(B3,T2)+A3==0);


G1 = R*P1;
G2 = R*P2;
G3 = R*P3;
assert(p_nf(dp_dtop(dp_weyl_mul(G1,T1)-dp_weyl_mul(T1,G1)-A1,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(G2,T1)-dp_weyl_mul(T1,G2)-A2,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(G3,T1)-dp_weyl_mul(T1,G3)-A3,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(G1,T3)-dp_weyl_mul(T3,G1)-B1,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T1,A2)-dp_weyl_mul(A2,T1)-G2,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T1,A3)-dp_weyl_mul(A3,T1)-G3,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T1,B1)-dp_weyl_mul(B1,T1),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T1,B2)-dp_weyl_mul(B2,T1),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T1,B3)-dp_weyl_mul(B3,T1),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T3,A1)-dp_weyl_mul(A1,T3),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T3,A2)-dp_weyl_mul(A2,T3),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T3,B1)-dp_weyl_mul(B1,T3)+G1,V),I,V,0)==0)
assert(p_nf(dp_dtop(dp_weyl_mul(T3,B2)-dp_weyl_mul(B2,T3)+G2,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T3,B3)-dp_weyl_mul(B3,T3)+G3,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(T3,G3)-dp_weyl_mul(G3,T3)+B3,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(A3,G3)-dp_weyl_mul(G3,A3)+T1,V),I,V,0)==0);


assert(p_nf(dp_dtop(dp_weyl_mul(A3,T3)-dp_weyl_mul(T3,A3),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(L3,T3)-dp_weyl_mul(T3,L3),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(L3,A3)-dp_weyl_mul(A3,L3),V),I,V,0)==0);



/*
$T_1 (e^{-r}) = (1-r)e^{-r}$
$T_2 (e^{-r}) = (1-r)e^{-r}$
$T_3 (e^{-r}) = e^{-r}$

$A_1 (e^{-r}) = 0$
$A_2 (e^{-r}) = 0$
$A_3 (e^{-r}) = 0$

$L_1 (e^{-r}) = 0$
$L_2 (e^{-r}) = 0$
$L_3 (e^{-r}) = 0$

$\phi$: lowest weight vector for minrep of so(4,2)

$f_1(\phi) = f_2(\phi) = f_3(\phi) = 0$
$h_1 \phi = (h_2-1)\phi = h_3 \phi = 0$
$e_1 \phi = e_3 \phi = 0$

$h_4 = h_1+h_2 , h_5 = h_2+h_3 , h_6 = h_1+h_2+h_3$
*/

/* Chevalley generators */
E1 = (A1+L2+@i*L1-@i*A2)/2;
F1 = (A1-L2 +@i*L1+@i*A2)/2;
H1 = -(A3+@i*L3);

E2 = @i*(T1+T2+B3-G3)/2;
F2 = @i*(T1-T2+B3+G3)/2;
H2 = A3+T3;

E3 = -(@i*(@i*A1+L1)-(@i*A2+L2))/2;
F3 = (A1-L2-@i*L1-@i*A2)/2;
H3 = -A3+@i*L3;

assert(dp_weyl_mul(E1,F1)-dp_weyl_mul(F1,E1)==H1);
assert(dp_weyl_mul(H1,E1)-dp_weyl_mul(E1,H1)==2*E1);
assert(dp_weyl_mul(H1,F1)-dp_weyl_mul(F1,H1)==-2*F1);

assert(p_nf(@i*dp_dtop(dp_weyl_mul(H2,E2)-dp_weyl_mul(E2,H2)-2*E2,V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(E2,F2)-dp_weyl_mul(F2,E2)-H2,V),I,V,0)==0);
assert(p_nf(@i*dp_dtop(dp_weyl_mul(H2,F2)-dp_weyl_mul(F2,H2)+2*F2,V),I,V,0)==0);

assert(dp_weyl_mul(E3,F3)-dp_weyl_mul(F3,E3)==H3);
assert(dp_weyl_mul(H3,E3)-dp_weyl_mul(E3,H3)==2*E3);
assert(dp_weyl_mul(H3,F3)-dp_weyl_mul(F3,H3)==-2*F3);

assert(dp_weyl_mul(H1,E3)-dp_weyl_mul(E3,H1)==0);
assert(dp_weyl_mul(H3,E1)-dp_weyl_mul(E1,H3)==0);
assert(dp_weyl_mul(E1,F3)-dp_weyl_mul(F3,E1)==0);
assert(dp_weyl_mul(E3,F1)-dp_weyl_mul(F1,E3)==0);

/* [H2 , E1] = -E1 */
assert(p_nf(dp_dtop(dp_weyl_mul(A3+T3,A1+L2)-dp_weyl_mul(A1+L2,A3+T3)+(A1+L2),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(A3+T3,L1-A2)-dp_weyl_mul(L1-A2,A3+T3)+(L1-A2),V),I,V,0)==0);

/* [H2 , F1] = F1 */
assert(p_nf(dp_dtop(dp_weyl_mul(A3+T3,L1+A2)-dp_weyl_mul(L1+A2,A3+T3)-(L1+A2),V),I,V,0)==0);
assert(p_nf(dp_dtop(dp_weyl_mul(A3+T3,A1-L2)-dp_weyl_mul(A1-L2,A3+T3)-(A1-L2),V),I,V,0)==0);

/* [H1,E2] = -E2 */
assert(p_nf(dp_dtop(@i*(dp_weyl_mul(H1,E2)-dp_weyl_mul(E2,H1)+E2),V),I,V,0)==0);

/* [H1,F2] = F2 */
assert(p_nf(dp_dtop(@i*(dp_weyl_mul(H1,F2)-dp_weyl_mul(F2,H1)-F2),V),I,V,0)==0);



/* some vanishing conditions */ 
assert(dp_weyl_mul(L1,A1)+dp_weyl_mul(L2,A2)+dp_weyl_mul(L3,A3)==0);

/* A1*A1+A2*A2+A3*A3-L1*L1-L2*L2-L3*L3==T3*T3-1 */
assert(p_nf(dp_dtop(dp_weyl_mul(A1,A1)+dp_weyl_mul(A2,A2)+dp_weyl_mul(A3,A3)-dp_weyl_mul(L1,L1)-dp_weyl_mul(L2,L2)-dp_weyl_mul(L3,L3)-dp_weyl_mul(T3,T3)+1,V),I,V,0)==0);

/* B1*B1+B2*B2+B3*B3+L1*L1+L2*L2+L3*L3==T1*T1+1 */
assert(p_nf(dp_dtop(dp_weyl_mul(B1,B1)+dp_weyl_mul(B2,B2)+dp_weyl_mul(B3,B3)+dp_weyl_mul(L1,L1)+dp_weyl_mul(L2,L2)+dp_weyl_mul(L3,L3)-dp_weyl_mul(T1,T1)-1,V),I,V,0)==0);


三角形の合同類のなす空間と有限変形理論

三角形の合同条件と不変式論

http://d.hatena.ne.jp/m-a-o/20130104#p1

みたいなことを昔書いた。ここで書いた考え方だと、三角形が退化した場合(三点が一直線上にある場合とか、一点に集中している場合)の扱いが面倒で、そのへんのことは、詳しく書いてない。が、最近、三角形の合同類のなす空間は、もっと単純な記述ができることに気付いた。


答えとしては、退化してない三角形の合同類の空間は$GL_{+}(2,\mathbf{R})/SO(2)$になる。実際、三角形の一点を原点に持ってきて、残りの二点の座標が、(a,b),(c,d)とすると、非退化な三角形であれば、ad-bc≠0が成立するから、そのような2点の配置の空間は$GL(2,\mathbf{R})$そのものである。一点を原点に置いてるので、これで並進の自由度は消えていて、残りは回転(と鏡映)の自由度で、商空間を考えれば、退化してない三角形の合同類の空間を与える。一般の次元でも、$GL_{+}(n,\mathbf{R})$(行列式が正のn行n列の行列全体)が$n$-単体の合同類の空間に推移的に作用して、固定部分群が$SO(n)$になるので、非退化な$n$-単体の合同類の空間は、$GL_{+}(n,\mathbf{R})/SO(n)$になる。この空間は、正定値対称行列全体と同一視できる($GL_{+}(n,\mathbf{R})$の元が、正定値対称行列と直交行列の積に一意に分解できるというのが、極分解定理)


#$SL(2,\mathbf{R})/SO(2)$は有名なポアンカレの上半平面になる。$GL_{+}(1,\mathbf{R})$は定数倍であるから、単なる拡大・縮小であり、$SO(n)$と合わせて相似な三角形全体を通る。$GL_{+}(2,\mathbf{R})$は$GL_{+}(1,\mathbf{R})$と$SL(2,\mathbf{R})/SO(2)$の直積であるから、$SL(2,\mathbf{R})/SO(2)$は三角形の相似類の空間である。$SL(n,\mathbf{R})/SO(n)$も対称空間の代表的な例である。数学的には、合同類より相似類の方が自然なのかもしれない


並進の自由度をad hocに消しているけど、$n$-単体の一様並進も入れると、$n$-単体の合同類の空間に、アフィン変換群が推移的に作用し、その場合、固定部分群は、合同変換群$Iso(n,\mathbf{R})$となる。回転と鏡映を考えると$GL(n,\mathbf{R})$が作用し、固定部分群は$O(n)$になる。


これを考えたのは、有限要素法の大変形解析のことを考えていた時。有限要素法では物体の変形がアフィン変換(並進の自由度を消せば一般線形変換)で線形補間すると十分よい近似になる微小領域を使う。この微小領域の初期状態(平衡状態)として、三角形や四面体を取ると、線形変換やアフィン変換によって、任意の三角形や四面体が得られる。そして、微小領域の形状のみを考えるなら、合同変換の自由度(剛体並進・剛体回転)は邪魔である。これは、$n$-単体の合同類の空間を考えた時と同じ考え方になっている。結局、(局所的な)有限歪みは、$GL(n,\mathbf{R})/O(n)$で分類され、超弾性体などの場合、弾性エネルギー/ひずみエネルギーは、この空間上の関数とみなすことができる。次元は、n^2-n(n-1)/2=n(n+1)/2で、n=2なら3、n=3なら6で、これは三角形や四面体の辺の数と等しい


※)三角形や四面体の定ひずみ要素を考える場合、平衡状態(要素の歪みエネルギーが最小となる配置)に於ける節点の座標と、変形後の節点の座標から、前者を後者へ変換するアフィン変換が一意に定まり、これの線形変換部分が変形勾配テンソル(テンソルと名前が付いてるけど、単なる行列)となる。変形勾配テンソルは直接、極分解するか、あるいは、転置行列との積を取ることにより、剛体回転成分が除かれ、有限歪みを得ることができる。応力と歪みの構成則があれば、応力成分と歪み成分の積を足し合わせて、弾性エネルギー密度を得られる。こうして得られた弾性エネルギーは、変形後の節点座標の関数と見なすことができるので、変形後の各節点の座標成分で微分すると、節点力が定まる


連続体が非圧縮性条件を満たす場合、局所的には体積が保存するので、$GL_{+}(n,\mathbf{R})$の代わりに$SL(n,\mathbf{R})$を考えることになる。従って、非圧縮性有限歪みの分類空間は、対称空間$SL(n,\mathbf{R})/SO(n)$で記述される(という事実が、何かの役に立つわけではない)

日本語/英語の組み合わせ範疇文法パーサーを作った

toyccg

https://github.com/vertexoperator/toyccg


英語については、CCG(Combinatory Categorial Grammar)のparserは公開されているものが、いくつか存在する(疑問文とか命令文は、あんまり対応してなかったりする。toyccgも疑問文や命令文は、あんまり対応できてない。やればできるとは思う)けど、日本語については、知る限りではない(公開せずに実装している人はいると思うけど)ので。原理的に新しいことは何もないけど、実用的に使うのに、必要そうな機能は、一通り実装してあると思う


自然言語用のパーサーとしては

・pythonで1500〜2000行程度((自然)言語非依存のコア部分は、1000行くらい。外部ライブラリは使ってないし他(プログラミング)言語への移植は楽と思う)で比較的小さい

・日本語と英語同時対応

・機械学習フリー

などの特徴がある。機械学習を使用してないのは、そもそも、日本語の学習用データが存在しない(多分)(英語用では、CCGBankがあって、普通これを使うと思うけど、どうやって入手するのか謎なので、やっぱり使えない)のもあるし、機械学習頼りだと、手で修正するということがやりづらくなるという面もある。手でルール作るとか、時代の流れに逆行している気もするけど、実用上は悪いことばかりでもない(CCGBankはTreeBankからの自動生成っぽいけど、学習用データを自分で作る場合、やっぱり手間がかかるわけだし)

#CFGを確率化した確率文脈自由文法(PCFG)と同様、CCGを確率化した、確率的組み合わせ範疇文法(PCCG)のような方法も存在する


nltkのCCGパーサーとの違いは

・デフォルトで辞書を用意している

・normal form parsingをサポートしている

・nltkのパーサーで日本語を解析する場合、単語単位への分かち書きは別に行う必要があるけど、toyccgは、分かち書きと構文解析を同時にやる

というあたり。分かち書き対応したおかげで、英語でも、New YorkとかWhite Houseみたいなのを一単語のようにして扱うことができるようになった(やろうと思えば、"This is a pen"のような文単位で統語範疇を辞書に登録することもできる)。あとまぁ、長単位・短単位みたいなのを気にする必要も、あまりない


#"数学的構造"みたいなのを辞書登録すると、数学+的+構造で分解するのと、"数学的構造"で単語扱いする結果が、ダブって出現することになる。こういう単語が多い文では、計算時間の増大にも繋がるし、本質的に同じ解析結果が沢山出現することにもなる。toyccgで、このパターンで計算量が増えるケースは結構ある


#CCGでは、長単位・短単位以外に、品詞についても、考える必要がない(これをメリットと捉えるかは人によるかもしれないけど)。名詞・動詞は分かりやすいけど、実際に作業していて、日本語文法の知識が殆どない私には、助詞・助動詞の区別は迷うことがあるし、例えば、もう死語のような気がするけど

「なう」の品詞ってなんですか?

http://togetter.com/li/258854

という話でも、CCGだと、"S\N"みたいな統語範疇を設定してやれば"渋谷なう"みたいな文章を解析できる。これに類似した統語範疇(つまり、"S[*]\N[*]")を持つ単語は、今のところ他にはない。動詞や形容詞は統語範疇として"S\NP"を持つので、近いと言えるかもしれない。"ご飯食べてるなう"だと、"S[now]\S"とするとか。統語素性[now]を付けているのは、"ご飯食べてるなうなう"みたいな文章を是としないため。



統語素性の設計について。日本語の統語素性は、ベースになるようなものがないので、勝手に作ったものが沢山ある(一応、「日本語文法の形式理論」という本が一冊出ていて、それは参考にした)。英語の場合は、CCGBankがデファクトスタンダードになっているので、なるべくそれに従っているけれど、改変してある部分もある(例えば、toyccgは前置詞句PPを使わない)。これらは、辞書の問題なので、辞書を差しかえれば、実装の方を変えることなく、他の統語範疇・統語素性設計に対応できる(はず)

#CCGBankは、結構謎のunary rulesがあって、本来のCCGからは、はみ出しているので、これが気に入らない。toyccgも、このへんの問題はクリアできてなくて、適切に統語範疇・統語素性を設計すれば解決するのか、それともどうしようもないのかは、不明。英語ではCCGBankが標準のようになっているけど、本当に、これでいいのかはよく検討するべきことと個人的には思う


unary rulesとして、どういうものがあるかは、

https://github.com/mikelewis0/easyccg/blob/e42d58e08eb2a86593d52f730c5afe222e939781/training/unaryRules

などを見ると分かる



機械学習ベースじゃないことのデメリットとして、構文解析できないケースが、増えてしまう(実用上は、何でもいいから、とりあえず結果を出してくれた方が嬉しい時もあれば、ダメな時には、あからさまに失敗してくれた方がいい時もあると思うので、一概にデメリットとも言い切れない。toyccgの場合、日本語として、文法が崩壊している文章は、解析されない可能性が高い)。一応、それなりには頑張っていて

>>> import toyccg.japanese as jpn
>>> jpn.run(u"すももももももももの内。")
test run : sentence=すももももももももの内。
すもも	N
も	(NP[sbj]/NP[nom-enum])\N
もも	N
も	NP[nom-enum]\N
もも	N
の	((S[nom]\NP[sbj])/(S[nom]\NP[sbj]))\N
内	S[nom]\NP[sbj]
。	ROOT\S[nom]

>>> jpn.run(u"象は鼻が長い。")
test run : sentence=象は鼻が長い。
象	N
は	NP[sbj]\N
鼻	N
が	NP[ga-acc]\N
長い	(S\NP[sbj])\NP[ga-acc]
。	ROOT\S

くらいの解析はできる。sentences.ja.txtには、解析できる文章として、どれくらいのものがあるか、100以上の例がある。一応、ニュースや論文に出てくるような、比較的固めの文章なら、そこそこ解析できるように頑張っている(解析できるとは言っていない)。twitterや話し言葉で出てくるような文章となると、なかなか難しい。これらの文章では、格助詞の省略がよく起きて、難しい原因の一つとなる。その他、未知語が含まれている場合(これは、ニュースや論文でも、よくある。一応、文字種に基づく未知語推定を行えるしているが)や、倒置法とかは全く対応されてない


助詞が省略されていても、

>>> jpn.run(u"お腹すいた。")
test run : sentence=お腹すいた。

>>> jpn.parser.lexicon.setdefault(u"お腹",[]).append( "NP[sbj]" )
>>> jpn.run(u"お腹すいた。")
test run : sentence=お腹すいた。
お腹	NP[sbj]
すい	IV[euph]
た	(S\NP[sbj])\IV[euph]
。	ROOT\S

みたいに、適切な統語範疇を辞書登録してやれば、対応できないわけではないけど。安易にこういうことをして、間違った構文解析結果が増えてしまうと、それはそれで困る。


#既存部分への影響を、頭を使わずに、確実に抑えたいなら、NP[x]とか適当な新しい素性を導入して、動詞や形容詞のような単語にも、対応する統語範疇("S\NP[x]"など)を追加していくなどの手もある。スマートな解決策とは言えないけど、実用的な解析を行うには、そういうことも必要かもしれない。日本語は、話し言葉レベルでは、「私、昨日、学校行った」みたいな格助詞が全部落ちたような文章も可能であるから、そこまで行くと、現時点では、どれが主語か正しく判定するのは難しい



jpn.runは、形態素解析的な結果しか出さないけど、内部的には、構文木が作られている

>>> import toyccg.japanese as jpn
>>> r = jpn.parser.parse(u"あらゆる現実を、全て自分の方へ捻じ曲げたのだ。")
>>> t = r.next()
>>> print(t.show())
(LApp (LApp (SkipCommaJP (LApp (RApp [あらゆる:N/N] [現実:N]) [を:NP[obj]\N]) [、:COMMA]) (RBx [全て:S[null]/S[null]] (RBx (LApp (RApp (LApp [自分:N] [の:(N/N[base])\N]) [方:N[base]]) [へ:(S[null]/S[null])\N]) (LB (LApp [捻じ曲げ:TV[euph]] [た:(S[null]\NP[obj])\TV[euph]]) [のだ:S[null]\S[null]])))) [。:ROOT\S[null]])

あんまり見やすい出力ではないけど。多くの場合、構文解析結果は一意でないので、結果はジェネレータで、一つずつ返ってくる。

#デフォルトでは、ソースコード中で、shortcutと書いてある"近似"が有効になっていて、例えば、"かわいい私の妹"は、二種類の係り受け構造("かわいい"が"私"に係る場合と、"妹"に係る場合)が存在するが、どちらの場合も統語範疇は"N"となる(これは、本質的に構造が違うので、normal form parsingでは対処できない)ので、それ以降の解析には影響しない。こういうのが沢山あると、長文では、解析結果が沢山出てきて、計算時間が膨大になる。こういう状況を回避するため、先に出てきた結果だけを取って、それ以降のは使わないという処理をしている。最終的な構文木が一つしか必要ない場合は、shortcutをTrueにしておく方が、計算が速く済む(大体、ニュースとか論文とかの文章だと、これがないと一文の計算が全然終わらないことが多い)けど、本当に、全ての結果が必要な場合は、shortcutをFalseにする必要がある


分かち書きしたいだけなら、

>>> print [c.token for c in t.leaves()]
[u'\u3042\u3089\u3086\u308b', u'\u73fe\u5b9f', u'\u3092', u'\u3001', u'\u5168\u3066', u'\u81ea\u5206', u'\u306e', u'\u65b9', u'\u3078', u'\u637b\u3058\u66f2\u3052', u'\u305f', u'\u306e', u'\u3060', u'\u3002']

とかできる



感想。色々と実験するプロトタイプ的なつもりだったのだけど、思ったよりも、よく解析できるな、という印象(自画自賛)。


課題

・複合名詞対応

・格助詞落ち対応


今後。もう少し改善しようかと思ってたけど、飽きてしまったので、当分いじることはなさげ(完)