What a test cannot do
A function taking two 32-bit integers has possible inputs, about . At a billion cases per second, exhaustive testing finishes in 585 years. Every test suite ever written samples.
A proof does something categorically different. It establishes a property for every input at once, including inputs that will never be constructed, by arguing about the structure of the problem rather than checking instances.
Key idea: Testing and proof answer different questions. Testing asks "did it work on these?" and is cheap, empirical and always incomplete. Proof asks "must it work on all?" and is expensive, deductive, and complete within its assumptions. Serious systems use both, and knowing which one a claim rests on tells you what its failure would look like.

