12

Let p[x] be a polynomial in x and consider the partial fraction decomposition of 1/p[x].

The function Apart[] fails in simple cases like this

Apart[1/(1 + x^2)]

(* Out[37]= 1/(1 + x^2) *)

We could define a function

cApart[invp_] := Module[{z, c},
   z = x /. Solve[0 == 1/invp, x];
   c[k_] := 
    Product[If[i != k, 1/(z[[k]] - z[[i]]), 1], {i, 1, Length[z]}];
   Sum[c[i]/(x - z[[i]]), {i, 1, Length[z]}]];

which does the job

cApart[1/(1 + x^2)]

(* Out[36] = -(I/(2 (-I + x))) + I/(2 (I + x)) *)

But my question: is there an option for Apart[] or another standard facility in Mathematica which gives the decomposition in general, i.e. in the complex domain?

EDIT #1.1 Standard solution using Extension

The hints given so far can be codensed in this example

With[{d = 1 + x + x^2}, 
 Apart[1/Factor[d, Extension -> (x /. Solve[d == 0, x])]]]

(* -(1/((-1 + 2 (-1)^(1/3)) (-1 + (-1)^(1/3) - x))) - 1/((-1 + 
    2 (-1)^(1/3)) ((-1)^(1/3) + x)) *)

But it turns out that this procedure is not useful in practical applications as it takes extremely long calculation times (e.g. 1+x+x^4 took to Long to wait for it).

The following form (or something similar) would be nice to have

Apart[1/p[x], Extension -> Complexes] (* proposal, not available *)

EDIT #1.2 Other applications of cApart

It is interesting to apply cApart to a polynomial of higher degree

cApart[1/(1 + x + x^6)]

