You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:20:51