将平方和立方体项转换为乘法

时间:2016-08-26 18:55:11

标签: c sympy evaluation

我正在尝试使用来自sympy的ccode()将sage中的大表达式转换为有效的C代码。但是,我的表达式有很多平方和立方体术语。由于pow(x,2)远比x * x慢,我试图在转换之前在我的表达式中扩展这些术语。 根据{{​​3}}对话,我编写了以下代码:

<select id="music" >
  <option value={mbid:123,artist:'Judas Priest'};>Heavy Metal 1</option>
  <option value="{mbid:456,artist:'Black Sabbath'};">Heavy Metal 2</option>
  <option value="{mbid:789,artist:'Iron Maiden'};">Heavy Metal 3</option>
  <option value="{mbid:102,artist:'Accept'};">Heavy Metal 4</option>
</select>

$('#music').on('change', function() {
  var val = this.value;
  alert(val.mbid)
});

它部分有效,但只要权力是乘法的参数就会失败:

    from sympy import Symbol, Mul, Pow, pprint, Matrix, symbols
    from sympy.core import numbers


    def pow_to_mul(expr):
         """
         Convert integer powers in an expression to Muls, like a**2 => a*a.
         """
         pows = list(expr.atoms(Pow))
         pows = [p for p in pows if p.as_base_exp()[1]>=0]
         if any(not e.is_Integer for b, e in (i.as_base_exp() for i in pows)):

              raise ValueError("A power contains a non-integer exponent")
         repl = zip(pows, (Mul(*[b]*e,evaluate=False) for b,e in (i.as_base_exp() for i in pows)))
         return expr.subs(repl)

为什么呢?我怎么能改变它? 非常感谢,

1 个答案:

答案 0 :(得分:1)

如果使用-ffast-math进行编译,编译器将为您执行此优化。如果您使用的是古老的编译器或者不能影响构建过程中使用的优化级别,您可以将用户定义的函数传递给ccode(使用SymPy master分支):

>>> ccode(x**97 + 4*x**7 + 5*x**3 + 3**pi, user_functions={'Pow': [
...   (lambda b, e: e.is_Integer and e < 42, lambda b, e: '*'.join([b]*int(e))),
...   (lambda b, e: not e.is_Integer, 'pow')]})
'pow(x, 97) + 4*x*x*x*x*x*x*x + 5*x*x*x + pow(3, M_PI)'