如何不重复计算符号数

问题描述 投票:1回答:1

我需要一个项目来计算某些表达式的某种简单性,除其他外,我需要给表达式中出现的每个数字分配一个复杂度(类似于log2(x),以位为单位来衡量复杂度,即log2(4)= 2位)。无论如何,为了给出一个表情符号,我有这段代码:

is_atomic_number = lambda expr: expr.is_Atom and expr.is_number
eq_numbers = [subexpression for subexpression in preorder_traversal(expr) if is_atomic_number(subexpression)] 

它主要是有效的,但是如果我有2 *(x + y)形式的内容,则返回为表达式(2,2)中出现的数字,而不是我想要的2。有没有办法确保当某些因素被排除时,我只计算一次?谢谢!

python sympy
1个回答
0
投票

atoms方法可能就是您想要的:

>>> (2*(x+y)).atoms(Number)
{2}

replace方法也可以跟踪使用的映射,但是它不能处理被不同值替换的相同项目

>>> (2*x + x**2).replace(lambda x:x.is_Number, lambda x: Dummy(), map=True)
(Dummy_1*x + x**Dummy_2, {2: Dummy_2})

因此以下内容可能会起作用:

>>> def flatargs(expr):
...     if expr.is_Atom: yield expr
...     else:
...         for a in expr.args:
...             for i in flatargs(a): yield i
>>> list(flatargs(2*x+x**2))
[x, 2, 2, x]
>>> from sympy.utilities.iterables import multiset
>>> multiset([i for i in flatargs(2*x+x**2+y/2) if i.is_Number)
{1/2: 1, 2: 2}

如果要使分子和分母与flatargs分开,则必须将有理原子作为特殊情况进行处理,并处理分子或分母为1的情况。但是希望这里的内容可以帮助您。

© www.soinside.com 2019 - 2024. All rights reserved.