トロピカル代数のためのメモ

  • こちらの団代数の短い文書を読むときのメモ
  • 半体
    • 集合があって、2つの演算が定まっている
    • 2つの演算は、積と和
    • ただし、和については「加えることはできるがその逆である引くことはできない」
    • 3つの半体を覚える
      • 自明半体
        • 要素は1だけ。1と1の積が1、1と1の和も1
      • 普遍半体
        • n個の変数の多項式を要素とする
        • ただし、多項式には条件がある
        • 特定の整数係数多項式をまず定める
          • 係数は非負。その多項式は0であってはいけない
        • このような0でない、非負整数係数多項式の有理式として表される関数全体が集合
        • 和と積とは通常の和と積と定めると、この関数全体が半体になっている。これが普遍半体
      • トロピカル半体
        • n個の変数
        • そのローラン単項式全体 \{\prod_{i}^n u_i^{a_i}; a_i \in Z\}を考える
          • これは普遍半体での「0でない、非負整数係数多項式」の有理式として表される関数全体の集合に対応する
        • 積は普通の積とする。これにより、変数ごとの次数は「普通の和(加算と減算)」に相当する
        • 和は、変数ごとの「次数の最小値」とする
        • これが半体となっており、積が(次数の)和になり、和が(次数の)最小を取る操作になっていることから、その性質がトロピカルだということでトロピカル半体と呼ばれる
    • 普遍半体のトロピカル写像
      • 普遍半体とトロピカル半体とには対応関係(準同型写像)があるので、普遍半体の要素である非負整数係数有理多項式に対応するトロピカル半体のローラン単項式が得られる
          • \frac{2u_1^2 + u_1u_2}{u_1+2u_2} -> \frac{u_1^2 \oplus u_1 u_2}{u_1 \oplus u_2} トロピカル半体には、「整数係数」という概念がないから、それは単純に消失する
          •  =\frac{u_1^{min(2,1)} u_2^{min(0,1)}}{u_1^{min(1,0)}u_2^{min(0,1)}} = \frac{u_1^1 u_2^0}{u_1^0 u_2^0} = u_1
  • 半体を用いた群環
    • 半体は、群であって、不完全な体の性質を持っているので、群ではある。これをPと表すとする
    • 群環は、群の要素に係数を掛けたものの線形結合。係数には体が使われる
    • ただし、この群環に用いられる線形結合の加算は、トロピカル加算ではなくて、普通の加算
    • いずれにしろ、半体を群として整数を係数とした群環が定義できる。これをZPとする
    • さらに、そのような群環ZPの分数体も作れて、それをQPとする。これは体になっている
  • 団代数
    • 団代数では、変数の個数nを定め
    • 半体Pを定める
    • そのうえで、そのQPも現れて、説明される
    • ランク n は変数の個数
    • (B,x,y)をPに係数を持つ種子と言う
      • nxn 反対称行列B
      • x = \{x_i\}, i = 1,2,...,n; x_i \in F。ただし、FはQPを係数とする有理関数体で、代数的に独立。団変数
      • y = \{y_i\},i = 1,2,...,n; y_i \in P。係数
    • 種子には、n通りの変異が定まり、n変異種子は、種子としての性質を持つので、種子の集合はn正則グラフになっている
    • ある種子を1個取ると、n正則木の全ノードに対応する種子が一意に定まる
    • したがって、各種子のx (QPを係数とする有理関数体を要素とする、要素数nの集合)の集合がとれる
    • xの要素は1変異につき、1要素が変化するが、こうして、xの要素として現れるQPを係数とする有理関数体の要素全体の部分集合は、FのZP部分代数になっている。これが初期種子によって定まる団代数であるとして、団代数が定義される。。。ZP部分代数のZがちょっとわかっていないが、n個のうちの第i番目の方向について1歩進む、2歩進む、1歩戻る、という動きがZ(整数)的、ということらしい
    • xの変異は、i番目での変異のとき、i番以外の要素は変化せず、i番目が次のように変化する
      • x_i(t+1) = \frac{1}{x_i(t)} (\frac{y_i}{y_i \oplus 1} \prod_{j=1}^n x_j(t) ^{[b_{ji}]_+} + \frac{1}{y_i \oplus 1} \prod_{j=1}^n x_j(t) ^{[-b_{ji}]_+})
    • すごく小難しいが、Fの要素であるxに関する有理式であることがまずわかる
    • また、xに関する部分以外が係数になるが、その係数は、半体Pの要素であるyに関する群環ZPの分数体であるQPになっていることもわかる
    • したがって、xの変異に伴う変換は、QPを係数とする有理変換である、と読める
    • つまり、初期種子のxから一意に決まるxの要素たちは、xのQP係数有理関数であることは、その式変形からわかっている
    • 団代数として面白いのは、式変形からわかっている、この事実以上に制約が厳しい事実が潜んでいることである
  • 団代数の特徴
    • x変数はxのZP係数のLaurent多項式になる、というのが、その厳しい制約である
  • この文書が強調したこと
    • n正則グラフの頂点集合が、何かしらの対象空間を表しているとき、その個々の頂点~種子とy変数の構成要素の組が、何かしら、その種子特有の状態を表しているので、y変数を知ることや、異なる種子のy変数を比較することに意味があるのは当然として、そこに、トロピカル化写像を行ってy変数をトロピカル化したときにそこに得られる情報と1対1対応していることを強調している。トロピカル化写像によりy変数は、その「主要部取り出し」をしているとみなせるが、「主要部取り出しをしてしまっても」情報が残っている、ということになるらしい
  • 何かうまいことを考えて、対象を変異で移り変わるn正則グラフに載せることができたなら、この強調点を応用できることになる

