crypto_primes/
hazmat.rs

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