View Source Prime (prime v0.1.1)
The main module you'll interact with.
This module provides two functions, generate/1 and test/1,
where the former essentially depends on the latter. That is,
generate/1 generates a prime by means of yielding a random
number using Enum.random/1 and, if the number gained is proven
by test/1 to be a prime, it returns the prime, and if not
it recursively invokes generate/1 until Enum.random/1 successfully
returns a prime.
Prime number theorem
asserts that there are approximately n/ln(n) prime numbers between
1 and n. Therefore we can assume the probability for the randomly chosen
number between 1 and n to be the prime number is 1/ln(n).
ln(2^128) approximately equals to 89. This means you'll only need
less than 100 attempts to find a prime number between 1 and 2^128.
That's why it's just ok to make a recursion with no apparent base case.
Note, however, that the probablistic nature again reside in the test/1,
hence there is actually a little more than 1/ln(n) steps to generate a prime.
See the doc of Prime.Fermat for details.
Link to this section Summary
Link to this section Functions
Specs
generate(bit_size :: pos_integer()) :: pos_integer()
Returns a random prime number of given bit size.
Specs
test(pos_integer()) :: boolean()
Tests if the given number is a prime.
Examples
iex> Prime.test(3)
true
iex> Prime.test(42)
false
iex> Prime.test(561)
false
iex> Prime.test(1_000_000_007)
true