使用mpmath实现Chudnovsky算法时触发TypeError错误求助
问题描述
尝试用Python的mpmath库实现Chudnovsky算法,代码如下:
from mpmath import * import csv mp.dps = 100; mp.pretty = True x = mpf(426880)*sqrt(10005)*(nsum(lambda q: ((mpf(-1))^(q)*fac((mpf(6)*q))*(mpf(545140134*q+13591409)))/((fac(mpf(3*q)))*(fac(q)^(mpf(3)))* (mpf(-262537412640768000))^(q)), [0, inf]))^(mpf(-1)) with open('main.txt', 'w', newline='') as txt: txt.write(str(x))
运行时出现错误:
Traceback (most recent call last): File "C:\Coding Adventures\Python\millionpi\V2\main.py", line 4, in <module> x = mpf(426880)*sqrt(10005)*(nsum(lambda q: ((mpf(-1))^(q)*fac((mpf(6)*q))*(mpf(545140134*q+13591409)))/((fac(mpf(3*q)))*(fac(q)^(mpf(3)))*(mpf(-262537412640768000))^(q)), [0, inf]))^mpf(-1) File "C:\Coding Adventures\Python\millionpi\venv\lib\site-packages\mpmath\calculus\extrapolation.py", line 1718, in nsum return +ctx.adaptive_extrapolation(update, emfun, options) File "C:\Coding Adventures\Python\millionpi\venv\lib\site-packages\mpmath\calculus\extrapolation.py", line 1165, in adaptive_extrapolation update(partial, xrange(index, index+step)) File "C:\Coding Adventures\Python\millionpi\venv\lib\site-packages\mpmath\calculus\extrapolation.py", line 1706, in update psum = psum + g(ctx.mpf(k)) File "C:\Coding Adventures\Python\millionpi\venv\lib\site-packages\mpmath\calculus\extrapolation.py", line 1753, in g return f(*args) File "C:\Coding Adventures\Python\millionpi\venv\lib\site-packages\mpmath\calculus\extrapolation.py", line 1808, in g return f(*args) File "C:\Coding Adventures\Python\millionpi\V2\main.py", line 4, in <lambda> x = mpf(426880)*sqrt(10005)*(nsum(lambda q: ((mpf(-1))^(q)*fac((mpf(6)*q))*(mpf(545140134*q+13591409)))/((fac(mpf(3*q)))*(fac(q)^(mpf(3)))*(mpf(-262537412640768000))^(q)), [0, inf]))^mpf(-1) TypeError: unsupported operand type(s) for ^: 'mpf' and 'mpf'
解决方案
错误根源是Python中^是按位异或运算符,不是幂运算符号,mpmath的mpf对象不支持该操作,因此报错。
修复步骤
把代码中所有的^替换为Python的幂运算符**,修改后的代码如下:
from mpmath import * import csv mp.dps = 100; mp.pretty = True x = mpf(426880)*sqrt(10005)*(nsum(lambda q: ((mpf(-1))**(q)*fac((mpf(6)*q))*(mpf(545140134*q+13591409)))/((fac(mpf(3*q)))*(fac(q)**(mpf(3)))* (mpf(-262537412640768000))**(q)), [0, inf]))**(mpf(-1)) with open('main.txt', 'w', newline='') as txt: txt.write(str(x))
额外优化建议
fac函数支持直接传入整数,无需将6*q、3*q等转成mpf,直接用整数计算更高效;- 提前定义算法常量,提升代码可读性:
from mpmath import * import csv mp.dps = 100 mp.pretty = True # 定义Chudnovsky算法常量 CONST_MULTIPLIER = 426880 CONST_SQRT = sqrt(10005) CONST_DENOM_POW = -262537412640768000 # 计算级数项 series_sum = nsum(lambda q: ((-1)**q * fac(6*q) * (545140134*q + 13591409)) / (fac(3*q) * (fac(q)**3) * (CONST_DENOM_POW**q)), [0, inf]) # 计算π值 pi_result = CONST_MULTIPLIER * CONST_SQRT * (series_sum ** (-1)) # 写入文件 with open('main.txt', 'w', newline='') as txt: txt.write(str(pi_result))
内容的提问来源于stack exchange,提问作者I_like_python
相关产品推荐
相关产品推荐

