メモ(自然科学・IT技術)

Physics, Information Science, Mathematics and all that

ネスト化されたリスト構造について少し

作ったはいいものの、博士論文の執筆のため、なかなか研究以外の勉強時間を確保できずにいて、放置してしまったのでちょっとここらでメモ。
代数計算(数値計算でない、という意味)を中心とした研究をやっているので、Mathematicaという数式処理ソフトウェアがこれまで研究する際に時々活用してましたが、ちょっとそれじゃメモリ・計算時間的に厳しいので、やっと重い腰を上げて自分でコードを書きました。
計算時間を気にするならC++と言いたいところですが、動的な配列と、その参照渡しをおそろしく多用するのでそれはいやだ、という事でPythonに白羽の矢が立ちました。最近、機械学習といえばPythonみたいなご時世なので、この機会に真面目に勉強。
一応、tensorflow(のチュートリアルレベル)で遊んだり、簡単なボットを作ったりはしていたので、なんとかなるだろう思いました。

結果、なんとかなりました。

少しだけ背景や動機を述べると、かなり数学チックな研究で、実装したコードにはsu(N) Lie algebraの表現論、とりわけtensor積分解(あるいはLittlewood-Richardson係数を求める)が大変でした。他にも組合せ論的な事が入ってきて、再帰動的計画法など、基本的な概念の復習もかねて、結果的にPythonの良い演習問題にもなったかも。興味ある方はYoung(ヤング)図形、対称多項式、Schur(シューア)多項式、LittlewoodRichardson係数、Freudenthal (recursion) formulaなどでググってみるとよいかも。(気が向いたら解説を書くかも)
ちなみに今回書いたコードはsu(N)限定です。
su(N) Lie代数とはN次正方行列環(要素は複素数であるが、vector空間としては実数体を考える場合が多い。)の、Hermite性かつtracelessを満たす部分代数で、積として交換子を導入したものを指し、物理だと普通はspin演算子のなすsu(2)代数くらいしか現れません。(もちろん、可換なものやso型、simpleでないもの、super Lie代数にいけば、いろいろ顔を出しますが。)
研究の目的は当面これで大丈夫で、またアルゴリズムにsu型の特殊性を多用しているためです。(具体的にはWeyl鏡映作用が、定義表現のweightで基底展開した時に、置換群として作用し、リストのsortで簡潔に表現できる事が一番の恩恵でした。)

ともかく、あんましすぐに見つからなかった(ここでは2,3分ググって出てこない程度の意)点などいくつかメモしておきます。

その1:ネストしたリストをソートしたい

operator.itemgetterで解決。(例えば二重リストの場合、以下、参照)

その2:ネストしたリストを値渡ししたい

解決策は値渡しはcopy.deepcopyで渡します。(copyだとリストはコピーされるが、リストの中のリストは参照渡しのまま)


>|python|
from operator import itemgetter
from copy import deepcopy

a=[[1,4,3,2],[5,4,2,1],[6,2,1,1,6],[9,2,3,1],[1,1,5,2,3],[5,4,2,8],[3,0,7,2]]
b=deepcopy(a)
b.sort()
print(b)
b=deepcopy(a)
b.sort(key=itemgetter(slice(1,None)))
print(b)
b=deepcopy(a)
b.sort(key=itemgetter(0))
print(b)
b=deepcopy(a)
b.sort(key=itemgetter(1))
print(b)
b=deepcopy(a)
b.sort(key=itemgetter(2,1))
print(b)
||<
で実行結果は、それぞれ
[[1, 1, 5, 2, 3], [1, 4, 3, 2], [3, 0, 7, 2], [5, 4, 2, 1], [5, 4, 2, 8], [6, 2, 1, 1, 6], [9, 2, 3, 1]]
[[3, 0, 7, 2], [1, 1, 5, 2, 3], [6, 2, 1, 1, 6], [9, 2, 3, 1], [5, 4, 2, 1], [5, 4, 2, 8], [1, 4, 3, 2]]
[[1, 4, 3, 2], [1, 1, 5, 2, 3], [3, 0, 7, 2], [5, 4, 2, 1], [5, 4, 2, 8], [6, 2, 1, 1, 6], [9, 2, 3, 1]]
[[3, 0, 7, 2], [1, 1, 5, 2, 3], [6, 2, 1, 1, 6], [9, 2, 3, 1], [1, 4, 3, 2], [5, 4, 2, 1], [5, 4, 2, 8]]
[[6, 2, 1, 1, 6], [5, 4, 2, 1], [5, 4, 2, 8], [9, 2, 3, 1], [1, 4, 3, 2], [1, 1, 5, 2, 3], [3, 0, 7, 2]]
となります。itemgetterの引数の順序に対応して、辞書式順序を入れてソートするみたいです。slice(1,None)は結局使わなかったけど、どこにも見当たらなかったので、一応かいてみましたが、(0から始めて)1番目の要素でソートした後、2,3,...とソートするものと思われます。何も指定しない場合はおそらくslice(0,None)と同じだと思われます。

