如何在Mathematica中进行sage中的表达式替换?

时间:2017-12-11 15:57:15

标签: python wolfram-mathematica sage

在Mathematica中,我可以像x ^ 2那样进行表达式替换 - > x将x的幂2变为x。我想知道圣人是否有类似的功能?

R = PolynomialRing(ZZ, 2, "a")
a = R.gens()
(a[0] + a[1])^2
Out[173]:
a0^2 + 2*a0*a1 + a1^2

我想将(> 1)的所有幂更改为幂1.所以替换^ k - > a for k> = 1。

所以欲望输出是a0 + 2 * a0 * a1 + a1

3 个答案:

答案 0 :(得分:0)

我现在正在使用字符串替换来实现结果。如果您有更好的方法,请告诉我。谢谢!

def ReplaceExpression(p, locals):
    s = str(p)
    s1 = re.sub(r'\b(a\d+)\^\d+', "\g<1>", s)
    return sage_eval(s1, locals = locals)

adict = dict([(str(i), i) for i in a])
ReplaceExpression((a[0] + a[1])^2, adict)

Out[1]: 2*a0*a1 + a0 + a1

答案 1 :(得分:0)

SageMath使用SymPy进行符号数学运算,因此表达式应该有replace()方法。

>>> A
a0**2 + 2*a0*a1 + a1**2
>>> A.replace(lambda expr: isinstance(expr, sympy.Pow), lambda expr: expr.args[0])
2*a0*a1 + a0 + a1

这使用带有两个函数的变量作为参数。第一个是过滤器,它测试表达树中要替换的节点,第二个计算替换。

我们正在搜索任何Pow节点,并将其替换为它的第一个参数。

答案 2 :(得分:0)

您可以通过理想定义多项式环的商。

sage: R = PolynomialRing(ZZ, 2, "a")
sage: a = R.gens()
sage: b = (a[0] + a[1])^2
sage: b
a0^2 + 2*a0*a1 + a1^2
sage: J = R.ideal([x^2 - x for x in a])
sage: J
Ideal (a0^2 - a0, a1^2 - a1) of Multivariate Polynomial Ring in a0, a1 over Integer Ring
sage: S = R.quo(J)
sage: S
Quotient of Multivariate Polynomial Ring in a0, a1 over Integer Ring by the ideal (a0^2 - a0, a1^2 - a1)
sage: S(b)
2*a0bar*a1bar + a0bar + a1bar