gpt4 book ai didi

python - 在 python 中是否有等效于 Perl 的大 float 据类型?如果我在 python 中执行 factorial(500)

转载 作者:行者123 更新时间:2023-11-28 22:23:15 24 4
gpt4 key购买 nike

Python 中是否存在与 Perl 的 BigFloat 数据类型等效的数据类型?我问的原因是我想使用它的定义 n!/k!*(n-k)! 来计算 nCk。

对于 Perl 的 BigFloat 数据类型,根据定义的计算对于任何 n 和 k 都可以正常工作。例如

阶乘(500)/阶乘(10)*阶乘(490)

当 n 和 k 是 BigFloats 时产生准确的答案。

在 Python 中,factorial(500) 和 factorial(10)*factorial(49) 都使用 Python 用于 int 的任何内容给出准确的答案。因此,python 似乎可以进行非常高精度的算术运算。然而商

整数(阶乘(500)/(阶乘(10)*阶乘(490))

接近准确答案,但还差一点?

有没有办法从 python 中为上述表达式得到准确的答案?

最佳答案

Python 的 int 对象可以根据需要变大(仅受可用内存量的影响),因此它们可用于涉及大数的计算。在 Python 2 中,有 2 种整数类型,intlong,其中 int 用于适合机器整数的值,但在 Python 中3 它们已合并为一个 int 类型。

Python 没有内置的 BigFloat 类型,但标准库有 decimal可以进行基本算术运算的模块,包括平方根,达到任何所需的精度。如果您需要使用更多函数进行任意精度数学运算,请参阅优秀的第 3 方库,mpmath .

在计算二项式系数时,您可以安全地使用 // 底除法,因为分母中的项可以保证除以分子。例如

from math import factorial

a = (factorial(500) // factorial(490)) // factorial(10)
print(a)

输出

245810588801891098700

但是,用一个简单的循环来计算二项式系数可能比计算那些巨大的阶乘更有效。

def binomial(n, r):
''' Binomial coefficients '''
if not 0 <= r <= n:
return 0
p = 1
r = min(r, n - r)
for i in range(1, r+1):
p *= n
p //= i
n -= 1
return p

# Test

print(binomial(500, 10), '\n')

for i in range(10):
print([binomial(i, j) for j in range(i+1)])

输出

245810588801891098700 

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

关于python - 在 python 中是否有等效于 Perl 的大 float 据类型?如果我在 python 中执行 factorial(500),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47131771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com