(我不知道stackoverflow上有sage组。我之前在sage支持usenet上问了这个问题,但这很慢)。
以下是问题:
圣人是否有办法确定通常由叶子计数给出的表达大小?与Mathematica leafCount[]
此处
http://reference.wolfram.com/language/ref/LeafCount.html
"给出expr中不可分的子表达式的总数。"
也类似于Maple的
我需要一种方法来衡量圣人的结果表达式的大小,并将其与Mathematica的结果和Maple进行比较。我目前使用leafCount(),因为Maple和Mathematica都有这个功能。
圣人是否有类似的功能或其他方式来获得这项措施?
例如,给定此表达式
(c + integrate(e^(2*x + sin(x)), x))*e^(-sin(x))
然后在Mathematica中我会写
Clear[x, c];
expr = (c + Integrate[Exp[2*x + Sin[x]], x])*Exp[-Sin[x]];
LeafCount[expr]
19
更新: 回答下面关于如何计算叶子的问题。如果绘制树表达式,则它是表达式树中的每个节点。对于上述情况,它是
同样地,LeafCount[x + y]
给出3
答案 0 :(得分:2)
这可能不是内置的,但也许应该是。只要您习惯编写自己的树遍历,讨论here和here应该会有所帮助。
这是一个错误的实现,可以帮助您。这是错误的,因为我没有得到19 - 基本上,我得到常数和x
s,这不是你想要的。我不知道这些子表达式是如何计算的。但我认为使用expr.operands()
和expr.operator()
的组合可以获得您想要的内容。
def tree(expr):
if expr.operator() is None:
return expr
else:
return map(tree, expr.operands())
expr = (x + integrate(e^(2*x + sin(x)), x))*e^(-sin(x))
len(flatten(tree(expr)))
编辑:如果一个叶子确实是任何节点(不仅仅是图理论意义上的离开,这似乎很奇怪),那么probably something here确实很有用。不是我的代码:
sage: def tree(expr):
....: if expr.operator() is None:
....: return expr
....: else:
....: return [expr.operator()]+map(tree, expr.operands())
....:
sage: var('y')
y
sage: tree(x+y)
[<function operator.add>, x, y]
sage: tree((y+integrate(e^(2*x+sin(x)),x))*e^(-sin(x)))
[<function operator.mul>,
[<function operator.add>,
y,
[integrate,
[exp, [<function operator.add>, [<function operator.mul>, x, 2], [sin, x]]],
x]],
[exp, [<function operator.mul>, [sin, x], -1]]]
sage: len(tree((y+integrate(e^(2*x+sin(x)),x))*e^(-sin(x))))
3
sage: len(flatten(tree((y+integrate(e^(2*x+sin(x)),x))*e^(-sin(x)))))
17
您会注意到答案是不同的,因为Sage将exp
计为原始运算符,而不是e^stuff
。