Wigner 3nj記号について雑な説明
Wigner 6j記号から定義できる一連の関数で、量子力学まわりでたまに出てきます。6j, 9j, 12j, ...と続きます。
まず3j記号を定義します。リンク先にあるようにClebsch–Gordan係数の対称性をちょっといい感じにした量です。
https://en.wikipedia.org/wiki/3-j_symbol
6j記号は3j記号を用いてリンク先のように定義できます。
https://en.wikipedia.org/wiki/6-j_symbol
9j記号以降は6j記号を用いて以下のように定義されます。
第一種3nj記号
\begin{Bmatrix} j_1 & j_2 & \ldots & j_n \\ l_1 & l_2 & \ldots & l_n \\ k_1 & k_2 & \ldots & k_n \end{Bmatrix} = \sum_x(-1)^{R_n + (n-1)x} \begin{Bmatrix} j_1 & k_1 & x \\ k_2 & j_2 & l_1 \end{Bmatrix} \begin{Bmatrix} j_2 & k_2 & x \\ k_3 & j_3 & l_2 \end{Bmatrix} \cdots \begin{Bmatrix} j_{n-1} & k_{n-1} & x \\ k_n & j_n & l_{n-1} \end{Bmatrix} \begin{Bmatrix} j_n & k_n & x \\ j_1 & k_1 & l_n \end{Bmatrix}
第二種3nj記号
\begin{bmatrix} j_1 & j_2 & \ldots & j_n \\ l_1 & l_2 & \ldots & l_n \\ k_1 & k_2 & \ldots & k_n \end{bmatrix} = \sum_x(-1)^{R_n + nx} \begin{Bmatrix} j_1 & k_1 & x \\ k_2 & j_2 & l_1 \end{Bmatrix} \begin{Bmatrix} j_2 & k_2 & x \\ k_3 & j_3 & l_2 \end{Bmatrix} \cdots \begin{Bmatrix} j_{n-1} & k_{n-1} & x \\ k_n & j_n & l_{n-1} \end{Bmatrix} \begin{Bmatrix} j_n & k_n & x \\ k_1 & j_1 & l_n \end{Bmatrix}
$x$ は三角不等式を満たす全ての値です。また
R_n = \sum_{i=1}^n(j_i + k_i + l_i)
ここでは以下の文献の(17.1)および(17.2)式の定義を引用しました。どうやら文献によって定義がまちまちらしいです。
A. P. Yutsis, I. B. Levinson, and V. V. Vanagas, Mathematical Apparatus of the Theory of Angular Momentum (Israel Program for Scientific Translations, Jerusalem, 1962).
ご覧の通りどちらも6j記号をくるっと一周する形となっています。一種と二種は位相と、一周するときにひねりを入れるか(最後の6j記号のところ)の違いです。
実装
Rustでの実装を探してみると、すでにこの方が9j記号までは多倍長演算のライブラリを作っていました。
もともとWigner15j記号が必要だったので、このライブラリに追加するかどうか迷ったのですが、
多倍長演算でなければ一般のnに簡単に拡張できそうだったので、最初から作り直して雑に公開しました。
(READMEとかはサボって書いていない)
今回Rustが最初だったのもあり、とりあえず全部f64とかになっています。
大変だったこと
テストのために正しい値が必要だったのですが、12j記号以降はWolfram Alphaにも実装されていないようだったので、
簡単な場合に手計算などで地道に求めた値を使いました。なので一般のときには正しい値とのずれがあるかもしれません。
このあたり数値計算している人たちはどうしているのだろう。。。