Wolfram mathematica 简单功率计数

Wolfram mathematica 简单功率计数,wolfram-mathematica,pattern-matching,Wolfram Mathematica,Pattern Matching,如何在下面的表达式中添加x的幂数 x^2f[x]g[x^3] 或 或 计数时,所有这些示例都必须返回6。 我曾考虑将Count与一些模式结合使用,但我没有为此构建一个模式。下面是我的快速技巧-一些行为(见最后一个示例)可能与您想要的不太一样: SetAttributes[countPowers, Listable] countPowers[expr_, symb_] := Module[{a}, Cases[{expr} /. symb -> symb^a // PowerExpa

如何在下面的表达式中添加x的幂数

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

计数时,所有这些示例都必须返回6。
我曾考虑将Count与一些模式结合使用,但我没有为此构建一个模式。

下面是我的快速技巧-一些行为(见最后一个示例)可能与您想要的不太一样:

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


由于要将
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]]
  }

任何一种形式都可以使用消失模式变得更简洁,但可能会牺牲清晰度:

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

@我在Mathematica帮助和Wikipedia中查找解析器。我还在Stack Overflow中搜索parser+Mathematica,但对我来说,这一切似乎都相当抽象或技术化。你能给我一个Mathematica语法分析器的简单例子吗?
(xy)^2
应该返回什么,1还是2?像
f[x,x^2]
这样的东西怎么样?它应该返回3吗?@Simon(xy)^2应该返回2,而f[x,x^2]确实应该返回3。@sjdh:在这种情况下,我的答案和W先生的答案都可以。很有趣。我的版本看起来更干净,但它能工作吗?我很难理解这个。我想我现在明白了,我们也有同样的想法,但是这个方法引入了不必要的复杂性,除非我的方法遗漏了什么。是的,我的版本是狗屎。你的soln大约快7倍,而且更整洁。我最初试图修改鲁本科的答案,使用默认的
x^n.
,但是
x^n
同时作为
x
x^n
。。。所以我看到红色,用
PowerExpand
点击它;这只是有点粗糙。似曾相识:
powerCount[x][(x y)^(1/2)]
怎么样?@Simon给出了一些示例,我决定只处理
x
的非复合实例,但我认为应该处理这样的情况以增强健壮性。
PowerExpand
是否足够?这取决于OP是否关心此类情况。事实上,你可能已经满足了他最初的要求。特别是因为
f[x^2]
应该返回2,即使
f
可能是任何旧的疯狂函数。OP的请求在数学上没有意义,因此语法阅读是可以的。@Simon好吧,我添加了
PowerExpand
——除非它可能会在某个地方引起麻烦,否则我将把它留下(我还没有想清楚)
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}
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]]