Getting Math99 Working Without Losing Your Mind
I installed Math99 on my workbench about three years ago after my go-to solver started choking on anything past cubic polynomials. It runs locally, which keeps data off someone else's server, but the documentation assumes you already know what you're doing half the time. That's why I'm writing this. Math99 is a symbolic computation engine designed for advanced mathematics workflows. It handles things like matrix diagonalization, eigenvalue problems, and differential equation solving that most consumer calculators simply can't touch. The interface is command-line first, though there's a lightweight GUI wrapper if you prefer clicking around. I don't use the GUI. Never did. The command line gives you more control and you get used to it faster than you'd expect.
Installing Math99 on Linux
Grab the latest release from their official GitHub repo, which for context is at math99-org/math99. If you're on Arch, there's an AUR package that handles dependencies for you. On Ubuntu or Debian, you'll need to install gmp-dev, mpfr-dev, and libquadmath before compiling. I wasted an afternoon once trying to skip those because the README didn't call them out clearly enough. Don't do that. After cloning, run make followed by make install. The binary drops into /usr/local/bin. Test it with math99 --version and you should see something like 4.2.1 or higher depending on how recently they pushed.
Core Workflow
The thing people miss about Math99 is that it's not really a calculator. It's a programmable math environment. You write scripts, save them as .m99 files, and execute them. This matters more than you'd think. The first time I solved a system of twelve coupled differential equations, it took about four minutes of setup and then exactly eighteen seconds to compute. A comparable session in commercial software would have eaten twenty minutes of interactive clicking and probably still hung partway through. Here's a minimal script that computes the Jordan normal form of a 5x5 matrix: matrix A = [[2,1,0,0,0],[0,2,1,0,0],[0,0,2,0,0],[0,0,0,3,1],[0,0,0,0,3]];
jordan = jordan_form(A); print(jordan); That's it. Four lines. Run it with math99 script.m99. The output gives you both the Jordan form and the transition matrix. Most other tools return just the form unless you dig through menus to get the eigenvector basis.
For eigenvalue problems, Math99 uses a QR iteration with Wilkinson shifts by default. This is fast for matrices up to about 500x500. Beyond that, the memory footprint jumps because it holds multiple copies of the matrix during convergence. I hit this wall once with a 2000x2000 sparse matrix from a finite-element simulation. The solver ran for eleven hours before I killed it. The workaround was to extract the dominant eigenvalues using eigs() with an Arnoldi iteration instead, which gave me the twelve largest values in about forty seconds.
A Real Problem I Faced
Last year I was verifying solutions for a heat-transfer model where the boundary conditions created a system with repeated eigenvalues close together — say, separated by less than 1e-12. Math99's default numerical solver starts producing garbage at that scale because floating-point precision isn't enough. The result looked plausible but was wrong by about three percent, which is catastrophic when you're validating against experimental data. The fix was switching to arbitrary precision mode. You set it with set_precision(128) before running your computation. This slows everything down roughly four to six times depending on the operation, but it keeps the repeated eigenvalues distinct enough to resolve correctly. My heat equation converged within acceptable tolerance after that change. I spent maybe twenty minutes debugging the issue before realizing precision was the culprit. If you're working with ill-conditioned systems, enable higher precision early. Don't wait until the results look suspicious.
Common Pitfalls
Variable shadowing is a real problem in Math99. If you redefine a variable inside a loop or function scope, it overwrites the outer scope version silently. No warning. No error. Just wrong results. I lost a full day on a linear algebra batch script because a nested loop redefined a matrix variable that the outer calculation depended on. Use descriptive names and avoid single-letter variables wherever possible. Another issue: the default output format prints too many decimal places for publication-quality work. Wrap your output in format(value, precision=8) to keep things readable without losing useful digits.
What Math99 Can't Do Well
It struggles with symbolic integration of functions that involve special functions like Bessel or hypergeometric types. The engine can represent them, but simplification and closed-form evaluation often fail or return unevaluated expressions. If your work involves heavy symbolic calculus, pair Math99 with Mathematica or SymPy for the parts that choke. Parallel computation support is limited. Math99 can distribute independent jobs across cores using parallel_run(), but it doesn't parallelize within a single algorithm. For large matrix operations, you're mostly single-threaded. If multi-core matrix multiplication is critical to your workflow, consider SLEPc or PETSc as alternatives alongside it. There's no built-in plotting. You export data to CSV or JSON and pipe it into Python or Gnuplot for visualization. This is fine once you set up the pipeline, but it's another tool to manage.
When to Use Math99 and When Not To
Use it when you need reliable numerical linear algebra at scale, repeated symbolic workflows, or local execution for sensitive data. Skip it if your work is primarily symbolic integration, requires interactive graphing, or involves only basic algebra where a simpler tool would be faster. The installation takes about fifteen minutes on a fresh system if you have the dependencies. First scripts feel awkward for a couple of hours. After that, it's consistently faster than paying for cloud-based computation for routine work. I've been running the same setup for three years now and haven't switched back.