Let n be a positive integer. If there exists an integer a, 1 < a < n, such that and for every prime factorq of n − 1 then n is prime. If no such number aexists, then n is either 1, 2, or composite. The reason for the correctness of this claim is as follows: if the first equivalence holds for a, we can deduce that a and n are coprime. If a also survives the second step, then the order of a in the group * is equal ton−1, which means that the order of that group is n−1, implying that n is prime. Conversely, if n is prime, then there exists a primitive root modulo n, or generator of the group *. Such a generator has order |*| = n−1 and both equivalences will hold for any such primitive root. Note that if there exists an a < n such that the first equivalence fails, a is called a Fermat witness for the compositeness of n.
Example
For example, take n = 71. Then n − 1 = 70 and the prime factors of 70 are 2, 5 and 7. We randomly select an a=17 < n. Now we compute: For all integers a it is known that Therefore, the multiplicative order of 17 is not necessarily 70 because some factor of 70 may also work above. So check 70 divided by its prime factors: Unfortunately, we get that 1710≡1. So we still don't know if 71 is prime or not. We try another random a, this time choosinga = 11. Now we compute: Again, this does not show that the multiplicative order of 11 is 70 because some factor of 70 may also work. So check 70 divided by its prime factors: So the multiplicative order of 11 is 70, and thus 71 is prime. .
Algorithm
The algorithm can be written in pseudocode as follows: algorithm lucas_primality_test is input: n > 2, an odd integer to be tested for primality. k, a parameter that determines the accuracy of the test. output: prime if n is prime, otherwise composite or possibly composite. determine the prime factors of n−1. LOOP1: repeatk times: pick a randomly in the range
returncomposite else LOOP2: for all prime factors q of n−1:
if we checked this equality for all prime factors of n−1 then returnprime else continue LOOP2 else continue LOOP1 returnpossibly composite.