sage math:如何在符号表达式中组合或扩展指数?

时间:2015-01-16 03:43:17

标签: math sage exponent

如何在sage中的表达式中组合或扩展指数?换句话说,我怎样才能让圣人重写从(a**b)**ca**(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),但不是相反。是否有可能让圣人扩大指数?

2 个答案:

答案 0 :(得分:3)

  1. 从Sage 6.5开始,将a转换为b, 使用方法canonicalize_radical

    sage: a.canonicalize_radical()
    x^(2*y)
    

    请注意,simplify_expexp_simplify这四种方法, simplify_radicalradical_simplify,效果相同, 正在弃用canonicalize_radical。 请参阅Sage trac ticket #11912

  2. 我不知道是否有内置功能 将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)