我对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只一次。)
答案 0 :(得分:15)
由于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&
等函数为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