malachite_nz/natural/conversion/digits/
mod.rs

1// Copyright © 2025 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/// Implementations of [`Digits`](malachite_base::num::conversion::traits::Digits), a trait for
10/// extracting digits from [`Natural`](crate::natural::Natural)s and constructing
11/// [`Natural`](crate::natural::Natural)s from digits.
12///
13/// # to_digits_asc
14/// ```
15/// use malachite_base::num::basic::traits::{Two, Zero};
16/// use malachite_base::num::conversion::traits::Digits;
17/// use malachite_nz::natural::Natural;
18///
19/// assert!(Natural::ZERO.to_digits_asc(&6u64).is_empty());
20/// assert_eq!(Natural::TWO.to_digits_asc(&6u32), &[2]);
21/// assert_eq!(
22///     Natural::from(123456u32).to_digits_asc(&3u16),
23///     &[0, 1, 1, 0, 0, 1, 1, 2, 0, 0, 2]
24/// );
25/// ```
26///
27/// # to_digits_desc
28/// ```
29/// use malachite_base::num::basic::traits::{Two, Zero};
30/// use malachite_base::num::conversion::traits::Digits;
31/// use malachite_nz::natural::Natural;
32///
33/// assert!(Natural::ZERO.to_digits_desc(&6u64).is_empty());
34/// assert_eq!(Natural::TWO.to_digits_desc(&6u32), &[2]);
35/// assert_eq!(
36///     Natural::from(123456u32).to_digits_desc(&3u16),
37///     &[2, 0, 0, 2, 1, 1, 0, 0, 1, 1, 0]
38/// );
39/// ```
40///
41/// # from_digits_asc
42/// ```
43/// use malachite_base::num::conversion::traits::Digits;
44/// use malachite_base::strings::ToDebugString;
45/// use malachite_nz::natural::Natural;
46///
47/// assert_eq!(
48///     Natural::from_digits_asc(&64u64, [0, 0, 0].iter().cloned()).to_debug_string(),
49///     "Some(0)"
50/// );
51/// assert_eq!(
52///     Natural::from_digits_asc(&3u64, [0, 1, 1, 0, 0, 1, 1, 2, 0, 0, 2].iter().cloned())
53///         .to_debug_string(),
54///     "Some(123456)"
55/// );
56/// assert_eq!(
57///     Natural::from_digits_asc(&8u16, [3, 7, 1].iter().cloned()).to_debug_string(),
58///     "Some(123)"
59/// );
60/// assert_eq!(
61///     Natural::from_digits_asc(&8u16, [3, 10, 1].iter().cloned()).to_debug_string(),
62///     "None"
63/// );
64/// ```
65///
66/// # from_digits_desc
67/// ```
68/// use malachite_base::num::conversion::traits::Digits;
69/// use malachite_base::strings::ToDebugString;
70/// use malachite_nz::natural::Natural;
71///
72/// assert_eq!(
73///     Natural::from_digits_desc(&64u64, [0, 0, 0].iter().cloned()).to_debug_string(),
74///     "Some(0)"
75/// );
76/// assert_eq!(
77///     Natural::from_digits_desc(&3u64, [2, 0, 0, 2, 1, 1, 0, 0, 1, 1, 0].iter().cloned())
78///         .to_debug_string(),
79///     "Some(123456)"
80/// );
81/// assert_eq!(
82///     Natural::from_digits_desc(&8u16, [1, 7, 3].iter().cloned()).to_debug_string(),
83///     "Some(123)"
84/// );
85/// assert_eq!(
86///     Natural::from_digits_desc(&8u16, [3, 10, 1].iter().cloned()).to_debug_string(),
87///     "None"
88/// );
89/// ```
90pub mod general_digits;
91/// An implementation of
92/// [`PowerOf2DigitIterable`](malachite_base::num::conversion::traits::PowerOf2DigitIterable), a
93/// trait for iterating over a [`Natural`](crate::natural::Natural)'s base-$2^k$ digits.
94///
95/// # power_of_2_digits
96/// ```
97/// use itertools::Itertools;
98/// use malachite_base::num::basic::traits::Zero;
99/// use malachite_base::num::conversion::traits::PowerOf2DigitIterable;
100/// use malachite_nz::natural::Natural;
101///
102/// let n = Natural::ZERO;
103/// assert!(PowerOf2DigitIterable::<u8>::power_of_2_digits(&n, 2)
104///     .next()
105///     .is_none());
106///
107/// // 107 = 1223_4
108/// let n = Natural::from(107u32);
109/// assert_eq!(
110///     PowerOf2DigitIterable::<u32>::power_of_2_digits(&n, 2).collect_vec(),
111///     vec![3, 2, 2, 1]
112/// );
113///
114/// let n = Natural::ZERO;
115/// assert!(PowerOf2DigitIterable::<u8>::power_of_2_digits(&n, 2)
116///     .next_back()
117///     .is_none());
118///
119/// // 107 = 1223_4
120/// let n = Natural::from(107u32);
121/// assert_eq!(
122///     PowerOf2DigitIterable::<u32>::power_of_2_digits(&n, 2)
123///         .rev()
124///         .collect_vec(),
125///     vec![1, 2, 2, 3]
126/// );
127/// ```
128pub mod power_of_2_digit_iterable;
129/// Implementations of [`PowerOf2Digits`](malachite_base::num::conversion::traits::PowerOf2Digits),
130/// a trait for extracting base-$2^k$ digits from [`Natural`](crate::natural::Natural)s and
131/// constructing [`Natural`](crate::natural::Natural)s from such digits.
132///
133/// # to_power_of_2_digits_asc
134/// ```
135/// use malachite_base::num::basic::traits::{Two, Zero};
136/// use malachite_base::num::conversion::traits::PowerOf2Digits;
137/// use malachite_nz::natural::Natural;
138///
139/// assert_eq!(
140///     PowerOf2Digits::<u64>::to_power_of_2_digits_asc(&Natural::ZERO, 6),
141///     Vec::<u64>::new()
142/// );
143/// assert_eq!(
144///     PowerOf2Digits::<u64>::to_power_of_2_digits_asc(&Natural::TWO, 6),
145///     vec![2]
146/// );
147///
148/// // 123_10 = 173_8
149/// assert_eq!(
150///     PowerOf2Digits::<u16>::to_power_of_2_digits_asc(&Natural::from(123u32), 3),
151///     vec![3, 7, 1]
152/// );
153/// ```
154///
155/// # to_power_of_2_digits_desc
156/// ```
157/// use malachite_base::num::basic::traits::{Two, Zero};
158/// use malachite_base::num::conversion::traits::PowerOf2Digits;
159/// use malachite_nz::natural::Natural;
160///
161/// assert_eq!(
162///     PowerOf2Digits::<u64>::to_power_of_2_digits_desc(&Natural::ZERO, 6),
163///     Vec::<u64>::new()
164/// );
165/// assert_eq!(
166///     PowerOf2Digits::<u64>::to_power_of_2_digits_desc(&Natural::TWO, 6),
167///     vec![2]
168/// );
169///
170/// // 123_10 = 173_8
171/// assert_eq!(
172///     PowerOf2Digits::<u16>::to_power_of_2_digits_desc(&Natural::from(123u32), 3),
173///     vec![1, 7, 3]
174/// );
175/// ```
176///
177/// # from_power_of_2_digits_asc
178/// ```
179/// use malachite_base::num::conversion::traits::PowerOf2Digits;
180/// use malachite_base::strings::ToDebugString;
181/// use malachite_nz::natural::Natural;
182///
183/// assert_eq!(
184///     Natural::from_power_of_2_digits_asc(6, [0u64, 0, 0].iter().cloned()).to_debug_string(),
185///     "Some(0)"
186/// );
187/// assert_eq!(
188///     Natural::from_power_of_2_digits_asc(6, [2u64, 0].iter().cloned()).to_debug_string(),
189///     "Some(2)"
190/// );
191/// assert_eq!(
192///     Natural::from_power_of_2_digits_asc(3, [3u16, 7, 1].iter().cloned()).to_debug_string(),
193///     "Some(123)"
194/// );
195/// assert_eq!(
196///     Natural::from_power_of_2_digits_asc(3, [100u8].iter().cloned()).to_debug_string(),
197///     "None"
198/// );
199/// ```
200///
201/// # from_power_of_2_digits_desc
202/// ```
203/// use malachite_base::num::conversion::traits::PowerOf2Digits;
204/// use malachite_base::strings::ToDebugString;
205/// use malachite_nz::natural::Natural;
206///
207/// assert_eq!(
208///     Natural::from_power_of_2_digits_desc(6, [0u64, 0, 0].iter().cloned()).to_debug_string(),
209///     "Some(0)"
210/// );
211/// assert_eq!(
212///     Natural::from_power_of_2_digits_desc(6, [0u64, 2].iter().cloned()).to_debug_string(),
213///     "Some(2)"
214/// );
215/// assert_eq!(
216///     Natural::from_power_of_2_digits_desc(3, [1u16, 7, 3].iter().cloned()).to_debug_string(),
217///     "Some(123)"
218/// );
219/// assert_eq!(
220///     Natural::from_power_of_2_digits_desc(3, [100u8].iter().cloned()).to_debug_string(),
221///     "None"
222/// );
223/// ```
224pub mod power_of_2_digits;