2017-12-11 39 views
1

Mathematicaでは、x^2 - > xのような式の置き換えを行うことができ、xの2乗をxに変更します。私はセージに類似の機能があるのだろうか?Mathematicaのようにsageで式を置き換える方法は?

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個を交換 - > kのA> = 1

望み出力は次のようになり、A0 + 2 * a0 * a1 + a1

答えて

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

https://ask.sagemath.org/questionsでこれを聞くことができますが、このタイプの質問にはより簡単な回答があることを願っています。 MathematicaをSagemathに置き換えることは、このような式を操作したい人にとっては本当に難しいことです。 – Mafra

+0

ワイルドカードを使用しようとしましたか?タイプSR.wild?これについての助けを得るために。 – Mafra

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 

これは、引数として2つの関数を持つバリエーションを使用します。最初は、置換される式ツリー内のノードをテストし、2番目が置換を計算するフィルタです。

Powノードを検索し、最初の引数で置き換えます。

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