その3:ネスト化リスト(など)を内包表記で生成

>|python|
a=[i*[i] for i in range(1,6)]
print(a)
b=[2*i for i in a]
print(b)
c=[range(i,2*i) for i in range(1,6)]
print(c)
d=tuple([[z+w for z,w in zip(x,y)] for x,y in zip(a,c)])
print(d)
||<

実行結果:
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]
[[1, 1], [2, 2, 2, 2], [3, 3, 3, 3, 3, 3], [4, 4, 4, 4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]]
[range(1, 2), range(2, 4), range(3, 6), range(4, 8), range(5, 10)]
([2], [4, 5], [6, 7, 8], [8, 9, 10, 11], [10, 11, 12, 13, 14])

ぱっとググった感じ見つからなかったので、これも書いておきます。分かってしまえば当たり前なんですけどね。

数式表示テスト(今年のNobel prizeを出しにして)

手始めに何か面白いメモないかな、と探してみたけど、すごい中途半端か、既にpdfとしてまとめてしまってる、のどちらかで案外見つからない。とりあえずブログサービスでここを使う大きなきっかけが、texが有効である事(MathJaxを使用しているらしい、おそらくWikipediaと同じかな)だったので、数式の表示テストをかねて、以下今年のNobel物理学賞について二言三言書いてみます。

今年はKosterlitz氏、Thouless氏とHaldane氏の3名の方が受賞されました。私の狭いかつうる覚えの知識では、Kosterlitz氏(スペル見ないと書けない)がThouless氏と共同で現在KT転移と呼ばれるものを提唱(そして受賞理由が多分これ)、Thouless氏は量子Hall系でのThouless pumpと呼ばれる思考実験を提唱、Haldane氏は1次元Heisenberg模型における、spinの整数、半整数性とギャップや相(phase)の関係の研究で有名です。

1次元XXX Heiseberg模型は以下の格子スピン系Hamiltonian
 {\displaystyle  \mathcal{H}=J \sum_{i} \hat{S}_i \cdot \hat{S}_{i+1} }
で表せる。J<0の時は強磁性相にあり、少なくとも{S=\dfrac{1}{2}}の時はBethe ansatzなどによりその基底状態が調べられている。一方で、J>0の時は次のHaldane予想と呼ばれる予想が存在する:

Sが半整数の時、gaplessの基底状態、Sが整数の時、gappedの基底状態にある。

特に係数をfine tuningした2次の補正項 {\dfrac{J}{3}(\hat{S}_i \cdot \hat{S}_{i+1})^2}を入れたものをAKLT Hamiltonian (Affleck-Kennedy-Lieb-Tasaki 1987)と言い、この場合、整数スピンの基底状態が厳密に書き下せる。(MPS表示だと2X2行列になったはず。)
※さらに高次の補正項を入れて同様の議論が成り立つ。(はず)
多分この仕事により、1次元spin系の厳密な解析が発展し、近年のSPT相の研究などにつながったのだと理解している。(もちろん2次元共形場理論によるアプローチも重要であったが)

 

追記の個人的メモ:

・"J>0"などの短い数式に毎回 ... と書くのは少し面倒

・脚注的なものの付け方

・更新前に数式のチェック

The first submission

IT業界の方達が活発的に情報発信されているのを見て、思い切って書き始める事にしてみました。

 

2016年10月現在大学院で理論物理学を研究中、来年からデータサイエンティストとして働きます。内容は今流行りの機械学習クラウド関連と、趣味で勉強している暗号理論などと同時に、物理学や数学などについてもまとめていけたら、と考え中です。未熟者の落書き帳みたいなものなので内容についての信憑性は保証できない場合があります。また一般的に知られていると思われる内容(検索してそこそこの記事が見つかる案件)に関して引用はしない事が多いと思います。

 

基本的にメモの延長なので(今まで書き溜めていたメモを公開する事で自分の中で整理できるのでは、と期待)、現時点では読者がいる事をあまり想定しません。議論・コメントは基本歓迎いたしますが、そうでないもの(あまりに一方的で、論理的に破綻しているもの、あるいは議論の意志が感じられないもの)については無視いたします。

また敬体と常体が混合しています。以上の点について予めご了承ください。また言語は練習もかねて、英語で書く事もあります。