如何在sage中的表达式中组合或扩展指数?换句话说,我怎样才能让圣人重写从(a**b)**c
到a**(b*c)
的表达式,反之亦然?
示例:
sage: var('x y')
(x, y)
sage: assume(x, 'rational')
sage: assume(y, 'rational')
sage: combine_exponents( (x^2)^y )
x^(2*y)
sage: assume(x > 0)
sage: expand_exponents( x^(1/3*y) )
(x^y)^(1/3)
我已尝试过的内容:
sage: b = x^(2*y)
sage: a = (x^2)^y
sage: bool(a == b)
True
sage: a
(x^2)^y
sage: simplify(a)
(x^2)^y
sage: expand(a)
(x^2)^y
sage: b
x^(2*y)
sage: expand(b)
x^(2*y)
更新
simplify_exp
(codelion的答案)适用于从(a**b)**c
转换为a**(b*c)
,但不是相反。是否有可能让圣人扩大指数?
答案 0 :(得分:3)
从Sage 6.5开始,将a
转换为b
,
使用方法canonicalize_radical
。
sage: a.canonicalize_radical()
x^(2*y)
请注意,simplify_exp
,exp_simplify
这四种方法,
simplify_radical
,radical_simplify
,效果相同,
正在弃用canonicalize_radical
。
请参阅Sage trac ticket #11912。
我不知道是否有内置功能
将b
转换为a
。
您可以像这样定义自己的函数:
def power_step(expr, step=None):
a, b = SR.var('a'), SR.var('b')
if str(expr.operator()) == str((a^b).operator()):
aa, mm = expr.operands()
if step is None:
if str(mm.operator()) == str((a*b).operator()):
bb = mm.operands().pop()
return (aa^bb)^(mm/bb)
else:
return expr
return (aa^step)^(mm/step)
else:
if step is None: return expr
else: return (expr^step)^(1/step)
然后你可以将电源分解成几个步骤:
sage: x, y = var('x y')
sage: power_step(x^(2*y),y)
(x^y)^2
sage: power_step(x^(2*y),2)
(x^2)^y
请注意,如果您没有指定步骤,则不会总是选择 显示的第一个。
sage: power_step(2^(x*y))
(2^y)^x
sage: power_step(x^(2*y))
(x^2)^y
答案 1 :(得分:2)
您可以使用simplify_exp()
功能。因此,对于您的示例,请执行以下操作:
sage: a.simplify_exp()
x^(2*y)