2016-08-26 3 views
2

sympy에서 ccode()를 사용하여 sage의 유효한 식을 유효한 C 코드로 변환하려고합니다. 그러나 제 표현에는 많은 제곱 및 큐브 용어가 있습니다. pow (x, 2)가 x * x보다 훨씬 느리기 때문에 변환하기 전에 표현식에있는 용어를 확장하려고합니다.제곱 및 큐브 항을 곱셈으로 변환

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) 

그것은 부분적으로 작동하지만, 한 전원이 곱셈의 인수와 같이 실패 :

>>>_=var('x') 
    >>>print pow_to_mul((x^3+2*x^2)._sympy_()) 
    2*x**2 + x*x*x 
    >>>print pow_to_mul((x^2/(1+x^2)+(1-x^2)/(1+x^2))._sympy_()) 
    x**2/(x*x + 1) - (x*x - 1)/(x*x + 1) 

왜 는 this 대화를 바탕으로, 나는 다음과 같은 코드를 작성? 어떻게 변경할 수 있습니까? 고맙습니다.

+1

: 당신이 고대의 컴파일러를 사용하거나 빌드 프로세스에 사용되는 최적화 수준에 영향을 미칠 수없는 경우에는 (SymPy 마스터 분기를 사용) CCODE에 사용자 정의 함수를 통과 할 수있다? '+ (1-x^2)/(1 + x^2)'는'- (x * x-1)/(x * x + 1)'와 같다. –

+0

첫 번째 예에서 'x^3 + 2 * x^2'는 '2 * x ** 2 + x * x * x'와 같습니다. 시퀀스가 전환되고 연산자 스타일이 있지만 수학적으로 동일합니다. 당신이 무엇을 요구하고 있는지 불분명합니다. '**'는 종종 "독점적 인"또는 "독점적 인"이 될 수있는'^'와 구별하기 위해 "권력에"사용됩니다. –

+0

문제는 ccode (x * x)가 x * x를 반환하고 ccode (x^2) 또는 ccode (x ** 2)가 pow (x, 2)를 반환한다는 것입니다. C 프로그램에 들어가면 후자는 실제로 최적이 아닙니다. 그러므로 저는 2 * x * x + x * x * x를 기대합니다. – Domino

답변

1

-ffast-math으로 컴파일하면 컴파일러에서이 최적화 작업을 수행합니다. 정확히 실패 무엇

>>> 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)' 
+0

이것은 내가 찾고있는 것 같습니다. 그러나 문자열을 제공 할 람다는 평가되지 않으므로 예제 출력은 다음과 같습니다. 'pow (x, 97) + 4 * at 0x8bc791b4> (x, 7) + 5 * at 0x8bc791b4 > (x, 3) + pow (3, M_PI)' – Domino

+0

마스터 브랜치는 무엇입니까? 84db5141 이상이 필요합니다. –

+0

OK, 그게 문제였습니다. 내가 입력 한 나쁜 명령을 모르지만 sympy는 로컬에서만 업데이트되었습니다. 나는 최근 미안해, 배웠다. 그리고 도와 주셔서 대단히 감사합니다! – Domino