sagemath をcygwinで

  • sagemathは数学のアプリケーション
  • こちらからWindows用にダウンロードしてさくっと使えるのですが、追加のpython packageを入れようとすると:
    • sageshell を立ち上げて"pip --install hogePackage" とすればよいはずなのだが、openSSLがうまく行かずに失敗する
    • "pip --install hogePackage"はPyPIからダウンロードするコマンドなので、そこにopenSSLでアクセスできないだけなら、zipファイルをローカルに取得して、"sage --pip install ~/Downloads/packagename.zip”のようにすれば良いはずだが、今度は、コンパイラ問題でうまく行かない
  • sagemathをcygwin環境に入れるとうまく行くかも、ということで、こちらに沿ってやってみる
    • まず、cygwinこちらに沿って取ってきてローカルにインストールする
    • 何も考えずにcygwinをインストールし、cygwinを立ち上げれば、仮想環境
    • そこで、sagemathのcygwin環境セットアップのページ(こちら)に戻って、言われた通りに以下のコマンドを、cygwinコマンドラインに入力する
curl -OL https://rawgit.com/transcode-open/apt-cyg/master/apt-cyg
install apt-cyg /usr/local/bin
rm -f apt-cyg
apt-cyg install make m4 flex git gcc-core gcc-g++ gcc-fortran diffutils \
                  liblapack0 liblapack-devel zlib-devel libreadline-devel \
                  libiconv-devel libcrypt-devel openssl-devel gettext-devel \
                  python ccache
    • すると、wgetがないよ、とのエラーが出るので、こちらを参考に、cygwinのインストール exeファイルを再度実行して、途中に現れる、追加オプションでwgetを指定して、cygwin環境にwgetを追加する
    • そのうえでcygwinを立ち上げ、再度
apt-cyg install make m4 flex git gcc-core gcc-g++ gcc-fortran diffutils \
                  liblapack0 liblapack-devel zlib-devel libreadline-devel \
                  libiconv-devel libcrypt-devel openssl-devel gettext-devel \
                  python ccache
    • とやるとうまく行くので、cygwinインストール解説のoptionalは飛ばして
git clone --branch develop git://trac.sagemath.org/sage.git
cd sage
    • (sagemathのページにはないが)
cd sage
make
    • とする
    • すると、configureしてからじゃなきゃだめ、とのメッセージが出るので、そりゃそうだ、と思い直して
./configure
make
  • これでcygwin環境にて、sagamathのソースを入手し、コンパイルしてのインストールが終了...
  • なのだが、makeにものすごい時間がかかり、終わってみれば、エラーあり。。。
  • ただし、Cygwinのsageディレクトリ配下に 実行可能な sage コマンドが現れinteractive sageが立ち上がりはした。とはいえ、新たに pip install hogepackageは相変わらずうまく動かなかったので、目的は達成できなかったという残念な結果

pythonでigraphを使ってplotする

  • igraphはRとpythonで使えるグラフ理論パッケージ
  • python(python3)をanaconcaでwindowsに入れて pip install python-igraph したものの、プロット機能が使えなくて難航
  • pycairoに依存しているということがわかり、そのためにcairoを入れる必要があったのでメモ
  • こちら
  • msysを入れて…とひと手間かけたが、結局、コマンドラインから
conda install pycairo
  • とするだけでよいらしい
  • 入れた結果
import igraph
g = igraph.Graph()
g.add_vertices(3)
g.add_edges([(0,1),(1,2)])
adj = g.get_adjacency()
g2 = igraph.Graph.Adjacency(adj.data) # adjはigraphパッケージ独特な Matrxiと言うクラスなので、そのデータ部分だけを取り出して、リストとした adj.dataをGraph.Adjacency()関数に渡す
igraph.plot(g2)
out = igraph.plot(g2)
out.show()
out.save(fname='out.pdf')

f:id:ryamada:20201206094624j:plain

