41 lines
1011 B
OCaml
41 lines
1011 B
OCaml
(** Testing for primality *)
|
|
|
|
open Builtin
|
|
open Basic_arithmetics
|
|
open Power
|
|
|
|
(** Deterministic primality test *)
|
|
let is_prime n =
|
|
if n = 2 || n = 3 then
|
|
true
|
|
else
|
|
if modulo n 2 = 0 || modulo n 3 = 0 then
|
|
false
|
|
else
|
|
let rec is_prime_rec k =
|
|
if (6*k-1) * (6*k-1) > n then
|
|
true
|
|
else
|
|
match (6*k-1, 6*k+1) with
|
|
(a, b) when modulo n a = 0 || modulo n b = 0 -> false
|
|
| _ -> is_prime_rec (k+1)
|
|
in is_prime_rec 1;;
|
|
|
|
(** Pseudo-primality test based on Fermat's Little Theorem
|
|
@param p tested integer
|
|
@param testSeq sequence of integers againt which to test
|
|
*)
|
|
|
|
let is_pseudo_prime p test_seq =
|
|
let rec is_pseudo_prime_rec l =
|
|
match l with
|
|
[] -> true
|
|
| e::l1 when mod_power e (p-1) p <> 1 -> begin
|
|
if gcd e p = 1 then
|
|
false
|
|
else
|
|
is_pseudo_prime_rec l1
|
|
end
|
|
| _::l1 -> is_pseudo_prime_rec l1
|
|
in is_pseudo_prime_rec test_seq;;
|