(* 
Out[64]= 
 1/((x - Root[1 + #1 + #1^6 &, 1]) (Root[1 + #1 + #1^6 &, 1] -
       Root[1 + #1 + #1^6 &, 2]) (Root[1 + #1 + #1^6 &, 1] - 
      Root[1 + #1 + #1^6 &, 3]) (Root[1 + #1 + #1^6 &, 1] - 
      Root[1 + #1 + #1^6 &, 4]) (Root[1 + #1 + #1^6 &, 1] - 
      Root[1 + #1 + #1^6 &, 5]) (Root[1 + #1 + #1^6 &, 1] - 
      Root[1 + #1 + #1^6 &, 6])) + 
 1/((x - Root[1 + #1 + #1^6 &, 2]) (-Root[1 + #1 + #1^6 &, 1] + 
      Root[1 + #1 + #1^6 &, 2]) (Root[1 + #1 + #1^6 &, 2] - 
      Root[1 + #1 + #1^6 &, 3]) (Root[1 + #1 + #1^6 &, 2] - 
      Root[1 + #1 + #1^6 &, 4]) (Root[1 + #1 + #1^6 &, 2] - 
      Root[1 + #1 + #1^6 &, 5]) (Root[1 + #1 + #1^6 &, 2] - 
      Root[1 + #1 + #1^6 &, 6])) + 
 1/((x - Root[1 + #1 + #1^6 &, 3]) (-Root[1 + #1 + #1^6 &, 1] + 
      Root[1 + #1 + #1^6 &, 3]) (-Root[1 + #1 + #1^6 &, 2] + 
      Root[1 + #1 + #1^6 &, 3]) (Root[1 + #1 + #1^6 &, 3] - 
      Root[1 + #1 + #1^6 &, 4]) (Root[1 + #1 + #1^6 &, 3] - 
      Root[1 + #1 + #1^6 &, 5]) (Root[1 + #1 + #1^6 &, 3] - 
      Root[1 + #1 + #1^6 &, 6])) + 
 1/((x - Root[1 + #1 + #1^6 &, 4]) (-Root[1 + #1 + #1^6 &, 1] + 
      Root[1 + #1 + #1^6 &, 4]) (-Root[1 + #1 + #1^6 &, 2] + 
      Root[1 + #1 + #1^6 &, 4]) (-Root[1 + #1 + #1^6 &, 3] + 
      Root[1 + #1 + #1^6 &, 4]) (Root[1 + #1 + #1^6 &, 4] - 
      Root[1 + #1 + #1^6 &, 5]) (Root[1 + #1 + #1^6 &, 4] - 
      Root[1 + #1 + #1^6 &, 6])) + 
 1/((x - Root[1 + #1 + #1^6 &, 5]) (-Root[1 + #1 + #1^6 &, 1] + 
      Root[1 + #1 + #1^6 &, 5]) (-Root[1 + #1 + #1^6 &, 2] + 
      Root[1 + #1 + #1^6 &, 5]) (-Root[1 + #1 + #1^6 &, 3] + 
      Root[1 + #1 + #1^6 &, 5]) (-Root[1 + #1 + #1^6 &, 4] + 
      Root[1 + #1 + #1^6 &, 5]) (Root[1 + #1 + #1^6 &, 5] - 
      Root[1 + #1 + #1^6 &, 6])) + 
 1/((x - Root[1 + #1 + #1^6 &, 6]) (-Root[1 + #1 + #1^6 &, 1] + 
      Root[1 + #1 + #1^6 &, 6]) (-Root[1 + #1 + #1^6 &, 2] + 
      Root[1 + #1 + #1^6 &, 6]) (-Root[1 + #1 + #1^6 &, 3] + 
      Root[1 + #1 + #1^6 &, 6]) (-Root[1 + #1 + #1^6 &, 4] + 
      Root[1 + #1 + #1^6 &, 6]) (-Root[1 + #1 + #1^6 &, 5] + 
      Root[1 + #1 + #1^6 &, 6]))
*)

Which gives the solution in a very regular pattern involving the function Root[]. The numeric evaluation gives

% // N

(*
Out[65]= -((
  0.0965468 + 0.0295033 I)/((-0.945402 - 0.611837 I) + x)) - (
 0.0965468 - 0.0295033 I)/((-0.945402 + 0.611837 I) + x) - (
 0.084438 + 0.114801 I)/((0.154735 - 1.03838 I) + x) - (
 0.084438 - 0.114801 I)/((0.154735 + 1.03838 I) + x) + (
 0.180985 - 0.279696 I)/((0.790667 - 0.300507 I) + x) + (
 0.180985 + 0.279696 I)/((0.790667 + 0.300507 I) + x)
*)

We can even continue to use these symbolic Root[] expressions in more complicated environments such as

g[a_] = Integrate[
  Exp[-a x]/(x - Root[1 + #1 + #1^6 &, 1]), {x, 0, \[Infinity]}, 
  Assumptions -> a > 0]

(* Out[69]= E^(-a Root[1 + #1 + #1^6 &, 1]) (-I \[Pi] - 
   CoshIntegral[a Root[1 + #1 + #1^6 &, 1]] - 
   SinhIntegral[a Root[1 + #1 + #1^6 &, 1]]) *)

It is gratifying that the integral is evaluated symbolically. We can now easily calculate numerical values, e.g.

g[1.]

(* Out[70]= 0.653737 - 0.158332 I *)

Regards,
Wolfgang

Dr. Wolfgang Hintze
  • 13,039
  • 17
  • 47
  • Maybe this is related? – mikuszefski Dec 11 '14 at 09:20
  • You can do this: Apart@Factor[1/(x^2 + 1), Extension -> I]. This answer is closely related Factoring polynomials to factors involving complex coefficients. Apart – Artes Dec 11 '14 at 09:20
  • @Artes: Thanks. It looks good but it fails for 1/(1+x^3) which is not completely decomposed or 1/(1+x+x^2) which is not decomposed at all (Version 8). – Dr. Wolfgang Hintze Dec 11 '14 at 09:45
  • @Dr.WolfgangHintze Extension depends on a case by case basis of course. Here this works: Apart@Factor[1/(1 + x^3), Extension -> {(-1)^(1/3)}] or even better FullSimplify /@ Apart@Factor[1/(1 + x^3), Extension -> {(-1)^(1/3), I}] – Artes Dec 11 '14 at 09:53
  • @ mikuszefski: thanks for this link where they give an interesting generalization to Extension of the hint of Artes: for example With[{d = 1 + x + x^6}, Apart[1/Factor[d, Extension -> (x /. Solve[d == 0, x])]]] but takes much more time than my Routine. – Dr. Wolfgang Hintze Dec 11 '14 at 09:57
  • @Artes: thank you. So you need to know in advance which Extension to take. In the link of mikuszefski I found the general form of Extension. But as stated in my comment to him, this is elegant but takes rather long time to be evaluated. – Dr. Wolfgang Hintze Dec 11 '14 at 10:01
  • @Dr.WolfgangHintze Most of the time the elegant solution is the fast one, but I agree that this is not always the case. Your code looks quite short and efficient (although I would generalize it a bit, e.g. introducing function parameter var_ in case it is not x and using Denominator[] to treat, well, only the denominator...). – mikuszefski Dec 11 '14 at 11:18
  • I highly appreciate your solution, but it has two shortcomings. Firstly the numerator is fixed to 1, and secondly it does not work for multiple roots. It is really pity that Wolfram does not implement this most general form of Apart. – drer May 17 '17 at 13:43
  • 1
    There are both ExtendedApart and ApartAll in the Wolfram Function Repository. – Daniel Lichtblau May 05 '22 at 15:18

1 Answers1

14

Re: "But my question: is there an option for Apart[] or another standard facility in Mathematica which gives the decomposition in general, i.e. in the complex domain?"

There's Integrate`ComplexApart[p[x], x]:

Integrate`ComplexApart[1/(x^2 + 1), x]

$$\frac{i}{2 (x+i)}-\frac{i}{2 (x-i)}$$

Integrate`ComplexApart[1/(1 + x + x^6), x]

$\frac{-7776 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,6\right]+6480 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,6\right]^2-5400 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,6\right]^3+4500 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,6\right]^4-3750 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,6\right]^5-3125}{43531 \left(x-\text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,6\right]\right)}+\frac{-7776 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,5\right]+6480 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,5\right]^2-5400 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,5\right]^3+4500 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,5\right]^4-3750 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,5\right]^5-3125}{43531 \left(x-\text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,5\right]\right)}+\frac{-7776 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,4\right]+6480 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,4\right]^2-5400 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,4\right]^3+4500 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,4\right]^4-3750 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,4\right]^5-3125}{43531 \left(x-\text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,4\right]\right)}+\frac{-7776 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,3\right]+6480 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,3\right]^2-5400 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,3\right]^3+4500 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,3\right]^4-3750 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,3\right]^5-3125}{43531 \left(x-\text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,3\right]\right)}+\frac{-7776 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,2\right]+6480 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,2\right]^2-5400 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,2\right]^3+4500 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,2\right]^4-3750 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,2\right]^5-3125}{43531 \left(x-\text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,2\right]\right)}+\frac{-7776 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,1\right]+6480 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,1\right]^2-5400 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,1\right]^3+4500 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,1\right]^4-3750 \text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,1\right]^5-3125}{43531 \left(x-\text{Root}\left[\text{$\#$1}^6+\text{$\#$1}+1\&,1\right]\right)}$


I (re?)discovered Factor[..., Extension -> All] today in V13, which may or may not have worked since year 1. It gives the complete factorization of a polynomial, which is needed for the partial fractions decomposition. However, Apart does not always seem to succeed.

(* SUCCESS *)
Apart[Factor[1/(1 + x^6), Extension -> All]] // Map@Simplify
(*
I/(6 I - 6 x) + I/(6 I + 6 x) +
 1/(6 - 3 (-I + Sqrt[3]) x) + 1/(6 + 3 (-I + Sqrt[3]) x) +
 1/(6 - 3 (I + Sqrt[3]) x) + 1/(6 + 3 (I + Sqrt[3]) x)
*)

(* FAILURE ) Apart[Factor[1/(1 + x + x^6), Extension -> All]] ( -(1/((x - Root[1 + #1 + #1^6 &, 1]) * (x - Root[1 + #1 + #1^6 &, 2]) * (x - Root[1 + #1 + #1^6 &, 3]) * (x - Root[1 + #1 + #1^6 &, 4]) * (x - Root[1 + #1 + #1^6 &, 5]) * (-x + Root[1 + #1 + #1^6 &, 6]))) *)

Applying the x /. Solve[..] method in Edit #1 of the OP ran for minutes before I killed it:

With[{d = (1 + x + x^6)},
 Apart[1/Factor[d, Extension -> (x /. Solve[d == 0, x])]]]

Update 2023.03.24

There are (since 2020) resource functions that accomplish partial fractions decompositions over extensions of the rationals:

Michael E2
  • 235,386
  • 17
  • 334
  • 747
  • It does not appear to be Root[] per se for it fails when we replace them by a compound numeric expression: Apart[Factor[1/(1 + x + x^6), Extension -> All] /. Verbatim[Root][_, n_, ___] :> Sin[n]]. But Apart works if the Root[] objects are replaced by symbols. – Michael E2 May 05 '22 at 14:00