Загадочная интерпретация Математикой # ^ 2 & / @ Range [n] - PullRequest
3 голосов
/ 14 октября 2011

Я озадачен ответами Mathematica на следующее:

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

Range1

Кажется, что даже Mathematica (8.0) не верит тому, что только что сказал:

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

Range2

Есть мысли о том, что происходит?

Edit:

Первоначальный контекст для этого вопроса был следующим. Я написал

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

и поскольку n будет очень большим (2 ^ 50), я подумал, что могу сэкономить время, переписав его как:

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

Вспоминая, наверное, это была не очень хорошая идея. (Я мог бы использовать Модуль для «вычисления» диапазона только один раз.)

Ответы [ 2 ]

15 голосов
/ 14 октября 2011

Поскольку 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, и вам не нужно их отображать.

6 голосов
/ 14 октября 2011

Немного не по теме, но вы можете улучшить скорость, переопределив ее в терминах 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

ДаниэльЛихтблау

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...