--- license: mit language: - en tags: - mathematics - calculus - symbolic-math - step-by-step - education - java pipeline_tag: other --- # MathSteps: step-by-step calculus in Java A symbolic maths engine written in **pure Java (no libraries)** that **differentiates** and **integrates** expressions and explains **every step**, like a teacher working on the board. **Try it:** [MathSteps web app](https://huggingface.co/spaces/unnicr/math-steps). The same Java engine runs in your browser. ``` > java -jar math-steps.jar int "x e^x" Step 1: Integration by parts: integral u dv = u v - integral v du (choose u by LIATE: logs, inverse trig, algebraic, trig, exponential) u = x, dv = e^x dx, du = 1 dx, v = e^x Step 2: Now integrate v du integral e^x dx - Standard integral: integral e^u du = e^u Standard integral: integral e^u du = e^u => integral e^x dx = e^x Step 3: So u v - integral v du integral x*e^x dx = x*e^x - e^x Step 4: Answer (add the constant of integration C) integral x*e^x dx = x*e^x - e^x + C Step 5: Check: differentiating the answer gives back the integrand d/dx [x*e^x - e^x] = x*e^x (checked) ``` More worked examples are in [`examples.md`](examples.md). ## What it can do **Derivatives:** - **Rules:** constant, power, sum, constant multiple, product, quotient and chain rules. - **Functions:** exponentials (`e^u`, `a^u`), logarithms, trig (`sin cos tan sec csc cot`) and inverse trig (`arcsin arccos arctan`). - **Logarithmic differentiation** for `f(x)^g(x)`, e.g. `x^x`. - **Neat results:** quotient-rule numerators are expanded and simplified. **Integrals:** | Technique | Example | |---|---| | Power, exponential, log and trig standard integrals | `x^10`, `2^x`, `1/x`, `sec(x)tan(x)` | | Linear substitution | `sin(3x)`, `e^(5x)`, `(3x+1)^4`, `1/(2x+1)` | | u-substitution (automatic choice of u) | `2x cos(x^2)`, `x e^(x^2)`, `ln(x)/x`, `e^(sqrt(x))/sqrt(x)` | | Substitution inside roots | `x sqrt(x+1)`, `x/sqrt(x+1)` | | Integration by parts (LIATE, repeated) | `x e^x`, `x^3 e^x`, `x^2 ln(x)`, `ln(x)`, `arctan(x)` | | Trig identities | `sin^2(x)`, `sin^3(x)`, `sin^4(x)`, `tan^2(x)`, `sin(x)^3 cos(x)^2` | | Partial fractions (with long division) | `1/(x^2-1)`, `(x+3)/(x^2+3x+2)`, `1/(x(x+1)^2)`, `(x^3+1)/(x-1)` | | Completing the square, giving ln + arctan | `1/(x^2+2x+5)`, `(2x+1)/(x^2+x+1)` | | Inverse-trig forms | `1/sqrt(4-x^2)`, `1/sqrt(x^2+1)` | | e^x · sin / cos | `e^x sin(x)`, `e^(2x) cos(3x)` | | Definite integrals | `sin(x)` from 0 to π = 2 | **Exact arithmetic:** fractions stay exact (`x^3/3`, not `0.333x^3`), and special values are simplified (`sin(π/6) = 1/2`, `sqrt(8) = 2√2`). **Honest:** if an integral has no elementary answer (`e^(x^2)`, `sin(x)/x`), it says so instead of guessing. ## Every answer is checked - **Derivatives:** compared with a numerical derivative at 10 points. - **Indefinite integrals:** the answer is differentiated back and compared with the original function. - **Definite integrals:** compared with Simpson's rule (4,000 intervals). The test suite (`test/…/MathStepsTest.java`) runs **227 checks**, and all pass: - 62 derivatives, - 90 integrals, - 10 definite integrals, - 3 integrals that have no elementary answer (correctly rejected), - 62 "print, then read back" round trips. ## Use it **Command line** (Java 8 or newer): ``` java -jar math-steps.jar diff "x^2 sin(x)" java -jar math-steps.jar int "1/(x^2+2x+5)" java -jar math-steps.jar defint "x^2" 0 3 java -jar math-steps.jar int "t e^t" --var t java -jar math-steps.jar int "x ln(x)" --json # machine-readable steps (with LaTeX) java -jar math-steps.jar # interactive: d x^3 | i sin(x)^2 | i x^2 from 0 to 1 ``` **From Java:** ```java import com.unnicr.mathsteps.*; MathSteps.Result r = MathSteps.integral("x^2 ln(x)", "x"); System.out.println(r.answer); // x^3*ln(x)/3 - x^3/9 System.out.println(r.answer.toLatex()); // \frac{x^{3} \cdot \ln\left(x\right)}{3} - \frac{x^{3}}{9} for (Steps.Step s : r.steps.all()) System.out.println(s.title + " :: " + s.text); String json = MathSteps.toJson(r); // for web apps ``` **Input syntax:** - **Implicit multiplication:** `2x`, `x sin(x)`, `3(x+1)`. - **Powers:** `x^2` or `x**2`. - **Functions:** `sqrt( )`, `e^( )` or `exp( )`, `ln( )` or `log( )`, `sin^2(x)`, `|x|`, `arctan( )` or `atan( )`. - **Constants:** `pi` or `π`. - **Other letters** are treated as constants: `a x^2 + b x + c`. ## How it works `Parser` turns text into an expression tree, and `Simplifier` brings it into a canonical form. That means: - exact `Rational` arithmetic, - like terms collected, - powers combined (`x · x^2 = x^3`), - special values applied. `Differentiator` applies rules recursively and records each one. `Integrator` tries these strategies in order, rolling back the recorded steps of any strategy that fails: 1. Constant multiple and sum rule. 2. Standard table, with linear substitution. 3. Trig identities. 4. Rational functions: exact polynomial algebra, rational-root factoring, Gaussian elimination for the partial-fraction coefficients. 5. Expansion. 6. u-substitution: tries inner functions as u and accepts u when `integrand / u'` can be written in u alone. 7. Integration by parts. `Printer` produces both re-parsable plain text and LaTeX. This is a rule-based symbolic engine, not a neural network. It never "hallucinates" a step, and every answer is verified. ## Build from source ``` build.bat (Windows) ./build.sh (Linux/macOS) ``` Both compile for Java 8, run the test suite and build `math-steps.jar`. ## Limits - Real-valued, single-variable calculus. - Not yet covered: trig substitution beyond the arcsin/ln forms above, partial fractions with irrational roots (e.g. `1/(x^2-2)`), and repeated irreducible quadratic factors. - When a technique is missing, the solver says it couldn't find a method rather than giving a wrong answer.