Mathematica对#^ 2&/ @ Range [n]的令人费解的解释

Dav*_*idC 3 wolfram-mathematica range

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

ClearAll[n]
#^2 & /@ Range[n]
#^2 & /@ Range[n] // StandardForm
Run Code Online (Sandbox Code Playgroud)

范围1

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

#^2 & /@ Range[5]
Range[5^2]
Run Code Online (Sandbox Code Playgroud)

范围2

关于发生了什么的任何想法?

编辑:

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

PrimeOmega[Range[n]] - PrimeNu[Range[n]]
Run Code Online (Sandbox Code Playgroud)

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

 PrimeOmega[#] - PrimeNu[#] &/@Range[n]
Run Code Online (Sandbox Code Playgroud)

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

Leo*_*rin 15

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

In[11]:= #^2 & /@ someHead[n]
Out[11]= someHead[n^2]
Run Code Online (Sandbox Code Playgroud)

编辑

在编辑中解决问题 - 对于数字n,Range可以正确评估列表,并获得预期结果(即,Range[5]^2所有关于评估的顺序.要获得Range[5^2],您可以使用#^2&/@Unevaluated[Range[5]],在这种情况下,一切都会发生就像n上面的符号一样).实际上,Range在非数字输入上发出错误消息.此外,它是相切的问题,但像功能#^2&Listable,你不必映射.

  • @DavidCarraher我指的是Leonid的评论,他正在与爆米花供应商合作,这就是为什么他不断删除他的答案[so],进一步推迟他不可避免的金徽章,从而让我们所有人都坐在座位的边缘,引领着我们为了迎接重要日子,消费更多爆米花,导致爆米花销量增加,最终将重新回到口袋里.唷!那是一团糟. (3认同)

Dan*_*lau 6

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

f1[n_] := PrimeOmega[Range[n]] - PrimeNu[Range[n]]
f2[n_] := With[{fax=FactorInteger[#]}, Total[fax[[All,2]]]-Length[fax]]& /@ Range[n]
Run Code Online (Sandbox Code Playgroud)

例:

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
Run Code Online (Sandbox Code Playgroud)

Daniel Lichtblau