我在 python 中开始了一个小项目,假设在 scipy 等库中很容易找到用于数值计算 Clebsch-Gordan 系数的例程。到了做的时候,我实际上发现很难找到合适的库。Scipy 似乎没有它。我正在寻找一种开源的解决方案,不会在我自己的代码中添加很多代码行,不需要我为 C 库编写自己的胶水代码,并且可以在 debian 中使用库——换句话说,一个非常简单的即插即用解决方案。似乎确实有 GSL 的绑定,但似乎没有一个是为 debian 打包的。
我能想出的最佳解决方案是:
import numpy,sympy
from sympy.physics.quantum.cg import CG
class Memoize:
# https://stackoverflow.com/a/1988826/1142217
def __init__(self, f):
self.f = f
self.memo = {}
def __call__(self, *args):
if not args in self.memo:
self.memo[args] = self.f(*args)
return self.memo[args]
def clebsch(j1,m1,j2,m2,j3,m3):
"""
Computes <j1 m1 j2 m2 | j3 m3>, where all spins are given as double their values.
"""
# https://docs.sympy.org/latest/modules/physics/quantum/cg.html
# https://mattpap.github.io/scipy-2011-tutorial/html/numerics.html
return CG(sympy.S(j1)/2,sympy.S(m1)/2,sympy.S(j2)/2,sympy.S(m2)/2,sympy.S(j3)/2,sympy.S(m3)/2).doit().evalf()
clebsch = Memoize(clebsch)
这使用 sympy 符号数学库以符号方式计算 CG 系数,然后对结果表达式进行数值计算。由于 memoization,性能实际上并不太糟糕,但是由于我必须加载 sympy. 将符号数学用于数值应用似乎也很愚蠢。
我在网上找到了一些人的原生 python 实现,但似乎没有什么是高质量的实现,使用其中一个需要将他们的代码剪切并粘贴到我的代码中,从而使我希望的代码行数膨胀一个小而优雅的程序。
有什么建议?
[编辑] 我在 SciPy 中打开了一个功能请求,随后讨论了是否有一个可以复制或采用的实现,并具有适当的许可证。