ガウシアンカーネルの無限次元性

  • サポートベクターマシンではカーネル関数を使って、高次元空間に投げ上げて、そこでの内積を利用する
  • 観測変数を組み合わせて新たな次元軸を作って、その増やした次元での内積を計算するときに、地道に計算してもよいけれど、うまい方法があるといいな、と。
  • そのうまい方法を用いるのが「カーネル・トリック」を使う、という話
  • この記事は解りやすい
  • 手作業で新たな変数を作り出し、それに対する「トリック」を紹介してくれて、最終的に、ガウシアンカーネルを紹介し、それが「無限の変数」を作り出してその内積を計算してくれていることを紹介している
  • 残念なのは、そのガウシアンカーネルが分解されて、無限次元に飛んでいるところの説明式の符号が間違っていること…。正しい式はこちらにあるように、以下の式
    • K(x_1,x_2) = exp(-\frac{||x_1-x_2||^2}{2\sigma^2}) =  exp(-\frac{||x_1||^2}{2\sigma^2})  exp(-\frac{||x_2||^2}{2\sigma^2})  exp(\frac{\text{innerProd}(x_1,x_2)}{\sigma^2})
  • これを展開すると
    • K(x_1,x_2) = exp(-\frac{||x_1||^2}{2\sigma^2})  exp(-\frac{||x_2||^2}{2\sigma^2})  \sum_{i=0}^{\infty} \frac{\text{innerProd}(x_1,x_2)^i}{i!}
  • 指数関数を使わず、ある程度の項数で近似するなら、内積だけ計算しておけばよいこともわかる
  • 念のため、この展開の収束をRでやっておくと:
d <- 5

x1 <- rnorm(d)
x2 <- rnorm(d)

V <- exp(-sum((x1-x2)^2)/2)

C <- exp(-sum(x1^2)/2) * exp(-sum(x2^2)/2) 

n <- 0:10

v <- rep(0,length(n))

v[1] <- C

for(i in 2:length(n)){
	#v[i] <- v[i-1] +C* sign(-1)^n[i] * sum(x1*x2)^n[i]/factorial(n[i])
	v[i] <- v[i-1] +C * sum(x1*x2)^n[i]/factorial(n[i])
}

plot(n,v)
abline(h=V)

三角化・結び目・団代数・双曲幾何・確率論・量子確率論~たまった資料の整理をする

はじめに

  • コロナ禍のため(?)に資料を読み捨てにして整理せずにいたら、収拾がつかなくなってきたので、いったん整理する

団代数

三角化

結び目・結び目補空間・3-多様体

双曲幾何

代数と幾何

Teichmuller space

曲面解析・変形

  • Hyperbolid Harmonic Mapping for Surface Registration : 曲面のハンドリング。{Ricci flow、双曲幾何構造分解としてのパンツ分解、等温座標系、共形変換} = {Discrete Hyperbolic Ricci Flow, Hyperbolic Pants Decomposition, Homotopy Class, Non-linear Heat Diffustion}
  • Recent Advances in Computational Conformal Geometry(2009) : 曲面の共形変換の総説。Ricci flowベースで説明しつつ、Teichmuller spaceと言う単語への言及もある。Ricci flowで変形して、hyperbolic uniformization metricを計算することができる、その後、パンツ分解をすることで、Fenchel-Nielsen coordinatesを付与することによりTeichmuller spaceとつなげることができる 

トロピカル代数・トロピカル幾何

Circle packing, Sphere packing, Applonian circles

行列に関すること

量子確率論

sagemath snappy のドッカーを使ってみる

  • こちらトポロジーツール"snappy"をsagemathと連携して使う環境づくりについて説明してある
  • 結局、dockerで諸々を入れるのが良いということらしいのでdockerhubにあるcomputop/sageをドッカーで入れることにする
  • そのためにまず(Windows環境で)dockerが使えるようにすることにする
  • こちらからドッカー環境をローカルPCに作る
  • Get dockerして、ダウンロードされたexeファイルを実行するだけ
  • デスクトップにできたドッカーイメージをダブルクリックして開始。
  • すると、Linux カーネル更新プログラム パッケージを入れろ、と言われるので、こちらのx64 マシン用の最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロードしてください。をクリックして、言われるがままに実行する。
  • そのうえで、Dockerを再起動すると、Docker環境らしきものが立ち上がり、右側にコマンドを打てる場所が現れる
  • 今、使いたいsagemathとsnappyが連携している「もの」を入れるべく、このサイトのコマンドを、Docker内のコマンドプロンプトに打っていく
  • そもそも、最初のコマンド(以下)にかかる時間が長い…sagemath本体を入れているからだろう…
docker pull computop/sage
  • 引き続いて
docker run -it computop/sage
  • とやると、どうやら、ドッカーイメージが「入った」ことになるらしい
  • Dockerのアイコンをダブルクリックするとドッカーが立ち上がったよというメッセージが出るので、そうしたら、コマンドプロンプト
docker run -it -p 127.0.0.1:8888:8888 computop/sage
||
-と打つ。その上で
>||
$ sage --notebook

とすると

Starting up Sage Jupyter Notebook, viewable at http://localhost:8888
  • と出るので、ブラウザにてhttp://localhost:8888を開くと、いわゆるJupyter notebookの画面となるから、そこでsagemathのノートを開く

f:id:ryamada:20201024085551p:plain

Manifold?
import snappy
M = snappy.Manifold("m004")
M.alexander_polynomial()
D = M.dirichlet_domain()
K1 = Link([[8,3,1,4],[2,6,3,5],[6,2,7,1],[4,7,5,8]])
  • とか、する。
  • お絵描きがまだうまく動かないのだが…

f:id:ryamada:20201024085611p:plain