【发布时间】:2011-10-14 15:05:28
【问题描述】:
我对 Mathematica 对以下问题的回应感到困惑:
ClearAll[n]
#^2 & /@ Range[n]
#^2 & /@ Range[n] // StandardForm
似乎连 Mathematica (8.0) 都不相信它刚才说的话:
#^2 & /@ Range[5]
Range[5^2]
对正在发生的事情有什么想法吗?
编辑:
这个问题的原始上下文如下。我写过
PrimeOmega[Range[n]] - PrimeNu[Range[n]]
由于 n 将非常大(2^50),我想我可以通过将其重写为来节省时间:
PrimeOmega[#] - PrimeNu[#] &/@Range[n]
回想起来,这可能不是一个好主意。 (我本可以使用 Module 只“计算”一次 Range。)
【问题讨论】:
-
关于 edit 部分 - 恐怕你找不到一台内存足够容纳
Range[2^50]的机器。你真的需要所有这些数字吗? -
@Leonid。不是同时。我想我可以通过使用
Sum循环并保持差异的总和。 -
您是否将 Range[5^2] 与 Range[5]^2 混淆了?至于 2^50,“列昂尼德说的话”。
-
@David 我明白了。如果您只需要差的总和,那么大块移动会更快,比如几百万个数字左右。或者,或者,您可以将循环编译为“C”。但是,我做了一些实验,似乎即使对于 10^4 个第一个整数,你也需要大约 0.5 秒。双向。瓶颈似乎在 Prime 中 - 功能本身。是否可以手动更快地实现它们(例如,使用
Compile,或者用 C 编写并加载为 dll),我不知道,但是,要为您的数字工作,它们必须 非常快得多。 -
@LeonidShifrin 幕后的 FactorInteger 是瓶颈。对于该大小范围内的数字,我怀疑除非使用类似的方法但更好地调整启发式方法,否则会获得很多收益。用于截止。可能感兴趣(巧合的是两天前):lists.apple.com/archives/scitech/2011/Oct/msg00009.html