==================================================================== Full Partial Fraction Expansion ==================================================================== The domain FullPartialFractionExpansion implements factor-free conversion of quotients to full partial fractions. Our examples will all involve quotients of univariate polynomials with rational number coefficients. :: Fx := FRAC UP(x, FRAC INT) Fraction UnivariatePolynomial(x,Fraction Integer) Type: Domain Here is a simple-looking rational function. :: f : Fx := 36 / (x**5-2*x**4-2*x**3+4*x**2+x-2) 36 ---------------------------- 5 4 3 2 x - 2x - 2x + 4x + x - 2 Type: Fraction UnivariatePolynomial(x,Fraction Integer) We use fullPartialFraction to convert it to an object of type FullPartialFractionExpansion. :: g := fullPartialFraction f 4 4 --+ - 3%A - 6 ----- - ----- + > --------- x - 2 x + 1 --+ 2 2 (x - %A) %A - 1= 0 Type: FullPartialFractionExpansion(Fraction Integer, UnivariatePolynomial(x,Fraction Integer)) Use a coercion to change it back into a quotient. :: g :: Fx 36 ---------------------------- 5 4 3 2 x - 2x - 2x + 4x + x - 2 Type: Fraction UnivariatePolynomial(x,Fraction Integer) Full partial fractions differentiate faster than rational functions. :: g5 := D(g, 5) 480 480 --+ 2160%A + 4320 - -------- + -------- + > ------------- 6 6 --+ 7 (x - 2) (x + 1) 2 (x - %A) %A - 1= 0 Type: FullPartialFractionExpansion(Fraction Integer, UnivariatePolynomial(x,Fraction Integer)) f5 := D(f, 5) 10 9 8 7 6 - 544320x + 4354560x - 14696640x + 28615680x - 40085280x + 5 4 3 2 46656000x - 39411360x + 18247680x - 5870880x + 3317760x + 246240 / 20 19 18 17 16 15 14 13 x - 12x + 53x - 76x - 159x + 676x - 391x - 1596x + 12 11 10 9 8 7 6 5 2527x + 1148x - 4977x + 1372x + 4907x - 3444x - 2381x + 2924x + 4 3 2 276x - 1184x + 208x + 192x - 64 Type: Fraction UnivariatePolynomial(x,Fraction Integer) We can check that the two forms represent the same function. :: g5::Fx - f5 0 Type: Fraction UnivariatePolynomial(x,Fraction Integer) Here are some examples that are more complicated. :: f : Fx := (x**5 * (x-1)) / ((x**2 + x + 1)**2 * (x-2)**3) 6 5 x - x ----------------------------------- 7 6 5 3 2 x - 4x + 3x + 9x - 6x - 4x - 8 Type: Fraction UnivariatePolynomial(x,Fraction Integer) g := fullPartialFraction f 1952 464 32 179 135 ---- --- -- - ---- %A + ---- 2401 343 49 --+ 2401 2401 ------ + -------- + -------- + > ---------------- x - 2 2 3 --+ x - %A (x - 2) (x - 2) 2 %A + %A + 1= 0 + 37 20 ---- %A + ---- --+ 1029 1029 > -------------- --+ 2 2 (x - %A) %A + %A + 1= 0 Type: FullPartialFractionExpansion(Fraction Integer, UnivariatePolynomial(x,Fraction Integer)) g :: Fx - f 0 Type: Fraction UnivariatePolynomial(x,Fraction Integer) f : Fx := (2*x**7-7*x**5+26*x**3+8*x) / (x**8-5*x**6+6*x**4+4*x**2-8) 7 5 3 2x - 7x + 26x + 8x ------------------------ 8 6 4 2 x - 5x + 6x + 4x - 8 Type: Fraction UnivariatePolynomial(x,Fraction Integer) g := fullPartialFraction f 1 1 - - --+ 2 --+ 1 --+ 2 > ------ + > --------- + > ------ --+ x - %A --+ 3 --+ x - %A 2 2 (x - %A) 2 %A - 2= 0 %A - 2= 0 %A + 1= 0 Type: FullPartialFractionExpansion(Fraction Integer, UnivariatePolynomial(x,Fraction Integer)) g :: Fx - f 0 Type: Fraction UnivariatePolynomial(x,Fraction Integer) f:Fx := x**3 / (x**21 + 2*x**20 + 4*x**19 + 7*x**18 + 10*x**17 + 17*x**16 + 22*x**15 + 30*x**14 + 36*x**13 + 40*x**12 + 47*x**11 + 46*x**10 + 49*x**9 + 43*x**8 + 38*x**7 + 32*x**6 + 23*x**5 + 19*x**4 + 10*x**3 + 7*x**2 + 2*x + 1) 3 x / 21 20 19 18 17 16 15 14 13 12 x + 2x + 4x + 7x + 10x + 17x + 22x + 30x + 36x + 40x + 11 10 9 8 7 6 5 4 3 2 47x + 46x + 49x + 43x + 38x + 32x + 23x + 19x + 10x + 7x + 2x + 1 Type: Fraction UnivariatePolynomial(x,Fraction Integer) g := fullPartialFraction f 1 1 19 - %A - %A - -- --+ 2 --+ 9 27 > ------ + > --------- --+ x - %A --+ x - %A 2 2 %A + 1= 0 %A + %A + 1= 0 + 1 1 -- %A - -- --+ 27 27 > ---------- --+ 2 2 (x - %A) %A + %A + 1= 0 + SIGMA 5 2 %A + %A + 1= 0 , 96556567040 4 420961732891 3 59101056149 2 - ------------ %A + ------------ %A - ------------ %A 912390759099 912390759099 912390759099 + 373545875923 529673492498 - ------------ %A + ------------ 912390759099 912390759099 / x - %A + SIGMA 5 2 %A + %A + 1= 0 , 5580868 4 2024443 3 4321919 2 84614 5070620 - -------- %A - -------- %A + -------- %A - ------- %A - -------- 94070601 94070601 94070601 1542141 94070601 -------------------------------------------------------------------- 2 (x - %A) + SIGMA 5 2 %A + %A + 1= 0 , 1610957 4 2763014 3 2016775 2 266953 4529359 -------- %A + -------- %A - -------- %A + -------- %A + -------- 94070601 94070601 94070601 94070601 94070601 ------------------------------------------------------------------- 3 (x - %A) Type: FullPartialFractionExpansion(Fraction Integer,UnivariatePolynomial(x,Fraction Integer)) This verification takes much longer than the conversion to partial fractions. :: g :: Fx - f 0 Type: Fraction UnivariatePolynomial(x,Fraction Integer) Use PartialFraction for standard partial fraction decompositions. For more information, see the paper [BS]_. .. [BS] Bronstein, M and Salvy, B., *Full Partial Fraction Decomposition of Rational Functions*, Proceedings of ISSAC'93, Kiev, ACM Press. See Also: * ``)help PartialFraction`` * ``)show FullPartialFractionExpansion``