Skip to main content

crypto_primes/
hazmat.rs

1//! Components to build your own primality test.
2//! Handle with care.
3
4mod float;
5mod gcd;
6mod jacobi;
7mod lucas;
8mod miller_rabin;
9mod precomputed;
10mod primecount;
11#[cfg(test)]
12pub(crate) mod primes;
13#[cfg(test)]
14pub(crate) mod pseudoprimes;
15mod sieve;
16
17pub use lucas::{AStarBase, BruteForceBase, LucasBase, LucasCheck, SelfridgeBase, lucas_test};
18pub use miller_rabin::{MillerRabin, minimum_mr_iterations};
19pub use primecount::estimate_primecount;
20pub use sieve::{SetBits, SieveFactory, SmallFactorsSieve, SmallFactorsSieveFactory, random_odd_integer};
21
22pub(crate) use sieve::{ConventionsTestResult, conventions_test, equals_primitive, small_factors_test};
23
24/// Possible results of various primality tests.
25#[derive(Copy, Clone, Debug, PartialEq, Eq)]
26pub enum Primality {
27    /// The number is definitely prime.
28    Prime,
29    /// The number is probably prime
30    /// (see the documentation for the details about possible false positives).
31    ProbablyPrime,
32    /// The number is definitely composite.
33    Composite,
34}
35
36impl Primality {
37    /// Returns `true` if the result indicates that the number is definitely composite.
38    pub fn is_composite(&self) -> bool {
39        match self {
40            Self::Prime => false,
41            Self::ProbablyPrime => false,
42            Self::Composite => true,
43        }
44    }
45
46    /// Returns `true` if the result indicates that the number is probably or definitely prime.
47    pub fn is_probably_prime(&self) -> bool {
48        match self {
49            Self::Prime => true,
50            Self::ProbablyPrime => true,
51            Self::Composite => false,
52        }
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use alloc::format;
59
60    use super::Primality;
61
62    #[test]
63    fn primality_derived_traits() {
64        assert_eq!(format!("{:?}", Primality::Prime), "Prime");
65        assert_eq!(Primality::Prime, Primality::Prime);
66        assert!(Primality::Prime != Primality::ProbablyPrime);
67        assert_eq!(Primality::Prime.clone(), Primality::Prime);
68    }
69
70    #[test]
71    fn primality_to_bool() {
72        assert!(Primality::Prime.is_probably_prime());
73        assert!(Primality::ProbablyPrime.is_probably_prime());
74        assert!(!Primality::Composite.is_probably_prime());
75
76        assert!(!Primality::Prime.is_composite());
77        assert!(!Primality::ProbablyPrime.is_composite());
78        assert!(Primality::Composite.is_composite());
79    }
80}