daruma3940の日記

理解や文章に間違い等あればどんなことでもご指摘お願いします

線形リー群についての備忘録
(まともに参考にしないほうがいい)
例として2次元回転群SO(2)を考えよう
これの元を

A(t)=
\left(
\begin{array}{rr}
cost & -sint \\
sint & cost \\
\end{array}
\right)
とする
A(0)を単位元とする
A(t)のすべての元を考えて取り扱うのは難しいので単位元のまわりにげんていして考えよう
これは線形近似で
 A(Δt) =A(0)+A(0)^{' }Δt+O(Δt^{2})
とかける
変形すると
 (A(Δt)-A(0))/Δt =A(0)^{' }A(0)
 dA(t)/dt =XA(0)
ここで
 A(0)^{' }=X
とした
この微分方程式の解は
 A(t)=exp(tX)
の形になる
JJサクライで時間発展とか平行移動とかでまずは微小な変化について考えていたけどそこの議論と実は同じ
そしてJJサクライで生成演算子と呼ばれているのは実はここで言うXのこと

ここで注意が必要なのがこれは単位元の周辺でしか成り立っていないということ
これをすべての元について適応させるには条件がある


コンパクトで連結なとき任意の元は
 exp(tX)でひとつの指数関数で表すことができる

コンパクトではない時は任意の元は

 exp(tX_{1})exp(πX_{2})のようになる ひとつの指数関数では表すことは出来ない


ノンコンパクト群とはパラメーターの変域が無限空間に渡るもの
コンパクト群はパラメーターの変域が有限である群



GL(2,R)群の元

M=
\left(
\begin{array}{rr}
 - \lambda & 0 \\
 0 &  -1/ \lambda \\
\end{array}
\right)
について考えよう
 exp(logM)=M


logM=
\left(
\begin{array}{rr}
 log(- \lambda) & 0 \\
 0 &  log(-1/ \lambda) \\
\end{array}
\right)

logの中身が負なのでこれは複素数
ということは単位源からM(GR(2,R)郡の元)に直接行くのにGR(2,C)を経由してしまっている!

そこでGR(2,C)を経由せずにGR(2,R)だけで単位源からMに到達するために、少し迂回をするルートを取る。

\left(
\begin{array}{rr}
cos \pi  & -sin \pi \\
sin \pi & cos \pi \\
\end{array}
\right)
=

\left(
\begin{array}{rr}
 -1 & 0 \\
 0& -1 \\
\end{array}
\right)


\left(
\begin{array}{rr}
\lambda  & 0 \\
 0 & 1/ \lambda \\
\end{array}
\right)

を経由する必要がある
なので
 exp(tX_{1})exp(πX_{2})の形で表される

この前javacが必要になることがあって焦ってjdkの新しいのを入れてしまったからか、javaのバージョンアップをしたからか
原因はわからないけどUnityでAndroidビルドが出来なくなってたのでその解決をした
何を血迷ったのかアンドロイドスタジオの更新もしてしまって簡単だったはずの問題がややこしくなってしまった(´・ω・`)


基本的にこれをするだけ
tools_r25.2.3-windowsは本家サイトにはおいてなくて怪しいサイトにしか置いてなかった(怖い)(本家サイトでどこに置かれてるか知ってる人いれば教えて)
androidsdkoffline.blogspot.jp

これでapk作成はできるようになったんだけどkey着きでapk作成が出来なかった
halcyonsystemblog.blog.fc2.com
このサイトを見てコマンドを打って手動でkeyつきapk作成をした

zipalign -v -p 4 pao.apk piyo.apk
apksigner sign --ks hoge.keystore piyo.apk

こんな方法を使わずに普通にビルドできる方法を知ってる人がいれば教えてください

Juliaについての備忘録

Juliaについての備忘録(参考にしないほうがいいです)
^インストール

ーーーーーーwindows
上のツイートに書かれてあるようにjuliapProを使ってインストールした
メールアドレスとパスワードを求められるので入力するとこんなメールが届く。
f:id:daruma3940:20180128105651p:plain
ここでJuliaPro-0.6.2.1 (for Windows)をクリックするとwindows版のインストーラー(700MBぐらい?)を入手できる
後はそれに従ってインストールする(2GBぐらい)
JuliaはPythonと連携を取ることができるが
Julia Proフォルダの中にもPythonが入っていて最初はそれと連携をとろうとしているので
以前から入っていたpythonと連携を取らせるためには
Jupyter Notebook Viewer
を参考に
ENV["PYTHON"]="C:\\hoge\\python.exe"
Pkg.add("PyPlot")
でこれまで用いていたpythonのpathを指定する。

ーーーーーーubuntu
ubuntuもJuliaProを使ってインストールした
JuliaPro-0.6.2.1 (for Linux)をクリックすると冷凍されたファイルが手に入る。
https://juliacomputing.com/docs/JuliaProQuickStartGuide-Linux.pdf
スタートガイドには
install_juliapro.shが必要だと書かれているがこれは
さっきのメールのJuliaPro Installer (for Linux)をクリックするとinstall_juliapro.txtが手に入るのでそれを.shに拡張子を変える

インストールに必要なものもさっきのスタートガイドP.3に指定されているのでそれをインストールする
sudo apt-get update
sudo apt-get -y install gcc
sudo apt-get -y install python2.7-dev
sudo apt-get -y install libzmq5
sudo apt-get -y install hdf5-tools
sudo apt-get -y install default-jdk
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el7_3.x86_64

これで install_juliapro.sh <冷凍されたファイルの場所> <解凍する場所> を実行
最初にインストールに必要なものがそろってるかのチェックが行われる。
私の環境ではインストールに必要なものチェックがうまくいってなかった
(
apt list $req_app | grep installed
みたいな操作が行われていたがこれがちゃんと動いてなかった
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
ので
)
インストールに必要なものは揃っているはずだしこのチェック部分をコメントアウトして無理矢理動かした(おいおい)
私の知り合いは install_juliapro.shを使わずその場に解凍して使おうとしたらしいけれどPythonとの連携がうまくいかなかったらしい

jupyterでjuliaを使おうとするのに手間取ってしまった


ここに書いてある方法で解決した
jupyter.exeへのpathを調べるには
ターミナルでwhich jupyterを使えばよい
^書き方
bicycle1885.hatenablog.com
↑のサイトが結構わかりやすい

C++でいうクラスのようなものがないのがちょっと悲しい(あるなら教えて)
typeとimmutableというのがあるがこれはあくまでもデータ型であってメンバ関数を取ることはできない。
それらを受け取って処理する関数を外に作成しろということらしい。

indexが1から始まる(Fortranに合わせているらしい)

^感想
パッケージ追加がパッケージ追加後プリコンパイルしているようでクッソ遅い
計算は早いらしいがjulia自身の起動が遅いので小回りが利かない。


私の書いたプログラムはpythonに比べて早くならなかったので否定的な感想ばかりになってしまったけど
スピン系を扱ってる知り合いはテンソル積が簡単にかけるうえに速度が速いので結構気に入っているらしいです

hogehogehogehoge

pythonで書いたコードをJuliaで書き直してッ見た
早くなるのかな~~と思ったら早くなってなかったのでう~~ん
まあ完全に同じ方法をとっているわけではないので単純な比較はできないんだけどもぉpythonより遅いというのはどうもなぁ(´・ω・`)
まあpythonで書いたコードは結構numpyで高速化してたからなぁ

juliaはindexが1から始まる(Fortranと合わせているらしい)
あとクラスはなくて構造体みたいな使い方をするType,immutableというのが存在する
あとパッケージ追加システムがパッケージインストールした後プリコンパイルしてるみたいでクッソ遅い
あと計算は早いらしいけど起動がクッソ遅いので小回りが利かない感じであんまり使いやすくない
エラーメッセージもようわからんなぁ(´・ω・`)
忘れないうちにjulia備忘録的なものを書いておこう(´・ω・`)

hogehogepiyopiyo

Juliaについて書くかと思ったけど眠いので寝ますね
windowsでは
Jupyter Notebook Viewer
これを参考に開発環境を整えることができました
ubuntuではまだです
これまで数値計算はいったん簡単に書けるpythonで書いてアルゴリズムを確認してから
速度のことを考えてC++に書き写すということをしてきましたが
Juliaでそんなことしなくて済むようになってくれればうれしいですね

(おまけ)
github.com

カオスのライブラリもあって簡単に標準写像も書けました

パッケージのインストールPkg.add("hoge")が遅くてめんどくさいっすね
文法はこれからちょっとずつ勉強していきます

調和振動子のエネルギー固有状態の式についてオーバーフローを起こさない計算法

daruma3940.hatenablog.com

この前の続きです

この前は  (2^n n!)^{-1/2} をオーバーフローを起こさずに計算する方法についてと
それが量子的な調和振動子のエネルギー固有状態に出てくるという話をしました。
↓エネルギー固有状態の式
  \phi_n (x)= AHn( \xi )exp(- \xi^2 /2 )
ここで
  \xi = \frac{x}{x_0}
  A= \frac{C}{ \sqrt{n! 2^n} }
としてみました。
Cとかx0が何かはここに書いてる
調和振動子 - Wikipedia

Hnはエルミート多項式なのですが、これがやべーやつ
  H_{n+1}(\xi )=2 \xi  H_{n}(\xi ) +2 n H_{n-1}(\xi )

なので  (2^n n!)^{-1/2} が計算できるようになっても結局オーバーフローします
さっきのΦについての式をHnについて書き直してみましょう
  Hn( \xi )= \sqrt{ \frac{n! 2^n}{C} } exp( \xi^2 /2) \phi_n(x)
これをさっきの
  H_{n+1}(\xi )=2 \xi  H_{n}(\xi ) -2 n H_{n-1}(\xi )
に代入してまとめると
  \phi_{n+1} =\sqrt{ \frac{2}{n+1}} \xi \phi_{n} - \sqrt{ \frac{n}{n+1}} \phi_{n-1}

なのでn=0 とn=1について計算すれば計算出来ちゃいます

def zenka_oscn(n, x):
    if (n == 1 or n == 0):
        return occeogenfanclist[n](x)
    else:
        return ((2 / n) ** 0.5) * x/x0 * zenka_oscn(n - 1, x) - (((n - 1) / n) ** 0.5) * zenka_oscn(n - 2, x)

これを単純に計算しようとすると重いのでフィボナッチ数列の場合のようにメモ化(キャッシュ化?)してみましょう
pythonのメモ化はクッソ簡単です
頭に@lru_cache(maxsize=hoge)をつけるだけです。やっぱりpython便利

from functools import lru_cache

@lru_cache(maxsize=None)
def zenka_oscn(n, x):
    if (n == 1 or n == 0):
        return occeogenfanclist[n](x)
    else:
        return ((2 / n) ** 0.5) * x/x0 * zenka_oscn(n - 1, x) - (((n - 1) / n) ** 0.5) * zenka_oscn(n - 2, x)

これめっちゃ賢いなぁ~~と感心したのですがどうでしょう?

numpy.liag.eighの使い方について

numpy.liag.eighはnumpyのエルミート行列の固有値固有ベクトルを求める場合に使います
こんな感じ

eigval, eigvec = LA.eigh(a)

僕はこれの使い方をちゃんとわかっていませんでした
eigvecは2次元配列です何個目の固有ベクトルかとその固有ベクトルの何番目の成分かというので2次元になっています

つまり
eigvec[a][b]
とあらわされます
C++とかにおける二次元配列の扱いに慣れているとevec[a][b]は[a個目の固有ベクトル][この固有ベクトルのb番目の成分]と並んでいると勘違いしてしまいますね(僕だけかもしれないが)
しかしeighで帰ってくる固有ベクトルはevec[この固有ベクトルのa番目の成分][b個目の固有ベクトル]という順番で並んでいます。
マニュアルを読んでみてください。そう書かれてますね
numpy.linalg.eigh — NumPy v1.14 Manual

(この並びにしてる理由は行列の掛け算則に乗るようにしてるのだと思いますが確申が持てません 間違ってたら指摘して)

僕はこれを数ヶ月勘違いしたまま「データが取れないデータが取れない」とうんうん悩んでました当たり前ですね
皆さんもこういうライブラリを使うときはちゃんとマニュアルを読んで使いましょうね