# How does Mathematica integrate?

Basically, this question can be considered to be an extenstion to my other question.

What I wanted to do was this integral as homework (it is indefinite BTW so no approximations using Simpson's Rule or Boole's Rule)

$$\int(x^{3m}+x^{2m}+x^{m})(2x^{2m}+3x^{m}+6)^{\frac1{m}}dx$$

So using Mathematica's Integrate function the answer was

Apparently, after rigorous substitutions and transformations the answer was found to be correct.

What I wanted to know was how Mathematica integrates these functions that require a human tons of intuition to compute, within seconds, and often in the most simple way and also presents them in the most humanly computable form.

(Even differentiation for that matter)

-
See my answer here. –  Guess who it is. Jun 14 '12 at 15:07
One common method for expressions with elementary functions is the Risch algorithm. You can Google this and you'll get lots of interesting references. This is not a simple to implement algorithm though, according to the descriptions (I don't know how it works). In fact technically it is not even an algorithm because it involves a step where it's necessary to decide whether an expression is identically zero---which is an undecidable problem. –  Szabolcs Jun 14 '12 at 15:07
Just for kicks I threw this integral at both Mathematica 8 and Maple 15. No problem for Mathematica, but Maple chokes. –  David Skulsky Jun 15 '12 at 1:39
@DavidSkulsky Any reasons Why it may be so? –  The-Ever-Kid Jun 15 '12 at 6:47
@The-Ever-Kid: Beats me. –  David Skulsky Jun 15 '12 at 13:31

I can only direct you to Some Notes on Internal Implementation:

## Differentiation and Integration

Differentiation uses caching to avoid recomputing partial results.

For indefinite integrals, an extended version of the Risch algorithm is used whenever both the integrand and integral can be expressed in terms of elementary functions, exponential integral functions, polylogarithms, and other related functions.

For other indefinite integrals, heuristic simplification followed by pattern matching is used.

The algorithms in Mathematica cover all of the indefinite integrals in standard reference books such as Gradshteyn-Ryzhik.

Definite integrals that involve no singularities are mostly done by taking limits of the indefinite integrals.

Many other definite integrals are done using Marichev-Adamchik Mellin transform methods. The results are often initially expressed in terms of Meijer G functions, which are converted into hypergeometric functions using Slater's theorem and then simplified.

Integrals over multidimensional regions defined by inequalities are computed by iterative decomposition into disjoint cylindrical or triangular cells.

Integrate uses about 500 pages of Mathematica code and 600 pages of C code.

-
You could probably execute Risch by hand, but it's a nasty business. It's one of those things where using a computer is better. –  Guess who it is. Jun 14 '12 at 15:09
Symbolic integration is performed by a fairly small number of very systematic procedures. For indefinite integration, the idea of these procedures is to find the most general form of the integral, then to differentiate this and try to match up undetermined coefficients. Often this procedure produces at an intermediate stage immensely complicated algebraic expressions, and sometimes very sophisticated kinds of mathematical functions. But the great advantage of the procedure is that it is completely systematic –  belisarius Jun 14 '12 at 15:11
and its operation requires no special cleverness of the kind that only a human could be expected to provide. –  belisarius Jun 14 '12 at 15:11
I don't believe that Mathematica has the full Risch. For example it fails on Integrate[x^3 ExpIntegralE[1, x], x], which could rightly evaluate to 1/4 E^-x (-6 - 6 x - 3 x^2 - x^3 + E^x x^4 ExpIntegralE[1, x]). –  M.R. Jun 14 '12 at 22:34
For example it fails on Integrate[x^3 ExpIntegralE[1, x], x] as of version 10.01, M can now solve this and gives this: -x^3 ExpIntegralE[2, x] - 3 (x^2 ExpIntegralE[3, x] + 2 (x ExpIntegralE[4, x] + ExpIntegralE[5, x])) which is the same as the expression you show. (after some simplifications) –  Nasser Nov 19 '14 at 5:16