Mathematica对#^ 2& amp; / @ Range [n]

时间:2011-10-14 15:05:28

标签: wolfram-mathematica range

我对Mathematica对以下内容的回应感到困惑:

ClearAll[n]
#^2 & /@ Range[n]
#^2 & /@ Range[n] // StandardForm

Range1

似乎即使Mathematica(8.0)也不相信它刚才所说的内容:

#^2 & /@ Range[5]
Range[5^2]

Range2

有关正在发生的事情的任何想法?

修改

这个问题的原始背景如下。我写过

PrimeOmega[Range[n]] - PrimeNu[Range[n]]

因为n会非常大(2 ^ 50),我想我可以通过重写它来节省时间:

 PrimeOmega[#] - PrimeNu[#] &/@Range[n]

回想一下,这可能不是一个好主意。 (我本来可以用Module来“计算”Range只一次。)

2 个答案:

答案 0 :(得分:15)

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

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

编辑

在编辑中解决问题 - 对于数字nRange可以正确评估列表,并获得预期结果(Range[5]^2。这是关于评估的顺序。要获得Range[5^2],您可以使用#^2&/@Unevaluated[Range[5]],在这种情况下,所有操作都与上面的符号n一样。实际上,Range会在非数字输入上发出错误消息。此外,它与问题相关,但#^2&等函数为Listable,您无需映射它们。

答案 1 :(得分:6)

稍微偏离主题,但您可以通过重新定义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