首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数学对#^2 & /@ Range[n]的困惑解读

数学对#^2 & /@ Range[n]的困惑解读
EN

Stack Overflow用户
提问于 2011-10-14 15:05:28
回答 2查看 223关注 0票数 3

我对Mathematica对下列问题的答复感到困惑:

代码语言:javascript
运行
复制
ClearAll[n]
#^2 & /@ Range[n]
#^2 & /@ Range[n] // StandardForm

看起来,就连数学(8.0)也不相信它刚才说的话:

代码语言:javascript
运行
复制
#^2 & /@ Range[5]
Range[5^2]

对发生了什么事有什么想法吗?

编辑:

这一问题的最初背景如下。我写过

代码语言:javascript
运行
复制
PrimeOmega[Range[n]] - PrimeNu[Range[n]]

由于n将非常大(2^50),我想我可以将其改写为:

代码语言:javascript
运行
复制
 PrimeOmega[#] - PrimeNu[#] &/@Range[n]

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-14 15:07:43

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

代码语言:javascript
运行
复制
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,您不必映射它们。

票数 15
EN

Stack Overflow用户

发布于 2011-10-14 16:49:47

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

代码语言:javascript
运行
复制
f1[n_] := PrimeOmega[Range[n]] - PrimeNu[Range[n]]
f2[n_] := With[{fax=FactorInteger[#]}, Total[fax[[All,2]]]-Length[fax]]& /@ Range[n]

示例:

代码语言:javascript
运行
复制
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

丹尼尔·利希布鲁

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7769613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档