This morning my wife (whom I love and adore) woke me up at 3:00 AM with an urgent question.

*“Hey!”* she said, shaking me awake.

“Is 19 prime?”

…

Like a fool, I answered her. “Yes. Yes it is.” Off she went.

This is a true response, but not a *correct* response. I realized shortly afterwards that a correct response would look more like:

I’m glad you asked me that. dear. Eratosthenes, the Greek mathematician, discovered a very efficient way to list primes in about 200 BC that is still in use today. You start by writing out all the numbers from 1 to 19: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19. 1 is a very special number (it’s the multiplicative identity, or what algebraists would call a

unit) so we put a square around it. The first number we didn’t consider was 2, so we circle it – that means it’s prime – and then cross out every multiple of 2 after that. Going back, the first number we didn’t consider was 3… and so on until we get123X5X7X X X11X13X X X17X19. A common optimization is to realize that after circling a primep, the first number you cross out (that wasn’t crossed out before) is alwaysp^{2}, which means that after circling a number you can immediately jump to its square, and also means you can stop crossing out altogether once you hitp^{2 }>N…

This would allow her to fish rather than waking me up when she wanted a fish.

An even better response would have been:

It’s funny you’ve asked me that. Number theorists and cryptanalysts have considered this question for thousands of years. Eratosthenes’ method (see above) is a very simple way to find all the primes below a given number, but an efficient way to determine whether a

givennumber is prime was found only very recently.In practice, the test that is usually used is the randomized version of the Miller-Rabin test. Although this is nondeterministic, it is very fast indeed, and will tell you to a very high degree of certainty whether the given number is prime. This usually suffices.

There is a deterministic version of the Miller-Rabin test too, which is guaranteed to tell you with perfect certainty whether the given number is prime. But it only works if you believe in the generalized Riemann hypothesis. Most mathematicians nowadays believe the hypothesis, but no-one has (yet) been able to prove it.

Amazingly, in 2002 three mathematicians named Manindra Agrawal, Neeraj Kayal, and Nitin Saxena came up with a deterministic, proven, polynomial-time (specifically, polynomial in

the number of digitsin the input) method for telling whether a given number is prime. This is known as the AKS primality test. The most striking thing about this test is its simplicity – if something this straightforward can be found after thousands of years of looking, what else out there remains to be found?

Such a response would probably prevent her from waking me again for any mathematical problem at all. Boo-ya.

Here’s Agrawal, Kayal, and Saxena’s “PRIMES is in P” paper.

Here’s Yves Gallot’s C++ implementation of AKS.

My own Perl implementation is here on GitHub

Here’s the output when I run it on 19:

>perl -w aks.pl 19 Checking for power-ness... Not a power. Looking for the first r where o_r(19) > 25... r = 19 Checking GCD(19, a) for a = 2 to 19... All GCDs are 1 or 19 19 >= 19 so 19 is PRIME

And here’s the output with a bigger input:

>perl -w aks.pl 99 Checking for power-ness... Not a power. Looking for the first r where o_r(997) > 100... r = 103 Checking GCD(997, a) for a = 2 to 103... All GCDs are 1 or 997 Finding the Euler totient of 103 Totient is 102 Checking polynomials up to roughly 100... 997 is PRIME

EDIT 2020-10-22: moved code to GitHub

## One thought on “Teaching someone to fish and the AKS primality test”