2011-12-17 60 views
3

如何在如下表达式中添加x的幂数?简单的电源计数

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

x^2g[x^4] 

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

计数是这样的,所有这些例子必须返回6. 我在考虑使用计数的一些模式,但我没有”为此设法构建了一个模式。

+1

写一个解析器? – 2011-12-17 08:30:37

+0

@MitchWheat我在Mathematica帮助和维基百科中查找解析器。此外,我在Stack Overflow中搜索了解析器+ Mathematica,但它对我来说似乎都是相当抽象或技术性的。你可以给我一个Mathematica解析器的简单例子吗? – sjdh 2011-12-17 08:44:11

+0

'(x y)^ 2`应该返回1还是2?那么像`f [x,x^2]`这样的东西呢?它应该返回3吗? – Simon 2011-12-17 11:16:00

回答

3

这里是我快速的黑客 - 的一些行为(见最后一个例子)可能不会很你想要什么:

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

既然你想把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}

或者,这可以在没有母猪写入和粒,如果这使得它更易于阅读:

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]]