Primality testing is a technique to determine whether or not a given number is prime. It is an important topic for number theory and can be used to select keys in public-key cryptographic systems.

Primality tests can be deterministic or probabilistic, and they should run in polynomial time. A deterministic algorithm should take no more than a certain number of steps, and it must return the correct result with high probability, independently of the input.

## Introduction to Primality Testing

Primality testing is an important aspect of cryptography, computational number theory, and information science. It is a fast and efficient method for determining whether a given number is prime.

Primality tests can be deterministic or probabilistic. Deterministic tests produce a True or False result when the number is prime.

Most common primality tests are probabilistic, based on finding a set of composite witnesses. These numbers, along with the tested number n, are fed to some easily-computable function that determines if n is prime.

Fermat Primality Test (Fermat 1976; Rabin 1980) and Miller-Rabin Primality test are deterministic primality tests based on the remark of Fermat’s Little Theorem: if n is a number, then a raised to the (n -1)st power modulo n is congruent to 1 for any positive integer a.

These tests, which have a polynomial time in the size of n, cannot be fooled. However, if n is composite with probability 1, then they report it as such.

### Definition of Prime Numbers

Prime numbers are whole numbers that can be divided only by two factors, 1 and the number itself. These numbers are often used in cryptography and security for technology and the Internet.

They have occupied the attention of mathematicians since ancient times, and they continue to intrigue scientists today. For example, many people believe that prime number check could have supernatural properties and serve as a basis for communication with extraterrestrial cultures.

Similarly, some people think that there is some kind of order to the distribution of prime numbers. This is probably not true, but it still puzzles professional mathematicians.

A simple way to test whether a number is a prime is to choose some integer a coprime to n and calculate an – 1 modulo n, if the result is different from 1. If this fails, n is probably a composite number. Repeat this process until you are certain of the primality.

### Importance of Primality Testing

Primality testing is important for a wide variety of applications, from public-key cryptography to number generation. Depending on the application, the speed and accuracy of primality tests are critical to a successful implementation.

There are several deterministic primality tests which can be used to check a number’s primality. These include Fermat’s test, Miller-Rabin and Solovay-Strassen.

These tests are based on a probabilistic assumption that some numbers are composite (non-prime), but not others. They may also produce incorrect results for composite numbers, but the probability of this error is low.

In order to reduce the probability of an inaccurate result for a composite number, it is often recommended to repeat the test with a different set of numbers, reducing the number of iterations needed to achieve correct results. A typical randomized test never reports a composite number as prime, but it is possible to detect some composites by choosing different values of a for each iteration.

### Types of Primality Tests

There are two main types of primality tests: deterministic and probabilistic. Deterministic algorithms accept a number and then continually output whether it is a prime or a composite.

These algorithms can be very fast, but they are usually impractical because they require large computations. In contrast, probabilistic tests are faster and can determine a number’s primeness with high probability.

For example, the Agrawal-Kayal-Saxena (AKS) primality test was invented in 2002 and can prove primality of an integer in deterministic, polynomial time. It is the fastest known primality test, but its complexity was O(log n) when it first came out, and many improvements have been made since then.

Another type of primality test is the Lucas test, which states that if there is an integer a such that 1 a n and 5 holds, and if all prime factors q1, q2,.., qs of n- 1 yield 6 always holds, then n is a prime.

## Basic Primality Tests

A primality test is a deterministic algorithm that determines whether a number is a prime or composite. It is of interest in cryptography, computational number theory, and information science.

Unlike integer factorization, which is a computationally hard problem, primality testing is comparatively easy. Its runtime is a polynomial in the input size.

Fermat primality testing is based on the result of Fermat’s little theorem, which states that given a prime number P and any number a (where 0ap), then ap-11modp.

A more advanced form of the Fermat primality test is Miller-Rabin primality testing. This runs in polynomial time and is also probabilistic, but it can distinguish between a composite and a prime.

### Trial Division

