如何定义首参数为整数列表的Python MZVs部分和计算函数?
多重Zeta值(MZVs)部分和的Python函数优化
数学领域的**多重zeta值(MZVs)**理论于1992年左右被提出,研究的是参数化嵌套无穷级数的性质,这类数值的计算复杂度较高。近期我尝试用Python计算特定MZVs的基本部分和。
以下代码可通过修改S和n,计算多重zeta-star值(如$\zeta^*(10,2,1,1,1)$)的第20项部分和,或其他类似实例:
S = (10, 2, 1, 1, 1) n = 20 l = len(S) def F(d, N): if d == 0: return 1 else: return sum(F(d-1, k)/(k**S[-d]) for k in range(1, N+1)) print(F(l, n))
d维MZVs的部分和本质上由构成d元组$(s₁,…,s_d)$的参数以及求和上限$n$决定。
我的疑问是:能否定义一个调用更友好的函数F([s₁,…,s_d], n),第一个参数为整数列表,第二个参数为求和上限$n$?无需分别定义S和n,直接以F([10, 2, 1, 1, 1], 20)或F([2, 1], 100)这类形式调用。
优化后的实现
可以通过嵌套递归函数的方式实现需求,把参数列表作为函数的第一个输入,内部复用原有的递归逻辑:
def F(s_list, n): def inner(d, N): if d == 0: return 1 else: # 复用原逻辑,从传入的参数列表中取对应元素 return sum(inner(d-1, k)/(k**s_list[-d]) for k in range(1, N+1)) # 调用内部递归函数,传入参数列表的长度和求和上限 return inner(len(s_list), n) # 调用示例 print(F([10, 2, 1, 1, 1], 20)) print(F([2, 1], 100))
这个版本的函数直接接收参数列表和求和上限,调用方式更直观,完全保留了原有的计算逻辑,同时避免了单独定义全局变量S的步骤。
内容的提问来源于stack exchange,提问作者Marian G.
相关产品推荐
相关产品推荐

