haar_lib/math/primality/
mod.rs1pub mod eratosthenes;
4pub mod linear_sieve;
5pub mod miller_rabin;
6pub mod segmented;
7
8pub trait PrimalityTest<T> {
10 fn is_prime(&self, value: T) -> bool;
12}
13
14#[cfg(test)]
15mod tests {
16 use crate::timer;
17
18 use super::{eratosthenes::*, linear_sieve::LinearSieve, miller_rabin::*, PrimalityTest};
19
20 #[test]
21 fn test_eratosthenes() {
22 let n = 100;
23 let sieve = EratosthenesSieve::new(n);
24
25 let primes = (1..=n).filter(|&i| sieve.is_prime(i)).collect::<Vec<_>>();
26
27 assert_eq!(
28 primes,
29 [
30 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
31 83, 89, 97
32 ]
33 );
34 }
35
36 #[test]
37 fn test_linear_sieve() {
38 let n = 10000;
39 let sieve1 = EratosthenesSieve::new(n);
40 let sieve2 = LinearSieve::new(n);
41
42 for i in 1..=n {
43 assert_eq!(sieve1.is_prime(i), sieve2.is_prime(i));
44 }
45 }
46
47 #[test]
48 fn test_miller_rabin() {
49 let n = 1000;
50 let sieve = EratosthenesSieve::new(n);
51
52 let primes = (1..=n).filter(|&i| sieve.is_prime(i)).collect::<Vec<_>>();
53
54 assert_eq!(
55 (1..=n)
56 .filter(|&i| MillerRabin.is_prime(i as u64))
57 .collect::<Vec<_>>(),
58 primes
59 );
60 }
61
62 #[test]
63 fn benchmark() {
64 let ns = [
65 1, 10, 100, 1_000, 10_000, 100_000, 1_000_000, 10_000_000,
66 ];
68
69 eprintln!("Sieve of Eratosthenes");
70 for &n in &ns {
71 timer!(n, {
72 let _ = EratosthenesSieve::new(n);
73 })
74 }
75
76 eprintln!("Linear sieve");
77 for &n in &ns {
78 timer!(n, {
79 let _ = LinearSieve::new(n);
80 })
81 }
82 }
83}