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;