Computer-assisted proof refers to the relatively new concept of using a significant computational component in a rigorous mathematical proof. The Four Color Theorem is the breakout example of a result proven with computer assistance; its proof was so controversial (see, e.g., the last chapter in this book) that two researchers later completed a project to formally verify the proof in painstaking detail.

Since then many more problems have been resolved using computer proof, including the Kepler conjecture, existence of the Lorenz attractor (Smale's 14th problem), and the solution of checkers. Even so, the role of computer-assisted proof remains somewhat contentious.

I am particularly interested in situations where it is not immediately obvious that a computer can be used for rigorous proof. (By contrast, it was never in question that, in theory, a computer could solve checkers. Of course, making that a reality still required impressive work.) One tool I use for such problems is an effective form of the inverse function theorem (which can alternately be viewed as a fixed point theorem). Loosely put, this theorem says that if a point can be found which approximately satisfies a system of equations, then there is an exact solution nearby. This theorem can even be used in an infinite-dimensional Banach space, which is a central mathematical component of my gravitational choreography project.

I developed a software package, called QNewton, for rigorously proving existence of solutions to systems of polynomial equations. QNewton is a C++ library with a Python frontend. It has special support for equations over the complex numbers, quaternions, and octonions. It uses a damped Newton's method algorithm, computed by LAPACK, to find an approximate solution. It then proves existence of a nearby solution by using interval arithmetic, as provided by the MPFI library, to bound the inverse of the Jacobian. Below is a transcript of a session using QNewton to find two orthogonal unit vectors over H. It finds an approximate solution and certifies that an exact solution exists within 10-15 of what is printed.

-bash-4.2$ python
Python 2.7.3 (default, Jul 24 2012, 11:41:40)
[GCC 4.6.3 20120306 (Red Hat 4.6.3-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import QNewton, random
>>> q = QNewton.Newton()
>>>
>>> q.set_parser_parameters({'n':3})
>>> q.parse_block("""
... y(length_of_v_minus_1) := SUM i = 1 TO n   x(v_$i)~ x(v_$i) - 1
... y(length_of_w_minus_1) := SUM i = 1 TO n   x(w_$i)~ x(w_$i) - 1
... y(inner_product_of_v_and_w) := SUM i = 1 TO n   x(v_$i)~ x(w_$i)
... CONSTRAIN Ry(length_of_v_minus_1)
... CONSTRAIN Ry(length_of_w_minus_1)
... CONSTRAIN y(inner_product_of_v_and_w)
... """)
>>>
>>> random.seed(0)
>>> for i in [1,2,3]:
...     q.initialize_variable('v_'+str(i), [random.gauss(0,1) for e in range(4)])
...     q.initialize_variable('w_'+str(i), [random.gauss(0,1) for e in range(4)])
...
>>> q.Newton_steps(20)
1.1102230246251565e-16
>>> print q.get_variables(['x(v_'+str(i)+')' for i in [1,2,3]])
[[0.4515263508773185, -0.43936811088449534, -0.6219617443506098, 0.09770788700877156], [-0.4294481290522128, 0.3416675686795149, 0.36230284325540785, 0.07287513389077427], [1.0632934395276348, -0.3844692946079836, 0.2952430393273164, -0.6351234425427567]]
>>> print q.get_variables(['x(w_'+str(i)+')' for i in [1,2,3]])
[[-0.8901934613748367, 0.08285079510389272, -0.22802449412824322, -0.23962866358005525], [-0.08085155541422835, 1.0285395568189042, -0.0377382252039173, -0.513058875975375], [-0.1298925993149464, 0.6588293120641708, 0.09001291506476068, -0.5505993355077293]]
>>>
>>> q.prepare_rigorous()
5.619502137824812e-17
>>> q.do_rigorous(1.0e-15)
'Success'