Простой подсчет мощности - PullRequest
       20

Простой подсчет мощности

3 голосов
/ 17 декабря 2011

Как можно добавить количество степеней х в выражениях, подобных следующему?

x^2f[x]g[x^3]

или

x^2g[x^4]

или

x^2g[x^2f[x^2]]

Счет таков, что все эти примеры должны возвращать 6. Я думал об использовании графа с каким-то шаблоном, но мне не удалось создать шаблон для этого.

Ответы [ 2 ]

3 голосов
/ 17 декабря 2011

Вот мой быстрый взлом - некоторые действия (см. Последний пример) могут быть не совсем такими, как вы хотите:

SetAttributes[countPowers, Listable]
countPowers[expr_, symb_] := Module[{a}, 
  Cases[{expr} /. symb -> symb^a // PowerExpand, symb^n_ :> n, 
        Infinity] /. a -> 1 // Total]

Тогда

In[3]:= countPowers[{x^2 f[x] g[x^3], x^2 g[x^4], x^2 g[x^2 f[x^2]]}, x]

Out[3]= {6, 6, 6}

и

In[4]:= countPowers[{x^(2 I)  g[x^3], g[x, x^4], 
                       x^2 g[E^(2 Pi I x) , f[x]^x]}, x]

Out[4]= {3 + 2 I, 5, 5}
2 голосов
/ 17 декабря 2011

Поскольку вы хотите считать x неявной степенью 1, вы можете использовать это:

powerCount[x_Symbol][expr_] := 
  Tr @ Reap[PowerExpand[expr] /. {x^n_ :> Sow[n], x :> Sow[1]}][[2,1]]

powerCount[x] /@
  {
   x^2f[x]g[x^3],
   x^2g[x^4],
   x^2g[x^2f[x^2]]
  }
{6, 6, 6}

В качестве альтернативы, это может быть написано без Sow and Reap, если это облегчает чтение:

powerCount[x_Symbol][expr_] := 
  Module[{t = 0}, PowerExpand[expr] /. {x^n_ :> (t += n), x :> t++}; t]

Любую форму можно сделать более краткой, используя исчезающие шаблоны, возможно, за счет ясности:

powerCount[x_Symbol][expr_] := 
  Tr @ Reap[PowerExpand[expr] /. x^n_ | x :> Sow[1 n]][[2, 1]]
...