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 대화를 바탕으로, 나는 다음과 같은 코드를 작성? 어떻게 변경할 수 있습니까? 고맙습니다.
: 당신이 고대의 컴파일러를 사용하거나 빌드 프로세스에 사용되는 최적화 수준에 영향을 미칠 수없는 경우에는 (SymPy 마스터 분기를 사용) CCODE에 사용자 정의 함수를 통과 할 수있다? '+ (1-x^2)/(1 + x^2)'는'- (x * x-1)/(x * x + 1)'와 같다. –
첫 번째 예에서 'x^3 + 2 * x^2'는 '2 * x ** 2 + x * x * x'와 같습니다. 시퀀스가 전환되고 연산자 스타일이 있지만 수학적으로 동일합니다. 당신이 무엇을 요구하고 있는지 불분명합니다. '**'는 종종 "독점적 인"또는 "독점적 인"이 될 수있는'^'와 구별하기 위해 "권력에"사용됩니다. –
문제는 ccode (x * x)가 x * x를 반환하고 ccode (x^2) 또는 ccode (x ** 2)가 pow (x, 2)를 반환한다는 것입니다. C 프로그램에 들어가면 후자는 실제로 최적이 아닙니다. 그러므로 저는 2 * x * x + x * x * x를 기대합니다. – Domino