factorization of polynomials

99 views
Skip to first unread message

Sally Thu

unread,
May 12, 2020, 11:12:12 AM5/12/20
to symengine
Hello *,
I wrote a sympy program for symbolic circuit analysis and would like to speed up the calculation of the circuit transfer function by replacing sympy commands with symengine ones.
After profiling my code I saw that a lot of time is used (wasted) by the sympy factor command. Is there a chance to have the factorization done by symengine? This would be very valuable as I could analyze much bigger circuits then.
Thanks in advance for your feedback.
BR Sally

Ondřej Čertík

unread,
May 12, 2020, 11:38:39 AM5/12/20
to syme...@googlegroups.com
Hi Sally,
Thanks for the email. SymEngine I think does not currently have a simple factor() routine, but I think it can factor polynomials using Flint. Can you give an example of an expression that you would like to factor? There might be a way already.

Ondrej

Sally Thu

unread,
May 12, 2020, 1:57:04 PM5/12/20
to symengine
Hello Ondrej,

Thanks for your fast reply!
Please let me give you an smaller example of an expression which I would like to factor (simplify).
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-Cc1**2*s**2*(Cc1*s + 1/Rc1)*(-G_G3*(-(CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 + (Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1)/Rc2) - G_G3*(CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 - G_G4*(-Cc2*s - 1/Rc2)*(Cc3*s + 1/Rc3)*(-Co3*s - 1/Ro3 - 1/Rc3)/Rc2 - G_G4*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)*(-Co3*s - 1/Ro3 - 1/Rc3)/Rc2 + G_G4*(-Cc2*s - 1/Rc2)/(Rc2*Rc3**2) + G_G4*(Cc2*s + 1/Rc2)/(Rc2*Rc3**2) + (-Cc1*s - 1/Rc1)*(-G_G3*G_G4*(-Cc2*s - 1/Rc2)*(Cc3*s + 1/Rc3) - (CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 + (Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1)/Rc2 + (-Cc2*s - 1/Rc2)*(-Co3*s - 1/Ro3 - 1/Rc3)/(Rc2*Rc3) + (Cc2*s + 1/Rc2)*(-Co3*s - 1/Ro3 - 1/Rc3)/(Rc2*Rc3)) + ((Co2*s + 1/Ro2 + 1/Rc2)/(Rc1*Rc3) + (Cc3*s + 1/Rc3)/(Rc1*Rc2))/Rc1) + Cc1*s*((Cc1*s + 1/Rc1)*((Cc1*s + 1/Rc1)*((Cc1*s + 1/Rc1)**2*(-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1) - (-G_G5*(Co2*s + 1/Ro2 + 1/Rc2)/Rc3 - G_G5*(Cc3*s + 1/Rc3)/Rc2)/Rc1) - (-Cc1*s*(Cc3*s + 1/Rc3)/(Rc1*Rc2) + (-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3)*(Co2*s + 1/Ro2 + 1/Rc2))/Rc1) - ((Co2*s + 1/Ro2 + 1/Rc2)*(G_G3*(-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3) + (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3) - (Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1))/Rc3) - ((Cc3*s + 1/Rc3)*(Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1)) - (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))/Rc3)/Rc2)/Rc1) - G_G1*((Co2*s + 1/Ro2 + 1/Rc2)*(G_G3*(G_G3*(G_G3*(-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3) + (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3) - (Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1))/Rc3) + (Cc1*s*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)/Rc1 - (-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3)/Rc2)*(Co3*s + 1/Ro3 + 1/Rc3) - (G_G4*(G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3)) - (-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1)/Rc1)/Rc3) + ((Cc2*s + 1/Rc2)*((Cc3*s + 1/Rc3)*(Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1)) - (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))/Rc3) - (G_G3*(-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3) + (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3) - (Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1))/Rc3)/Rc2)*(Co3*s + 1/Ro3 + 1/Rc3) - (G_G4*(Cc1*s*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)/Rc1 - (-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3)/Rc2) + (-G_G5*(Co2*s + 1/Ro2 + 1/Rc2)/Rc3 - G_G5*(Cc3*s + 1/Rc3)/Rc2)*(CL*s + 1/Ro4 + 1/Rc1) - (Cc1*s + 1/Rc1)*(-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1)/Rc1)/Rc3) - ((Cc3*s + 1/Rc3)*(G_G4*(Cc1*s*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)/Rc1 - (-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3)/Rc2) + (-G_G5*(Co2*s + 1/Ro2 + 1/Rc2)/Rc3 - G_G5*(Cc3*s + 1/Rc3)/Rc2)*(CL*s + 1/Ro4 + 1/Rc1) - (Cc1*s + 1/Rc1)*(-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1)/Rc1) - ((Cc2*s + 1/Rc2)*((Cc3*s + 1/Rc3)*(Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1)) - (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))/Rc3) - (G_G3*(-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3) + (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3) - (Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1))/Rc3)/Rc2)/Rc3)/Rc2) + (-Cc1**2*s**2 - G_G1*G_G2)*(G_G3**2*(CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 - G_G3*((Co2*s + 1/Ro2 + 1/Rc2)/(Rc1*Rc3) + (Cc3*s + 1/Rc3)/(Rc1*Rc2))/Rc1 + G_G3*(Co2*s + 1/Ro2 + 1/Rc2)/(Rc1**2*Rc3) + (-Cc1*s - 1/Rc1)*(-G_G3*(-(CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 + (Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1)/Rc2) - G_G3*(CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 - G_G4*(-Cc2*s - 1/Rc2)*(Cc3*s + 1/Rc3)*(-Co3*s - 1/Ro3 - 1/Rc3)/Rc2 - G_G4*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)*(-Co3*s - 1/Ro3 - 1/Rc3)/Rc2 + G_G4*(-Cc2*s - 1/Rc2)/(Rc2*Rc3**2) + G_G4*(Cc2*s + 1/Rc2)/(Rc2*Rc3**2)) + (-(-Cc2*s - 1/Rc2)/Rc3 - (-Co3*s - 1/Ro3 - 1/Rc3)/Rc2)*(-(CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 + (Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1)/Rc2) + (-G_G3**2*(CL*s + 1/Ro4 + 1/Rc1)/Rc3 + ((Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1) + (CL*s + 1/Ro4 + 1/Rc1)/(Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3))*(-Co2*s - 1/Ro2 - 1/Rc2) - ((Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1) + (CL*s + 1/Ro4 + 1/Rc1)/(Rc2*Rc3))/(Rc2*Rc3)) + (Cc1*s*((Cc1*s + 1/Rc1)*((Cc1*s + 1/Rc1)**2*(-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1) - (-G_G5*(Co2*s + 1/Ro2 + 1/Rc2)/Rc3 - G_G5*(Cc3*s + 1/Rc3)/Rc2)/Rc1) - (-Cc1*s*(Cc3*s + 1/Rc3)/(Rc1*Rc2) + (-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3)*(Co2*s + 1/Ro2 + 1/Rc2))/Rc1) - G_G1*((Co2*s + 1/Ro2 + 1/Rc2)*(G_G3*(G_G3*(-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3) + (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3) - (Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1))/Rc3) + (Cc1*s*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)/Rc1 - (-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3)/Rc2)*(Co3*s + 1/Ro3 + 1/Rc3) - (G_G4*(G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3)) - (-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1)/Rc1)/Rc3) - ((Cc3*s + 1/Rc3)*(G_G4*(G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3)) - (-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1)/Rc1) - (Cc1*s*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)/Rc1 - (-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3)/Rc2)/Rc3)/Rc2))*(-Cc1*s - G_G3 - 1/Rc1) + (Cc1*s*((Cc1*s + 1/Rc1)**2*(-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1) - (-G_G5*(Co2*s + 1/Ro2 + 1/Rc2)/Rc3 - G_G5*(Cc3*s + 1/Rc3)/Rc2)/Rc1) - G_G1*((Co2*s + 1/Ro2 + 1/Rc2)*(G_G3*(-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3) + (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3) - (Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1))/Rc3) - ((Cc3*s + 1/Rc3)*(Cc1*s*(Cc1*s + 1/Rc1)/Rc1 + G_G2*(CL*s + 1/Ro4 + 1/Rc1)) - (G_G5*(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3) + G_G5/(Rc2*Rc3))/Rc3)/Rc2))*(-G_G3*(-Cc1*s - 1/Rc1) - (-Cc2*s - 1/Rc2)/Rc3 - (-Co3*s - 1/Ro3 - 1/Rc3)/Rc2) + (Cc1*s*(-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1) - G_G1*(-G_G5*(Co2*s + 1/Ro2 + 1/Rc2)/Rc3 - G_G5*(Cc3*s + 1/Rc3)/Rc2))*(-G_G3*G_G4*(-Cc2*s - 1/Rc2)*(Cc3*s + 1/Rc3) + (-Cc1*s - 1/Rc1)*(G_G3*(-Cc2*s - 1/Rc2)/Rc3 + G_G4*(-Cc2*s - 1/Rc2)*(Cc3*s + 1/Rc3) - G_G4/(Rc2*Rc3)) - (CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 + (Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1)/Rc2 + (-Cc2*s - 1/Rc2)*(-Co3*s - 1/Ro3 - 1/Rc3)/(Rc2*Rc3) + (Cc2*s + 1/Rc2)*(-Co3*s - 1/Ro3 - 1/Rc3)/(Rc2*Rc3)) + (Cc1*s*(Cc1*s + 1/Rc1)*(-Cc1*s*(Cc1*s + 1/Rc1)**2 - G_G2/Rc1) - G_G1*(-Cc1*s*(Cc3*s + 1/Rc3)/(Rc1*Rc2) + (-Cc1*s/(Rc1*Rc3) - G_G3*G_G5/Rc3)*(Co2*s + 1/Ro2 + 1/Rc2)))*(G_G3*(-Cc2*s - 1/Rc2)/Rc3 + G_G4*(-Cc2*s - 1/Rc2)*(Cc3*s + 1/Rc3) - G_G4/(Rc2*Rc3) + (-Cc1*s - 1/Rc1)*(-(-Cc2*s - 1/Rc2)/Rc3 - (-Co3*s - 1/Ro3 - 1/Rc3)/Rc2)) + (-Cc1*s - Co1*s - 1/Ro1)*(-G_G3**2*(Co2*s + 1/Ro2 + 1/Rc2)/(Rc1**2*Rc3) + (-Cc1*s - 1/Rc1)*(G_G3**2*(CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 + (-(-Cc2*s - 1/Rc2)/Rc3 - (-Co3*s - 1/Ro3 - 1/Rc3)/Rc2)*(-(CL*s + 1/Ro4 + 1/Rc1)*(-Co2*s - 1/Ro2 - 1/Rc2)/Rc3 + (Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1)/Rc2) + (-G_G3**2*(CL*s + 1/Ro4 + 1/Rc1)/Rc3 + ((Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1) + (CL*s + 1/Ro4 + 1/Rc1)/(Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3))*(-Co2*s - 1/Ro2 - 1/Rc2) - ((Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)*(CL*s + 1/Ro4 + 1/Rc1) + (CL*s + 1/Ro4 + 1/Rc1)/(Rc2*Rc3))/(Rc2*Rc3)) + (-(-Cc2*s - 1/Rc2)/Rc3 - (-Co3*s - 1/Ro3 - 1/Rc3)/Rc2)*((Co2*s + 1/Ro2 + 1/Rc2)/(Rc1*Rc3) + (Cc3*s + 1/Rc3)/(Rc1*Rc2))/Rc1 + ((G_G3**2/(Rc1*Rc3) + (-(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)/Rc1 - 1/(Rc1*Rc2*Rc3))*(Co3*s + 1/Ro3 + 1/Rc3))*(Co2*s + 1/Ro2 + 1/Rc2) + (-(Cc2*s + 1/Rc2)*(Cc3*s + 1/Rc3)/Rc1 - 1/(Rc1*Rc2*Rc3))/(Rc2*Rc3))/Rc1)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

The result given by Sympy's .factor() command is:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-(CL*Cc1*Cc2*Cc3*Co1*Co2*Co3*Rc1*Rc2*Rc3*Ro1*Ro2*Ro3*Ro4*s**7 + CL*Cc1*Cc2*Cc3*Co1*Co2*Rc1*Rc2*Rc3*Ro1*Ro2*Ro4*s**6 + CL*Cc1*Cc2*Cc3*Co1*Co2*Rc1*Rc2*Ro1*Ro2*Ro3*Ro4*s**6 + CL*Cc1*Cc2*Cc3*Co1*Co3*Rc1*Rc2*Rc3*Ro1*Ro3*Ro4*s**6 + CL*Cc1*Cc2*Cc3*Co1*Co3*Rc1*Rc3*Ro1*Ro2*Ro3*Ro4*s**6 + CL*Cc1*Cc2*Cc3*Co1*Rc1*Rc2*Rc3*Ro1*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co1*Rc1*Rc2*Ro1*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co1*Rc1*Rc3*Ro1*Ro2*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co1*Rc1*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co2*Co3*Rc1*Rc2*Rc3*Ro2*Ro3*Ro4*s**6 + CL*Cc1*Cc2*Cc3*Co2*Co3*Rc2*Rc3*Ro1*Ro2*Ro3*Ro4*s**6 + CL*Cc1*Cc2*Cc3*Co2*Rc1*Rc2*Rc3*Ro2*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co2*Rc1*Rc2*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co2*Rc2*Rc3*Ro1*Ro2*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co2*Rc2*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co3*Rc1*Rc2*Rc3*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co3*Rc1*Rc3*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co3*Rc2*Rc3*Ro1*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Co3*Rc3*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Cc3*Rc1*Rc2*Rc3*Ro4*s**4 + CL*Cc1*Cc2*Cc3*Rc1*Rc2*Ro3*Ro4*s**4 + CL*Cc1*Cc2*Cc3*Rc1*Rc3*Ro2*Ro4*s**4 + CL*Cc1*Cc2*Cc3*Rc1*Ro2*Ro3*Ro4*s**4 + CL*Cc1*Cc2*Cc3*Rc2*Rc3*Ro1*Ro4*s**4 + CL*Cc1*Cc2*Cc3*Rc2*Ro1*Ro3*Ro4*s**4 + CL*Cc1*Cc2*Cc3*Rc3*Ro1*Ro2*Ro4*s**4 + CL*Cc1*Cc2*Cc3*Ro1*Ro2*Ro3*Ro4*s**4 + CL*Cc1*Cc2*Co1*Co2*Co3*Rc1*Rc2*Ro1*Ro2*Ro3*Ro4*s**6 + CL*Cc1*Cc2*Co1*Co2*Rc1*Rc2*Ro1*Ro2*Ro4*s**5 + CL*Cc1*Cc2*Co1*Co3*Rc1*Rc2*Ro1*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Co1*Co3*Rc1*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Co1*Rc1*Rc2*Ro1*Ro4*s**4 + CL*Cc1*Cc2*Co1*Rc1*Ro1*Ro2*Ro4*s**4 + CL*Cc1*Cc2*Co2*Co3*Rc1*Rc2*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Co2*Co3*Rc2*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc2*Co2*Rc1*Rc2*Ro2*Ro4*s**4 + CL*Cc1*Cc2*Co2*Rc2*Ro1*Ro2*Ro4*s**4 + CL*Cc1*Cc2*Co3*Rc1*Rc2*Ro3*Ro4*s**4 + CL*Cc1*Cc2*Co3*Rc1*Ro2*Ro3*Ro4*s**4 + CL*Cc1*Cc2*Co3*Rc2*Ro1*Ro3*Ro4*s**4 + CL*Cc1*Cc2*Co3*Ro1*Ro2*Ro3*Ro4*s**4 + CL*Cc1*Cc2*Rc1*Rc2*Ro4*s**3 + CL*Cc1*Cc2*Rc1*Ro2*Ro4*s**3 + CL*Cc1*Cc2*Rc2*Ro1*Ro4*s**3 + CL*Cc1*Cc2*Ro1*Ro2*Ro4*s**3 + CL*Cc1*Cc3*Co1*Co2*Co3*Rc1*Rc3*Ro1*Ro2*Ro3*Ro4*s**6 + CL*Cc1*Cc3*Co1*Co2*Rc1*Rc3*Ro1*Ro2*Ro4*s**5 + CL*Cc1*Cc3*Co1*Co2*Rc1*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc3*Co1*Co3*Rc1*Rc3*Ro1*Ro3*Ro4*s**5 + CL*Cc1*Cc3*Co1*Rc1*Rc3*Ro1*Ro4*s**4 + CL*Cc1*Cc3*Co1*Rc1*Ro1*Ro3*Ro4*s**4 + CL*Cc1*Cc3*Co2*Co3*Rc1*Rc3*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc3*Co2*Co3*Rc3*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Cc3*Co2*Rc1*Rc3*Ro2*Ro4*s**4 + CL*Cc1*Cc3*Co2*Rc1*Ro2*Ro3*Ro4*s**4 + CL*Cc1*Cc3*Co2*Rc3*Ro1*Ro2*Ro4*s**4 + CL*Cc1*Cc3*Co2*Ro1*Ro2*Ro3*Ro4*s**4 + CL*Cc1*Cc3*Co3*Rc1*Rc3*Ro3*Ro4*s**4 + CL*Cc1*Cc3*Co3*Rc3*Ro1*Ro3*Ro4*s**4 + CL*Cc1*Cc3*Rc1*Rc3*Ro4*s**3 + CL*Cc1*Cc3*Rc1*Ro3*Ro4*s**3 + CL*Cc1*Cc3*Rc3*Ro1*Ro4*s**3 + CL*Cc1*Cc3*Ro1*Ro3*Ro4*s**3 + CL*Cc1*Co1*Co2*Co3*Rc1*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc1*Co1*Co2*Rc1*Ro1*Ro2*Ro4*s**4 + CL*Cc1*Co1*Co3*Rc1*Ro1*Ro3*Ro4*s**4 + CL*Cc1*Co1*Rc1*Ro1*Ro4*s**3 + CL*Cc1*Co2*Co3*Rc1*Ro2*Ro3*Ro4*s**4 + CL*Cc1*Co2*Co3*Ro1*Ro2*Ro3*Ro4*s**4 + CL*Cc1*Co2*Rc1*Ro2*Ro4*s**3 + CL*Cc1*Co2*Ro1*Ro2*Ro4*s**3 + CL*Cc1*Co3*Rc1*Ro3*Ro4*s**3 + CL*Cc1*Co3*Ro1*Ro3*Ro4*s**3 + CL*Cc1*Rc1*Ro4*s**2 + CL*Cc1*Ro1*Ro4*s**2 + CL*Cc2*Cc3*Co1*Co2*Co3*Rc2*Rc3*Ro1*Ro2*Ro3*Ro4*s**6 + CL*Cc2*Cc3*Co1*Co2*Rc2*Rc3*Ro1*Ro2*Ro4*s**5 + CL*Cc2*Cc3*Co1*Co2*Rc2*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc2*Cc3*Co1*Co3*Rc2*Rc3*Ro1*Ro3*Ro4*s**5 + CL*Cc2*Cc3*Co1*Co3*Rc3*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc2*Cc3*Co1*Rc2*Rc3*Ro1*Ro4*s**4 + CL*Cc2*Cc3*Co1*Rc2*Ro1*Ro3*Ro4*s**4 + CL*Cc2*Cc3*Co1*Rc3*Ro1*Ro2*Ro4*s**4 + CL*Cc2*Cc3*Co1*Ro1*Ro2*Ro3*Ro4*s**4 + CL*Cc2*Cc3*Co2*Co3*Rc2*Rc3*Ro2*Ro3*Ro4*s**5 + CL*Cc2*Cc3*Co2*Rc2*Rc3*Ro2*Ro4*s**4 + CL*Cc2*Cc3*Co2*Rc2*Ro2*Ro3*Ro4*s**4 + CL*Cc2*Cc3*Co3*Rc2*Rc3*Ro3*Ro4*s**4 + CL*Cc2*Cc3*Co3*Rc3*Ro2*Ro3*Ro4*s**4 + CL*Cc2*Cc3*Rc2*Rc3*Ro4*s**3 + CL*Cc2*Cc3*Rc2*Ro3*Ro4*s**3 + CL*Cc2*Cc3*Rc3*Ro2*Ro4*s**3 + CL*Cc2*Cc3*Ro2*Ro3*Ro4*s**3 + CL*Cc2*Co1*Co2*Co3*Rc2*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc2*Co1*Co2*Rc2*Ro1*Ro2*Ro4*s**4 + CL*Cc2*Co1*Co3*Rc2*Ro1*Ro3*Ro4*s**4 + CL*Cc2*Co1*Co3*Ro1*Ro2*Ro3*Ro4*s**4 + CL*Cc2*Co1*Rc2*Ro1*Ro4*s**3 + CL*Cc2*Co1*Ro1*Ro2*Ro4*s**3 + CL*Cc2*Co2*Co3*Rc2*Ro2*Ro3*Ro4*s**4 + CL*Cc2*Co2*Rc2*Ro2*Ro4*s**3 + CL*Cc2*Co3*Rc2*Ro3*Ro4*s**3 + CL*Cc2*Co3*Ro2*Ro3*Ro4*s**3 + CL*Cc2*Rc2*Ro4*s**2 + CL*Cc2*Ro2*Ro4*s**2 + CL*Cc3*Co1*Co2*Co3*Rc3*Ro1*Ro2*Ro3*Ro4*s**5 + CL*Cc3*Co1*Co2*Rc3*Ro1*Ro2*Ro4*s**4 + CL*Cc3*Co1*Co2*Ro1*Ro2*Ro3*Ro4*s**4 + CL*Cc3*Co1*Co3*Rc3*Ro1*Ro3*Ro4*s**4 + CL*Cc3*Co1*Rc3*Ro1*Ro4*s**3 + CL*Cc3*Co1*Ro1*Ro3*Ro4*s**3 + CL*Cc3*Co2*Co3*Rc3*Ro2*Ro3*Ro4*s**4 + CL*Cc3*Co2*Rc3*Ro2*Ro4*s**3 + CL*Cc3*Co2*Ro2*Ro3*Ro4*s**3 + CL*Cc3*Co3*Rc3*Ro3*Ro4*s**3 + CL*Cc3*Rc3*Ro4*s**2 + CL*Cc3*Ro3*Ro4*s**2 + CL*Co1*Co2*Co3*Ro1*Ro2*Ro3*Ro4*s**4 + CL*Co1*Co2*Ro1*Ro2*Ro4*s**3 + CL*Co1*Co3*Ro1*Ro3*Ro4*s**3 + CL*Co1*Ro1*Ro4*s**2 + CL*Co2*Co3*Ro2*Ro3*Ro4*s**3 + CL*Co2*Ro2*Ro4*s**2 + CL*Co3*Ro3*Ro4*s**2 + CL*Ro4*s + Cc1*Cc2*Cc3*Co1*Co2*Co3*Rc1*Rc2*Rc3*Ro1*Ro2*Ro3*s**6 + Cc1*Cc2*Cc3*Co1*Co2*Co3*Rc2*Rc3*Ro1*Ro2*Ro3*Ro4*s**6 + Cc1*Cc2*Cc3*Co1*Co2*Rc1*Rc2*Rc3*Ro1*Ro2*s**5 + Cc1*Cc2*Cc3*Co1*Co2*Rc1*Rc2*Ro1*Ro2*Ro3*s**5 + Cc1*Cc2*Cc3*Co1*Co2*Rc2*Rc3*Ro1*Ro2*Ro4*s**5 + Cc1*Cc2*Cc3*Co1*Co2*Rc2*Ro1*Ro2*Ro3*Ro4*s**5 + Cc1*Cc2*Cc3*Co1*Co3*Rc1*Rc2*Rc3*Ro1*Ro3*s**5 + Cc1*Cc2*Cc3*Co1*Co3*Rc1*Rc3*Ro1*Ro2*Ro3*s**5 + Cc1*Cc2*Cc3*Co1*Co3*Rc2*Rc3*Ro1*Ro3*Ro4*s**5 + Cc1*Cc2*Cc3*Co1*Co3*Rc3*Ro1*Ro2*Ro3*Ro4*s**5 + Cc1*Cc2*Cc3*Co1*Rc1*Rc2*Rc3*Ro1*s**4 + Cc1*Cc2*Cc3*Co1*Rc1*Rc2*Ro1*Ro3*s**4 + Cc1*Cc2*Cc3*Co1*Rc1*Rc3*Ro1*Ro2*s**4 + Cc1*Cc2*Cc3*Co1*Rc1*Ro1*Ro2*Ro3*s**4 + Cc1*Cc2*Cc3*Co1*Rc2*Rc3*Ro1*Ro4*s**4 + Cc1*Cc2*Cc3*Co1*Rc2*Ro1*Ro3*Ro4*s**4 + Cc1*Cc2*Cc3*Co1*Rc3*Ro1*Ro2*Ro4*s**4 + Cc1*Cc2*Cc3*Co1*Ro1*Ro2*Ro3*Ro4*s**4 + Cc1*Cc2*Cc3*Co2*Co3*G_G5*Rc2*Rc3*Ro1*Ro2*Ro3*Ro4*s**5 + Cc1*Cc2*Cc3*Co2*Co3*Rc1*Rc2*Rc3*Ro2*Ro3*s**5 + Cc1*Cc2*Cc3*Co2*Co3*Rc2*Rc3*Ro1*Ro2*Ro3*s**5 + Cc1*Cc2*Cc3*Co2*Co3*Rc2*Rc3*Ro2*Ro3*Ro4*s**5 + Cc1*Cc2*Cc3*Co2*G_G5*Rc2*Rc3*Ro1*Ro2*Ro4*s**4 + Cc1*Cc2*Cc3*Co2*G_G5*Rc2*Ro1*Ro2*Ro3*Ro4*s**4 + Cc1*Cc2*Cc3*Co2*Rc1*Rc2*Rc3*Ro2*s**4 + Cc1*Cc2*Cc3*Co2*Rc1*Rc2*Ro2*Ro3*s**4 + Cc1*Cc2*Cc3*Co2*Rc2*Rc3*Ro1*Ro2*s**4 + Cc1*Cc2*Cc3*Co2*Rc2*Rc3*Ro2*Ro4*s**4 + Cc1*Cc2*Cc3*Co2*Rc2*Ro1*Ro2*Ro3*s**4 + Cc1*Cc2*Cc3*Co2*Rc2*Ro2*Ro3*Ro4*s**4 + Cc1*Cc2*Cc3*Co3*G_G5*Rc2*Rc3*Ro1*Ro3*Ro4*s**4 + Cc1*Cc2*Cc3*Co3*G_G5*Rc3*Ro1*Ro2*Ro3*Ro4*s**4 + Cc1*Cc2*Cc3*Co3*Rc1*Rc2*Rc3*Ro3*s**4 + Cc1*Cc2*Cc3*Co3*Rc1*Rc3*Ro2*Ro3*s**4 + Cc1*Cc2*Cc3*Co3*Rc2*Rc3*Ro1*Ro3*s**4 + Cc1*Cc2*Cc3*Co3*Rc2*Rc3*Ro3*Ro4*s**4 + Cc1*Cc2*Cc3*Co3*Rc3*Ro1*Ro2*Ro3*s**4 + Cc1*Cc2*Cc3*Co3*Rc3*Ro2*Ro3*Ro4*s**4 + Cc1*Cc2*Cc3*G_G2*G_G3*G_G4*Rc2*Rc3*Ro1*Ro2*Ro3*Ro4*s**3 + Cc1*Cc2*Cc3*G_G5*Rc2*Rc3*Ro1*Ro4*s**3 + Cc1*Cc2*Cc3*G_G5*Rc2*Ro1*Ro3*Ro4*s**3 + Cc1*Cc2*Cc3*G_G5*Rc3*Ro1*Ro2*Ro4*s**3 + Cc1*Cc2*Cc3*G_G5*Ro1*Ro2*Ro3*Ro4*s**3 + Cc1*Cc2*Cc3*Rc1*Rc2*Rc3*s**3 + Cc1*Cc2*Cc3*Rc1*Rc2*Ro3*s**3 + Cc1*Cc2*Cc3*Rc1*Rc3*Ro2*s**3 + Cc1*Cc2*Cc3*Rc1*Ro2*Ro3*s**3 + Cc1*Cc2*Cc3*Rc2*Rc3*Ro1*s**3 + Cc1*Cc2*Cc3*Rc2*Rc3*Ro4*s**3 + Cc1*Cc2*Cc3*Rc2*Ro1*Ro3*s**3 + Cc1*Cc2*Cc3*Rc2*Ro3*Ro4*s**3 + Cc1*Cc2*Cc3*Rc3*Ro1*Ro2*s**3 + Cc1*Cc2*Cc3*Rc3*Ro2*Ro4*s**3 + Cc1*Cc2*Cc3*Ro1*Ro2*Ro3*s**3 + Cc1*Cc2*Cc3*Ro2*Ro3*Ro4*s**3 + Cc1*Cc2*Co1*Co2*Co3*Rc1*Rc2*Ro1*Ro2*Ro3*s**5 + Cc1*Cc2*Co1*Co2*Co3*Rc2*Ro1*Ro2*Ro3*Ro4*s**5 + Cc1*Cc2*Co1*Co2*Rc1*Rc2*Ro1*Ro2*s**4 + Cc1*Cc2*Co1*Co2*Rc2*Ro1*Ro2*Ro4*s**4 + Cc1*Cc2*Co1*Co3*Rc1*Rc2*Ro1*Ro3*s**4 + Cc1*Cc2*Co1*Co3*Rc1*Ro1*Ro2*Ro3*s**4 + Cc1*Cc2*Co1*Co3*Rc2*Ro1*Ro3*Ro4*s**4 + Cc1*Cc2*Co1*Co3*Ro1*Ro2*Ro3*Ro4*s**4 + Cc1*Cc2*Co1*Rc1*Rc2*Ro1*s**3 + Cc1*Cc2*Co1*Rc1*Ro1*Ro2*s**3 + Cc1*Cc2*Co1*Rc2*Ro1*Ro4*s**3 + Cc1*Cc2*Co1*Ro1*Ro2*Ro4*s**3 + Cc1*Cc2*Co2*Co3*G_G5*Rc2*Ro1*Ro2*Ro3*Ro4*s**4 + Cc1*Cc2*Co2*Co3*Rc1*Rc2*Ro2*Ro3*s**4 + Cc1*Cc2*Co2*Co3*Rc2*Ro1*Ro2*Ro3*s**4 + Cc1*Cc2*Co2*Co3*Rc2*Ro2*Ro3*Ro4*s**4 + Cc1*Cc2*Co2*G_G5*Rc2*Ro1*Ro2*Ro4*s**3 + Cc1*Cc2*Co2*Rc1*Rc2*Ro2*s**3 + Cc1*Cc2*Co2*Rc2*Ro1*Ro2*s**3 + Cc1*Cc2*Co2*Rc2*Ro2*Ro4*s**3 + Cc1*Cc2*Co3*G_G5*Rc2*Ro1*Ro3*Ro4*s**3 + Cc1*Cc2*Co3*G_G5*Ro1*Ro2*Ro3*Ro4*s**3 + Cc1*Cc2*Co3*Rc1*Rc2*Ro3*s**3 + Cc1*Cc2*Co3*Rc1*Ro2*Ro3*s**3 + Cc1*Cc2*Co3*Rc2*Ro1*Ro3*s**3 + Cc1*Cc2*Co3*Rc2*Ro3*Ro4*s**3 + Cc1*Cc2*Co3*Ro1*Ro2*Ro3*s**3 + Cc1*Cc2*Co3*Ro2*Ro3*Ro4*s**3 + Cc1*Cc2*G_G2*G_G3*G_G4*Rc2*Ro1*Ro2*Ro3*Ro4*s**2 + Cc1*Cc2*G_G5*Rc2*Ro1*Ro4*s**2 + Cc1*Cc2*G_G5*Ro1*Ro2*Ro4*s**2 + Cc1*Cc2*Rc1*Rc2*s**2 + Cc1*Cc2*Rc1*Ro2*s**2 + Cc1*Cc2*Rc2*Ro1*s**2 + Cc1*Cc2*Rc2*Ro4*s**2 + Cc1*Cc2*Ro1*Ro2*s**2 + Cc1*Cc2*Ro2*Ro4*s**2 + Cc1*Cc3*Co1*Co2*Co3*Rc1*Rc3*Ro1*Ro2*Ro3*s**5 + Cc1*Cc3*Co1*Co2*Co3*Rc3*Ro1*Ro2*Ro3*Ro4*s**5 + Cc1*Cc3*Co1*Co2*Rc1*Rc3*Ro1*Ro2*s**4 + Cc1*Cc3*Co1*Co2*Rc1*Ro1*Ro2*Ro3*s**4 + Cc1*Cc3*Co1*Co2*Rc3*Ro1*Ro2*Ro4*s**4 + Cc1*Cc3*Co1*Co2*Ro1*Ro2*Ro3*Ro4*s**4 + Cc1*Cc3*Co1*Co3*Rc1*Rc3*Ro1*Ro3*s**4 + Cc1*Cc3*Co1*Co3*Rc3*Ro1*Ro3*Ro4*s**4 + Cc1*Cc3*Co1*Rc1*Rc3*Ro1*s**3 + Cc1*Cc3*Co1*Rc1*Ro1*Ro3*s**3 + Cc1*Cc3*Co1*Rc3*Ro1*Ro4*s**3 + Cc1*Cc3*Co1*Ro1*Ro3*Ro4*s**3 + Cc1*Cc3*Co2*Co3*G_G5*Rc3*Ro1*Ro2*Ro3*Ro4*s**4 + Cc1*Cc3*Co2*Co3*Rc1*Rc3*Ro2*Ro3*s**4 + Cc1*Cc3*Co2*Co3*Rc3*Ro1*Ro2*Ro3*s**4 + Cc1*Cc3*Co2*Co3*Rc3*Ro2*Ro3*Ro4*s**4 + Cc1*Cc3*Co2*G_G5*Rc3*Ro1*Ro2*Ro4*s**3 + Cc1*Cc3*Co2*G_G5*Ro1*Ro2*Ro3*Ro4*s**3 + Cc1*Cc3*Co2*Rc1*Rc3*Ro2*s**3 + Cc1*Cc3*Co2*Rc1*Ro2*Ro3*s**3 + Cc1*Cc3*Co2*Rc3*Ro1*Ro2*s**3 + Cc1*Cc3*Co2*Rc3*Ro2*Ro4*s**3 + Cc1*Cc3*Co2*Ro1*Ro2*Ro3*s**3 + Cc1*Cc3*Co2*Ro2*Ro3*Ro4*s**3 + Cc1*Cc3*Co3*G_G5*Rc3*Ro1*Ro3*Ro4*s**3 + Cc1*Cc3*Co3*Rc1*Rc3*Ro3*s**3 + Cc1*Cc3*Co3*Rc3*Ro1*Ro3*s**3 + Cc1*Cc3*Co3*Rc3*Ro3*Ro4*s**3 + Cc1*Cc3*G_G2*G_G3*G_G4*Rc3*Ro1*Ro2*Ro3*Ro4*s**2 + Cc1*Cc3*G_G5*Rc3*Ro1*Ro4*s**2 + Cc1*Cc3*G_G5*Ro1*Ro3*Ro4*s**2 + Cc1*Cc3*Rc1*Rc3*s**2 + Cc1*Cc3*Rc1*Ro3*s**2 + Cc1*Cc3*Rc3*Ro1*s**2 + Cc1*Cc3*Rc3*Ro4*s**2 + Cc1*Cc3*Ro1*Ro3*s**2 + Cc1*Cc3*Ro3*Ro4*s**2 + Cc1*Co1*Co2*Co3*Rc1*Ro1*Ro2*Ro3*s**4 + Cc1*Co1*Co2*Co3*Ro1*Ro2*Ro3*Ro4*s**4 + Cc1*Co1*Co2*Rc1*Ro1*Ro2*s**3 + Cc1*Co1*Co2*Ro1*Ro2*Ro4*s**3 + Cc1*Co1*Co3*Rc1*Ro1*Ro3*s**3 + Cc1*Co1*Co3*Ro1*Ro3*Ro4*s**3 + Cc1*Co1*Rc1*Ro1*s**2 + Cc1*Co1*Ro1*Ro4*s**2 + Cc1*Co2*Co3*G_G5*Ro1*Ro2*Ro3*Ro4*s**3 + Cc1*Co2*Co3*Rc1*Ro2*Ro3*s**3 + Cc1*Co2*Co3*Ro1*Ro2*Ro3*s**3 + Cc1*Co2*Co3*Ro2*Ro3*Ro4*s**3 + Cc1*Co2*G_G5*Ro1*Ro2*Ro4*s**2 + Cc1*Co2*Rc1*Ro2*s**2 + Cc1*Co2*Ro1*Ro2*s**2 + Cc1*Co2*Ro2*Ro4*s**2 + Cc1*Co3*G_G5*Ro1*Ro3*Ro4*s**2 + Cc1*Co3*Rc1*Ro3*s**2 + Cc1*Co3*Ro1*Ro3*s**2 + Cc1*Co3*Ro3*Ro4*s**2 + Cc1*G_G2*G_G3*G_G4*Ro1*Ro2*Ro3*Ro4*s + Cc1*G_G5*Ro1*Ro4*s + Cc1*Rc1*s + Cc1*Ro1*s + Cc1*Ro4*s + Cc2*Cc3*Co1*Co2*Co3*Rc2*Rc3*Ro1*Ro2*Ro3*s**5 + Cc2*Cc3*Co1*Co2*Rc2*Rc3*Ro1*Ro2*s**4 + Cc2*Cc3*Co1*Co2*Rc2*Ro1*Ro2*Ro3*s**4 + Cc2*Cc3*Co1*Co3*Rc2*Rc3*Ro1*Ro3*s**4 + Cc2*Cc3*Co1*Co3*Rc3*Ro1*Ro2*Ro3*s**4 + Cc2*Cc3*Co1*Rc2*Rc3*Ro1*s**3 + Cc2*Cc3*Co1*Rc2*Ro1*Ro3*s**3 + Cc2*Cc3*Co1*Rc3*Ro1*Ro2*s**3 + Cc2*Cc3*Co1*Ro1*Ro2*Ro3*s**3 + Cc2*Cc3*Co2*Co3*Rc2*Rc3*Ro2*Ro3*s**4 + Cc2*Cc3*Co2*Rc2*Rc3*Ro2*s**3 + Cc2*Cc3*Co2*Rc2*Ro2*Ro3*s**3 + Cc2*Cc3*Co3*Rc2*Rc3*Ro3*s**3 + Cc2*Cc3*Co3*Rc3*Ro2*Ro3*s**3 + Cc2*Cc3*Rc2*Rc3*s**2 + Cc2*Cc3*Rc2*Ro3*s**2 + Cc2*Cc3*Rc3*Ro2*s**2 + Cc2*Cc3*Ro2*Ro3*s**2 + Cc2*Co1*Co2*Co3*Rc2*Ro1*Ro2*Ro3*s**4 + Cc2*Co1*Co2*Rc2*Ro1*Ro2*s**3 + Cc2*Co1*Co3*Rc2*Ro1*Ro3*s**3 + Cc2*Co1*Co3*Ro1*Ro2*Ro3*s**3 + Cc2*Co1*Rc2*Ro1*s**2 + Cc2*Co1*Ro1*Ro2*s**2 + Cc2*Co2*Co3*Rc2*Ro2*Ro3*s**3 + Cc2*Co2*Rc2*Ro2*s**2 + Cc2*Co3*Rc2*Ro3*s**2 + Cc2*Co3*Ro2*Ro3*s**2 + Cc2*Rc2*s + Cc2*Ro2*s + Cc3*Co1*Co2*Co3*Rc3*Ro1*Ro2*Ro3*s**4 + Cc3*Co1*Co2*Rc3*Ro1*Ro2*s**3 + Cc3*Co1*Co2*Ro1*Ro2*Ro3*s**3 + Cc3*Co1*Co3*Rc3*Ro1*Ro3*s**3 + Cc3*Co1*Rc3*Ro1*s**2 + Cc3*Co1*Ro1*Ro3*s**2 + Cc3*Co2*Co3*Rc3*Ro2*Ro3*s**3 + Cc3*Co2*Rc3*Ro2*s**2 + Cc3*Co2*Ro2*Ro3*s**2 + Cc3*Co3*Rc3*Ro3*s**2 + Cc3*Rc3*s + Cc3*Ro3*s + Co1*Co2*Co3*Ro1*Ro2*Ro3*s**3 + Co1*Co2*Ro1*Ro2*s**2 + Co1*Co3*Ro1*Ro3*s**2 + Co1*Ro1*s + Co2*Co3*Ro2*Ro3*s**2 + Co2*Ro2*s + Co3*Ro3*s + 1)/(Rc1*Rc2*Rc3*Ro1*Ro2*Ro3*Ro4)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

This example takes ca. 8...10s. It is part of a simplification procedure which works nicely so far but the speed is not good. That is why I would like to improve here (if possible).
Thanks in advance for your help!
Sally

Ondřej Čertík

unread,
May 12, 2020, 3:00:23 PM5/12/20
to syme...@googlegroups.com
Hi Sally,

It seems that expanding the expression (.expand()) and then multiplying by (Rc1*Rc2*Rc3*Ro1*Ro2*Ro3*Ro4) might be able to achieve the simplification. SymEngine should be able to do this. Let me know.

Ondrej
> --
> You received this message because you are subscribed to the Google
> Groups "symengine" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to symengine+...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/symengine/7fd934fc-f53f-4769-9045-15317c2fdbcd%40googlegroups.com <https://groups.google.com/d/msgid/symengine/7fd934fc-f53f-4769-9045-15317c2fdbcd%40googlegroups.com?utm_medium=email&utm_source=footer>.

Sally Thu

unread,
May 13, 2020, 12:24:18 AM5/13/20
to symengine
Hi Ondrej,

I would need the expression to be in simple SOP form (Sum Of Products) without sub-divisions. 
I actually do apply .factor() and then .expand() and then .collect(s) to get the right expression format. This .factor() step just costs too much time with sympy.
The target is to simplify the expression before and discard at the end insignificant terms (=approximation after generation).
I am also working on an algorithm which does approximation before generation, so that the expressions do not grow that big right away but there are other problems to solve :-).
So I suspect that I just would need the sympy .factor() command to be faster.

Thanks for your help!
Best Regards
Sally
> an email to syme...@googlegroups.com.

Aaron Meurer

unread,
May 13, 2020, 3:32:35 AM5/13/20
to symengine
Hi Sally.

In this case, the expression did not actually factor. factor() factors
a polynomial into a product of irreducible factors, but in this case,
both the numerator and denominator of the factored expression are a
sum, not a product, meaning they do not factor. Is this typical? If
so, then it is probably a waste of time to call factor(). If you just
want to put the expression as numerator/denominator you can use
cancel(), which will remove common factors, or if you don't even care
about that, you can use as_numer_denom(). For example, if a is your
expression, the following produces the same result as factor(), but
instantly

n, d = a.as_numer_denom()
factor_terms(n.expand())/d

(factor_terms just factors out common monomial terms so that they can
cancel with d, which is all that is needed for this particular
expression).

The issue with factor() is that it tries to do a full factorization.
The resulting factors from factor() are always irreducible. This can
be slow on multivariate polynomials. SymPy's polynomial algorithms are
also in general slow on polynomials with a lot of variables, due to
some internal representational issues.

Aaron Meurer
> To unsubscribe from this group and stop receiving emails from it, send an email to symengine+...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/symengine/f2556ca9-37f5-4f6e-9467-aeb533d5ba52%40googlegroups.com.

Sally Thu

unread,
May 13, 2020, 7:20:41 AM5/13/20
to symengine
Hi Aaron,
Wow you were totally right. If I apply .as_numer_denom() & factor_terms() then it speeds up substantially! (>10x faster)
Thanks a lot for that tip.
And thanks a lot for providing & supporting sympy&symengine. This is really good software!
Best Regards
Sally
Reply all
Reply to author
Forward
0 new messages