There are a number of ways to determine whether a certain number is prime, but the most basic and easiest to implement is the trial division algorithm. It tests the divisibility of a given number by each of its factors in order until the factors are found.

This method is often called the “short division” method and is particularly useful for identifying small factors quickly. However, it is a slow algorithm and can take a while on a computer.

### Sieve of Eratosthenes

The Sieve of Eratosthenes is a simple, ancient algorithm for finding all the prime numbers up to a given limit. It is one of the most efficient ways to find small primes and has been used for centuries.

The algorithm works by dividing the range 2 through n into segments of some size D = n. Then, starting with 2, it marks all the multiples of 2 as not being prime.

The next number that is greater than 2 that hasn’t been marked as not prime is then found and it also gets crossed off the list. After that, the algorithm repeats itself for every number from n up to a certain limit (in this case 121).

### Fermat’s Little Theorem

Fermat’s Little Theorem is a property of all prime numbers that is based on modular exponentiation (see modular arithmetic). This is a very important property that can be used to determine whether a number is a prime or composite.

This theorem is one of the most commonly known primality tests and has several variations. The most popular is a probabilistic test, but deterministic algorithms can also be used to determine whether a number is prime.

Fermat first mentioned the theorem in 16401640, but it was not proved until nearly 100 years later by Euler. He wrote in a letter that he would have sent it to De Bessy if “I did not fear it being too long”.

### Wilson’s Theorem

Wilson’s Theorem is a powerful and efficient primality test that can be programmed for practical applications. It is used in a wide range of fields, including cryptography and digital encryption.

As the world moves to digitization, this theorem has a great deal of importance. It also serves as the basis for many other primality tests.

The underlying idea is that any number p (mod p) has a unique multiplicative inverse, a-1, which depends on its degree and leading term. If a-1 can be written as +-1, then all non-zero values of p are primes.

## Probabilistic Primality Tests

There are two main types of primality tests: deterministic and probabilistic. Deterministic tests determine whether a number is prime with very high probability, while probabilistic tests are more likely to falsely report that a composite number is prime.

A simple deterministic test to check for primality is the trial division test, in which a number n is tested against all integers from 2 to n – 1 that divide it. If n is divisible by any m, it is prime; if n is not divisible by any m, then it is composite.

In contrast, a probabilityistic primality test is a randomized procedure that picks an integer a, and checks some criteria. Unlike a deterministic test, there is a probability of error in a probabilistic test; this can be calculated and reduced as much as we want by increasing the number of iterations.

There are a few practical algorithms to test for primality, such as the Fermat test and the Miller-Rabin test. However, these can be very slow compared to the more efficient methods mentioned above. Fortunately, there are some tricks that can make them a lot faster.

### Miller-Rabin Test

The Miller-Rabin test is an algorithm used to test for primality. It is an improvement over the Solovay-Strassen test, and has a much lower probability of error in the average case. For many composite numbers, the error probability is less than 4-k. This improved error bound should not be relied upon as proof that a number is probably prime, since a cryptographic adversary could use this to defeat the test.

The algorithm works by examining each modular exponentiation of the input number and testing it if it is non-trivial. For instance, if n is a Carmichael number, the test will find that either aZn must begin with 1 or aZn must be -1 (mod p) for every member.

Once aZn is found, it is tested to see if it is also prime or base-2 pseudoprime. If aZn is not prime, it is determined to be composite.

The running time of this algorithm is O(k log3 n), where n is the number tested for primality, and k is the number of rounds performed; thus it is an efficient, polynomial-time algorithm. The use of FFT-based multiplication can decrease the running time to O(k log2 n) or O(k log3 n).

### Solovay-Strassen Test

The Solovay-Strassen Test is an algorithm that can be used to determine if a number is prime or not. It was developed by Robert M. Solovay and Volker Strassen in 1977. It has since been largely superseded by the Miller-Rabin Test, but it remains an important test.

