a preconditioner
Preconditioning is the single most important practical idea in iterative solving — it is, in working scientists' words, often the difference between a method that converges in ten steps and one that never converges at all. The starting observation: every Krylov method (CG, GMRES, BiCGStab) converges fast when the matrix is 'nice' — well-conditioned, or with eigenvalues bunched into a few tight clusters — and crawls when the matrix is ill-conditioned or has a spread-out spectrum. Most real matrices are not nice. So instead of solving the hard system A x = b directly, we solve an equivalent system that has the same solution but a far friendlier matrix.
Concretely, find a matrix M that approximates A but is cheap to solve with, then solve the transformed system M^{-1} A x = M^{-1} b (this is left preconditioning; there are right and split variants too). The solution x is unchanged, but the iteration now sees the matrix M^{-1} A instead of A. If M is a good approximation of A, then M^{-1} A is close to the identity matrix, whose eigenvalues are all 1 — perfectly clustered — and a Krylov method on something near the identity converges almost instantly. The whole art is to choose M to be simultaneously close to A (so M^{-1} A is well-conditioned or clustered) and cheap to invert (so applying M^{-1} each step is fast). These two goals fight each other; the perfect preconditioner M = A would give convergence in one step but costs as much as solving the original problem.
The common choices span that trade-off. The cheapest is the Jacobi or diagonal preconditioner, M = diagonal of A — almost free but only mildly helpful. Incomplete LU (ILU) or incomplete Cholesky factorizations compute an approximate factorization of A while discarding most of the fill-in, giving a much stronger M at moderate cost. For PDEs, multigrid is itself an extraordinarily effective preconditioner. Whichever you pick, the mental model is the same: a preconditioner reshapes the spectrum of the problem so the iteration has an easy landscape to descend. Get the preconditioner right and an intractable solve becomes routine; get it wrong and the fanciest Krylov method is helpless.
Solve A x = b where A has condition number 10^6 (CG would crawl). With an incomplete-Cholesky preconditioner M, the preconditioned matrix M^{-1} A has condition number near 30, and preconditioned CG converges in a few dozen steps instead of tens of thousands — same answer, vastly less work.
Replace A by M^{-1} A with M close to A but cheap to invert — the spectrum clusters, convergence races.
There is no universal best preconditioner — the right M depends on the structure of A (PDE type, sparsity, physics), and a preconditioner that is brilliant for one problem can be useless or even slow another down. Building and applying M also costs work, so the true measure is total time, not iteration count alone.