gpt4 book ai didi

algorithm - Fuss-Catalan 数字的 Julia 内存代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:05:26 24 4
gpt4 key购买 nike

来自 Fuss-Catalan 系列 C{4}_n(参见整数序列在线百科全书 OEIS A002293),我想使用内存计算第 n 项。我在下面编写的代码有效,但在我的笔记本电脑上当 n=200 时大约需要 43 秒。有没有办法进一步加快速度?

numterms = 20
C4 = Array{BigInt}(numterms+1) # memoization dictionary
fill!(C4,-1) # -1 implies not yet computed
C4[1] = 1 # Base case for n=0, C[n+1] provides nth term

function catalan4(n,C)
C[n+1] == -1 || return C[n+1]
sum1 = convert(BigInt,0)
for i in 1:n
sum2 = convert(BigInt,0)
for j in 1:(n-i+1)
sum3 = convert(BigInt,0)
for k in 1:(n-i-j+2)
sum3+= catalan4(k-1,C)*catalan4(n-i-j-k+2,C)
end
sum2 += catalan4(j-1,C)*sum3
end
sum1 += catalan4(i-1,C)*sum2
end
C[n+1] = sum1
return sum1
end

for i in 1:numterms
println(i,"\t",catalan4(i,C4))
end

这按预期提供:

1   1
2 4
3 22
4 140
5 969
6 7084
7 53820
8 420732
9 3362260
10 27343888
11 225568798
12 1882933364
13 15875338990
14 134993766600
15 1156393243320
16 9969937491420
17 86445222719724
18 753310723010608
19 6594154339031800
20 57956002331347120

谢谢!

最佳答案

我怀疑糟糕的 BigInt 性能是罪魁祸首。您可能想尝试 Nemo ,它使用 Flint library对于任意精度整数,据我所知效率要高得多。如果你想留在标准的 Julia 中(Nemo 是基于 Julia 的,但在某些语言语义上与 Julia 不同,afaik - 它是一个计算机代数系统)并且你的数字被限制为小于 2^127,那么你可以尝试使用Int128 相反——这些可以堆栈分配并保存在寄存器中,不像 BigInts,它必须是堆分配的,而 LLVM 不知道如何推理(它无法将新 BigInts 的创建转换为现有的变异)。创建自定义 Int256Int512 类型并使用两个/四个 Int128 值来进行运算可能并不难,特别是如果您只需要支持加法和乘法。

关于algorithm - Fuss-Catalan 数字的 Julia 内存代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42686615/

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