読者です 読者をやめる 読者になる 読者になる

Diary over Finite Fields

515ひかるが書き溜めたメモとコラムと雑記

代数計算をやってみる[備忘録]

プログラミング 数学

珍しく数学も関連する話をする. が, 今回は備忘録なので正確性とかは期待しないで欲しい. 二時間くらいしかいじっていないし.

Weierstrass の {\wp} 関数というのがあるという話は以前にしたと思う.{L}を格子とし、

{\begin{equation}
\wp (z) = \displaystyle\sum_{z \in \mathbb{C}\setminus L}\left(\frac{1}{(z-l)^2} - \frac{1}{l^2}\right)
\end{equation}}

が Weierstrass の {\wp} (ぺー)関数である。

これの {z=0} の周りでのローラン展開を計算すると, こうなる.*1

{\begin{equation}
\wp(z) = \displaystyle\frac{1}{z^2} + 3G_4z^2 + 5 G_6z^4 + 7 G_8 z^6 + 9 G_{10} z^{8} + \cdots
\end{equation}}

ただしここで、 {G_k =\displaystyle \sum_{l\in L\setminus 0}l^{-k}}

この級数{\wp'}, {(\wp')^2}, {\wp^2}, {\wp^3} を計算する場面があったのだけど, 大変.

大変なので, Python とかでできないかなと調べてみたら, Sympy というものを使って簡単にできそうだった.

#!/usr/bin/env python

from sympy import *

z = Symbol('z')
g4,g6,g8,g10 = symbols('g4 g6 g8 g10')

pz = 1 / z ** 2 + 3 * g4 * z**2 + 5 * g6 * z**4 + 7 * g8 * z**6 + 9 * g10 * z**8
pz_sq = expand(pz**2)
pz_tri = expand(pz**3)
pz_diff = diff(pz, z)
pz_diff_sq = expand(pz_diff**2)

print(pz.series(z))
print(pz_diff.series(z))
print(pz_diff_sq.series(z))
print(pz_sq.series(z))
print(pz_tri.series(z))

実行結果はこんな感じ.

z**(-2) + 5*g6*z**4 + 3*g4*z**2 + O(z**6)
-2/z**3 + 42*g8*z**5 + 20*g6*z**3 + 6*g4*z + O(z**6)
4/z**6 + z**2*(36*g4**2 - 168*g8) + z**4*(-288*g10 + 240*g4*g6) - 80*g6 - 24*g4/z**2 + O(z**6)
z**(-4) + z**4*(9*g4**2 + 14*g8) + 10*g6*z**2 + 6*g4 + O(z**6)
z**(-6) + z**2*(27*g4**2 + 21*g8) + z**4*(27*g10 + 90*g4*g6) + 15*g6 + 9*g4/z**2 + O(z**6)

なんか表示が気に入らない, 読みにくい. うーん……あと合っているのかわからないし*2変なトコでぶつ切りにされている.

まいまはあまり時間がないのでこれくらいにしておこう......読みにくいのでブログには数式表記で書こうかと思ったけどひとつで力尽きた.

{\begin{equation}
\wp'(z) =\displaystyle \frac{-2}{z^3} + 6 G_4 z + 20 G_6 z^3 + 42 G_8 z^5 + \cdots
\end{equation}}

*1:こういう数学の部分の正確な話は書き始めるときりがないので, なんててきとうな書物を読んで欲しい.

*2:低次の項はたぶん合っている.