The test uses the law of quadratic reciprocity to evaluate whether a number is prime. In particular, it uses a Jacobi symbol to determine if a number is a quadratic residue modulo p and a Legendre symbol to determine if a number is not a quadratic non-residue mod p.

For any odd prime p, half of the non-zero elements are quadratic residues, while the other half are quadratic non-residues. To perform this testing, a number n is randomly chosen and the result of Equation (2) is checked against the Jacobi symbol and Legendre symbol for n.

If the result of Equation (2) is true, then n is prime. If the result is not, then n is composite. Then the result is passed on to the is_witness function, which chooses k different witnesses a and checks if any of them indicate that n is composite (step 1 of the Solovay-Strassen algorithm). If none of the choices indicate that n is composite, then n is presumed to be prime with odds 2-k.

## Deterministic Primality Tests

A deterministic primality test is a logically correct way to decide whether a number is prime. These tests are typically used in cryptography, where a number needs to be prime or composite.

There are several deterministic primality tests, including the Fermat primality test and the Miller-Rabin test. The latter is a general primality test that can also be used to check the divisibility of numbers.

The Miller-Rabin test looks at additional necessary conditions for a number to be prime; if any of these are met, then n passes the test. Sometimes, a number will pass the test without meeting any of these conditions.

The Artjuhov primality test (originally Rabin’s test) is a variant of the Miller-Rabin test that can be more efficient, since it doesn’t require a large sample size and can find non-trivial square roots of unity in polynomial time. This test is not as good at detecting Carmichael numbers, however.

### AKS Test

The AKS Test (Agrawal-Kayal-Saxena) is the first primality test to be simultaneously general, polynomial-time, deterministic and unconditionally correct. It was developed and published by Manindra Agrawal, Neeraj Kayal and Nitin Saxena in 2002.

It uses a modified version of the Sieve of Eratosthenes to check whether r is prime or not. A table of a values is built up as each r is tested.

The algorithm is polynomial to the digits of n, so it can be evaluated quickly and in a consistent manner. However, its running time is limited by r(n), which has a lower bound of O ((log n)2) bit operations for 347 = n = 10000 [4]. Bernstein postulates that AKS may be improved by a factor of two million by utilizing binary segmentation in GMP bignums for the polynomial multiplies. But he also points out that it takes more than a few minutes for AKS to run on even large inputs.

### Elliptic Curve Primality Proving

Elliptic curve primality proving (ECPP) is one of the fastest and most widely used primality tests. It was first proposed by Shafi Goldwasser and Joe Kilian in 1986.

The ECPP algorithm has several advantages over previously-known algorithms. Firstly, it is deterministic and runs in polynomial time on all but vanishing fractions of inputs of length k for each k.

Second, it is based on the theory of elliptic curves over finite fields. Under certain deep conjectures of analytic number theory, elliptic curve certificates exist for all primes and can be found in polynomial time.

Unlike the probabilistic primality tests of Miller, Solovay-Strassen and Rabin, which terminate in polynomial time on every input but provide no proof of their assertions of primality, ECPP provides a short certificate verifiable in deterministic polynomial time on all but a small fraction of inputs of length k. This is a very useful feature in computational number theory and cryptography, where primes are often used as keys to secure computations.

### Lucas-Lehmer Test

The Lucas-Lehmer test, which is used by the Great Internet Mersenne Prime Search (GIMPS), is a number-theoretic algorithm for determining whether a given exponent is prime. This is an important primality test, as it is significantly faster for Mersenne numbers than any other known general-purpose deterministic primality test, such as the AKS test.

The algorithm consists of calculating each exponent in a sequence of numbers. These are calculated by squaring each number modulo 2 and dividing the result by s. If the second term of the sequence is 0, then the exponent is a prime.

This method is remarkably simple, and is especially suited to digital computers, because it can be done in just a few easy steps. Its simplicity also makes it ideal for teaching students about number theory. It can be a useful tool to help them develop the ability to prove their own Mersenne numbers either composite or prime, as long as they use small exponents.

