malachite_base/num/factorization/mod.rs
1// Copyright © 2026 Mikhail Hogrefe
2//
3// This file is part of Malachite.
4//
5// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
6// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
7// 3 of the License, or (at your option) any later version. See <https://www.gnu.org/licenses/>.
8
9/// [`Factor`](traits::Factor), a trait for computing the prime factorization of a number.
10pub mod factor;
11/// [`IsPower`](traits::IsPower) and [`ExpressAsPower`](traits::ExpressAsPower), traits for testing
12/// if a number is a perfect power and, if it is, expressing it as such.
13///
14/// # is_power
15/// ```
16/// use malachite_base::num::factorization::traits::IsPower;
17///
18/// assert!(0u8.is_power());
19/// assert!(1u16.is_power());
20/// assert!(36u32.is_power());
21/// assert!(64u32.is_power());
22/// assert!(100u64.is_power());
23/// assert!(1728u64.is_power());
24///
25/// assert!(0u8.is_power());
26/// assert!(1u16.is_power());
27/// assert!(!2u64.is_power());
28/// assert!(!3u64.is_power());
29/// ```
30///
31/// # express_as_power
32/// ```
33/// use malachite_base::num::factorization::traits::ExpressAsPower;
34///
35/// assert_eq!(0u8.express_as_power().unwrap(), (0, 2));
36/// assert_eq!(1u16.express_as_power().unwrap(), (1, 2));
37/// assert_eq!(36u32.express_as_power().unwrap(), (6, 2));
38/// assert_eq!(64u32.express_as_power().unwrap(), (2, 6));
39/// assert_eq!(100u64.express_as_power().unwrap(), (10, 2));
40/// assert_eq!(1728u64.express_as_power().unwrap(), (12, 3));
41///
42/// assert!(0u8.express_as_power().is_some());
43/// assert!(1u16.express_as_power().is_some());
44/// assert!(2u64.express_as_power().is_none());
45/// assert!(3u64.express_as_power().is_none());
46/// ```
47pub mod is_power;
48/// [`IsPrime`](traits::IsPrime), a trait for testing a number for primality.
49pub mod is_prime;
50/// [`IsSquare`](traits::IsSquare), a trait for testing if a number if a perfect square.
51///
52/// # is_square
53/// ```
54/// use malachite_base::num::factorization::traits::IsSquare;
55///
56/// assert!(0u8.is_square());
57/// assert!(1u16.is_square());
58/// assert!(4u32.is_square());
59/// assert!(256u64.is_square());
60///
61/// assert!(!2u8.is_square());
62/// assert!(!5u16.is_square());
63/// assert!(!8u32.is_square());
64/// assert!(!128u64.is_square());
65/// ```
66pub mod is_square;
67/// An efficient prime sieve.
68pub mod prime_sieve;
69/// [`Primes`](traits::Primes), a trait for generating prime numbers.
70///
71/// # primes_less_than
72/// ```
73/// use itertools::Itertools;
74/// use malachite_base::num::factorization::traits::Primes;
75///
76/// assert_eq!(u8::primes_less_than(&10).collect_vec(), &[2, 3, 5, 7]);
77/// assert_eq!(u16::primes_less_than(&11).collect_vec(), &[2, 3, 5, 7]);
78/// assert_eq!(
79/// u32::primes_less_than(&100).collect_vec(),
80/// &[
81/// 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
82/// 89, 97
83/// ]
84/// );
85/// ```
86///
87/// # primes_less_than_or_equal_to
88/// ```
89/// use itertools::Itertools;
90/// use malachite_base::num::factorization::traits::Primes;
91///
92/// assert_eq!(
93/// u8::primes_less_than_or_equal_to(&10).collect_vec(),
94/// &[2, 3, 5, 7]
95/// );
96/// assert_eq!(
97/// u16::primes_less_than_or_equal_to(&11).collect_vec(),
98/// &[2, 3, 5, 7, 11]
99/// );
100/// assert_eq!(
101/// u32::primes_less_than_or_equal_to(&100).collect_vec(),
102/// &[
103/// 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
104/// 89, 97
105/// ]
106/// );
107/// ```
108///
109/// # primes
110/// ```
111/// use itertools::Itertools;
112/// use malachite_base::num::factorization::traits::Primes;
113///
114/// assert_eq!(
115/// u8::primes().collect_vec(),
116/// &[
117/// 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
118/// 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179,
119/// 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251
120/// ]
121/// );
122/// ```
123pub mod primes;
124/// [`PrimitiveRootPrime`](traits::PrimitiveRootPrime), a trait for finding a primitive root modulo
125/// a prime number.
126///
127/// # primitive_root_prime
128/// ```
129/// use malachite_base::num::factorization::traits::PrimitiveRootPrime;
130///
131/// assert_eq!(5u32.primitive_root_prime(), 2);
132/// assert_eq!(191u32.primitive_root_prime(), 19);
133/// assert_eq!(4294967291u32.primitive_root_prime(), 2);
134/// ```
135pub mod primitive_root_prime;
136/// Various traits for generating primes, primality testing, and factorization.
137pub mod traits;