Wolfram mathematica Mathematica';这是对#^2&;的令人费解的解释范围[n]

Wolfram mathematica Mathematica';这是对#^2&;的令人费解的解释范围[n],wolfram-mathematica,range,Wolfram Mathematica,Range,我对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将非常

我对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]

回想起来,这可能不是个好主意。(我本可以只使用模块“计算”范围一次。)

由于
n
未定义,
Range[n]
对其自身进行计算。因此,
Map
像在任何其他符号头上一样作用于它,将您的函数映射到它的元素上-这里它只是
n

In[11]:= #^2 & /@ someHead[n]
Out[11]= someHead[n^2]
编辑


解决编辑中的问题-对于数值
n
Range
的计算结果是一个列表,这样您就得到了预期的结果(即
Range[5]^2
。这都是关于计算顺序的。要获得
Range[5^2]
,您可以使用
^2&/@Unevaluated[Range[5]]
,在这种情况下,一切都会发生,就像上面提到的符号的
n
一样)。实际上,
Range
会在非数字输入时发出错误消息。同样,这与问题无关,但是像
^2&
这样的函数是可列出的,您不必映射它们。

稍微偏离主题,但是您可以通过重新定义FactorInteger来提高速度,然后每个输入只调用一次FactorInteger

f1[n_] := PrimeOmega[Range[n]] - PrimeNu[Range[n]]
f2[n_] := With[{fax=FactorInteger[#]}, Total[fax[[All,2]]]-Length[fax]]& /@ Range[n]
例如:

In[27]:= Timing[pdiff1 = f1[2^20];]
Out[27]= {37.730264, Null}

In[28]:= Timing[pdiff2 = f2[2^20];]
Out[28]= {9.364576, Null}

In[29]:= pdiff1===pdiff2
Out[29]= True

Daniel Lichtblau

@Wizard先生,我现在在mma标签中回答了200个问题,但其中一个是社区维基。生活是艰难的。。。谢谢你的投票,我明白了。我们将预期的时间再延长一点。我从你关于
someHead
的例子中收集到,问题不在于head,
Range
,而在于
n
。我同意你关于
Range
Listable
@yoda的观点,事实很简单。“我与我们SO标签的主要爆米花供应商签订了合同,仅此而已。@DavidCarraher我指的是Leonid的评论,他说他与爆米花供应商有勾结,这就是为什么他不断删除他的答案,进一步推迟他不可避免的金徽章,从而使我们大家都处于座位边缘,这导致我们在大喜日子前消费更多爆米花,导致爆米花销量增加,最终会回到他的口袋里。呸!那真是一团糟。关于编辑部分,恐怕你找不到内存足够容纳
范围[2^50]
的机器。你真的需要所有这些数字吗?同时也需要吗?@Leonid。不是同时。我想我可以循环并保持一个总的差异,比如说,通过使用
Sum
。你可能把范围[5^2]和范围[5]^2混淆了吗?至于2^50,“列奥尼德说了什么”@David我明白了。如果你只需要差额的总和,那么分块移动会更快,比如说几百万左右。或者,您也可以将循环编译为“C”。但是,我做了一些实验,看起来即使是10^4的第一个整数,也需要大约0.5秒。双向的。瓶颈似乎在素数函数本身。我不知道手工实现它们是否能快得多(比如说,使用
编译
,或者用C编写并作为dll加载),但是,要处理数字,它们必须快得多。@LeonidShifrin幕后的factorynteger才是瓶颈。对于该大小范围内的数字,我怀疑,除非使用类似的方法,但更好地调整启发式(例如,截止值),否则将获得更多。可能有意思(恰好是两天前):+1这些结果真的让我吃惊。我的想法正好相反@DavidCarraher[你是说pdigg2==pdiff1???]严肃地说,让我惊讶的是,它们似乎是4的因子,而不是2的因子。我已经证实(至少有几个案例)PrimeOmega和PrimeNu每次调用FactorInteger正好一次,所以我不明白为什么第一次调用要慢4倍。即使我颠倒顺序,它也会发生,所以这在任何方面都不是缓存现象。