## Implementation and Optimization

A prime number is a natural number that has no positive divisors other than 1 and itself. Examples of prime numbers include 2, 3, 5, 7, 11, 13, and so on.

To test for primality, a program reads the values entered by the user and then iterates over all numbers within a range of 2 to n. If num is greater than n then an if statement is executed with the code if (number % i) == 0.

Another option for testing for primality is to use the Sieve of Eratosthenes algorithm. The algorithm creates a list of all primes up to a given limit, then tests n against that list.

However, this method can be time-consuming and does not always work well for big numbers. It also requires that n be an exact multiple of a certain prime.

One approach to speed up this method is to pre-compute a list of all the primes in order and then check whether n is an exact multiple of any of them. This will be much faster than testing all of n, and it’s easier to implement as well.

A more efficient technique is to test n for divisibility by either 2 or 3. Then, test through all the numbers of the form 6k +- 1 = n displaystyle scriptstyle 6k pm 1. This will be 3 times faster than checking all numbers up to n.

### Implementing Primality Tests in Code

Primality tests are a type of test used to determine whether a number is prime or not. They are of significant importance in the fields of computational number theory, cryptography and information science.

There are several types of primality tests including deterministic, divisibility, probabilistic and fermat. Deterministic tests output True when the number is prime and False when it is composite.

A deterministic primality test is a fast algorithm that can be used to determine with 100% accuracy whether a given number is prime. This test is often faster than a more specialized algorithm for determining the prime factorization of a number, which is a more complex problem.

Another popular primality testing method is the Miller-Rabin primality test. It is based on Fermat’s Little Theorem and is a probabilistic method that can determine whether a number is a probable prime.

This algorithm is O(k)O(k) for kk tests, multiplied by some time for modular exponentiation and multiplication (schoolbook multiplication uses O(lg n)O(lg2n)). However, because it is a probabilistic test, this method can potentially falsely identify a composite number as a prime.

### Strategies for Optimizing Primality Tests

A primality test is a computational problem involving determining whether a number n is prime or not. It has many practical applications and is a key component of modern cryptography.

In order to speed up the testing process, it is often helpful to pre-compute and store a list of all known primes up to some limit, such as all Carmichael numbers less than 1016 or all the primes of an optimistic gap. Then the test can be done by checking n for divisibility by any of these numbers before testing it for primality.

Another strategy is to use a probabilistic approach to the testing. Some popular primality tests are probabilistic in that they only mark primes as composite if they are selected randomly from a sample space of numbers.

This is much more rigorous than heuristics, as it provides provable bounds on the probability of being fooled by a composite number. However, this also means that it can be much slower than deterministic tests, such as Miller-Rabin and Solovay-Strassen.

One good strategy for optimizing a Primality Test is to use Pollard’s (P-1) method, which finds a factor when k is highly composite. This method is adapted to Mersenne numbers and is far more effective than a standard Lucas-Lehmer primality test for finding factors.

## Appendices

## FAQ’s

### Why is primality testing important in cryptography?

Answer: Cryptography relies on the difficulty of factorizing large numbers into their prime factors. Primality testing is used to determine whether a number is prime or composite, which is an essential step in finding the prime factors of a number. This, in turn, is used in the creation and analysis of cryptographic protocols.

### What is the difference between probabilistic and deterministic primality tests?

Answer: A probabilistic primality test uses randomization to give an answer that is probably correct but not guaranteed to be correct, while a deterministic primality test always gives a correct answer and does not rely on randomness. Deterministic methods tend to be more computationally intensive, while probabilistic methods tend to be faster but less reliable.

### Can all numbers be tested for primality?

Answer: In theory, any positive integer can be tested for primality using one of the primality tests discussed in the book. However, as the size of the number increases, the time and resources required to perform the tests also increase. Therefore, in practice, some numbers are too large to be tested within a reasonable amount of time or using available resources.

**Additional Resources**