num_bigint/
biguint.rs

1use crate::big_digit::{self, BigDigit};
2
3use alloc::string::String;
4use alloc::vec::Vec;
5use core::cmp;
6use core::cmp::Ordering;
7use core::default::Default;
8use core::fmt;
9use core::hash;
10use core::mem;
11use core::str;
12
13use num_integer::{Integer, Roots};
14use num_traits::{ConstZero, Num, One, Pow, ToPrimitive, Unsigned, Zero};
15
16mod addition;
17mod division;
18mod multiplication;
19mod subtraction;
20
21mod arbitrary;
22mod bits;
23mod convert;
24mod iter;
25mod monty;
26mod power;
27mod serde;
28mod shift;
29
30pub(crate) use self::convert::to_str_radix_reversed;
31pub use self::iter::{U32Digits, U64Digits};
32
33/// A big unsigned integer type.
34pub struct BigUint {
35    data: Vec<BigDigit>,
36}
37
38// Note: derived `Clone` doesn't specialize `clone_from`,
39// but we want to keep the allocation in `data`.
40impl Clone for BigUint {
41    #[inline]
42    fn clone(&self) -> Self {
43        BigUint {
44            data: self.data.clone(),
45        }
46    }
47
48    #[inline]
49    fn clone_from(&mut self, other: &Self) {
50        self.data.clone_from(&other.data);
51    }
52}
53
54impl hash::Hash for BigUint {
55    #[inline]
56    fn hash<H: hash::Hasher>(&self, state: &mut H) {
57        debug_assert!(self.data.last() != Some(&0));
58        self.data.hash(state);
59    }
60}
61
62impl PartialEq for BigUint {
63    #[inline]
64    fn eq(&self, other: &BigUint) -> bool {
65        debug_assert!(self.data.last() != Some(&0));
66        debug_assert!(other.data.last() != Some(&0));
67        self.data == other.data
68    }
69}
70impl Eq for BigUint {}
71
72impl PartialOrd for BigUint {
73    #[inline]
74    fn partial_cmp(&self, other: &BigUint) -> Option<Ordering> {
75        Some(self.cmp(other))
76    }
77}
78
79impl Ord for BigUint {
80    #[inline]
81    fn cmp(&self, other: &BigUint) -> Ordering {
82        cmp_slice(&self.data[..], &other.data[..])
83    }
84}
85
86#[inline]
87fn cmp_slice(a: &[BigDigit], b: &[BigDigit]) -> Ordering {
88    debug_assert!(a.last() != Some(&0));
89    debug_assert!(b.last() != Some(&0));
90
91    match Ord::cmp(&a.len(), &b.len()) {
92        Ordering::Equal => Iterator::cmp(a.iter().rev(), b.iter().rev()),
93        other => other,
94    }
95}
96
97impl Default for BigUint {
98    #[inline]
99    fn default() -> BigUint {
100        Self::ZERO
101    }
102}
103
104impl fmt::Debug for BigUint {
105    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
106        fmt::Display::fmt(self, f)
107    }
108}
109
110impl fmt::Display for BigUint {
111    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
112        f.pad_integral(true, "", &self.to_str_radix(10))
113    }
114}
115
116impl fmt::LowerHex for BigUint {
117    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
118        f.pad_integral(true, "0x", &self.to_str_radix(16))
119    }
120}
121
122impl fmt::UpperHex for BigUint {
123    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
124        let mut s = self.to_str_radix(16);
125        s.make_ascii_uppercase();
126        f.pad_integral(true, "0x", &s)
127    }
128}
129
130impl fmt::Binary for BigUint {
131    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
132        f.pad_integral(true, "0b", &self.to_str_radix(2))
133    }
134}
135
136impl fmt::Octal for BigUint {
137    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
138        f.pad_integral(true, "0o", &self.to_str_radix(8))
139    }
140}
141
142impl Zero for BigUint {
143    #[inline]
144    fn zero() -> BigUint {
145        Self::ZERO
146    }
147
148    #[inline]
149    fn set_zero(&mut self) {
150        self.data.clear();
151    }
152
153    #[inline]
154    fn is_zero(&self) -> bool {
155        self.data.is_empty()
156    }
157}
158
159impl ConstZero for BigUint {
160    // forward to the inherent const
161    const ZERO: Self = Self::ZERO; // BigUint { data: Vec::new() };
162}
163
164impl One for BigUint {
165    #[inline]
166    fn one() -> BigUint {
167        BigUint { data: vec![1] }
168    }
169
170    #[inline]
171    fn set_one(&mut self) {
172        self.data.clear();
173        self.data.push(1);
174    }
175
176    #[inline]
177    fn is_one(&self) -> bool {
178        self.data[..] == [1]
179    }
180}
181
182impl Unsigned for BigUint {}
183
184impl Integer for BigUint {
185    #[inline]
186    fn div_rem(&self, other: &BigUint) -> (BigUint, BigUint) {
187        division::div_rem_ref(self, other)
188    }
189
190    #[inline]
191    fn div_floor(&self, other: &BigUint) -> BigUint {
192        let (d, _) = division::div_rem_ref(self, other);
193        d
194    }
195
196    #[inline]
197    fn mod_floor(&self, other: &BigUint) -> BigUint {
198        let (_, m) = division::div_rem_ref(self, other);
199        m
200    }
201
202    #[inline]
203    fn div_mod_floor(&self, other: &BigUint) -> (BigUint, BigUint) {
204        division::div_rem_ref(self, other)
205    }
206
207    #[inline]
208    fn div_ceil(&self, other: &BigUint) -> BigUint {
209        let (d, m) = division::div_rem_ref(self, other);
210        if m.is_zero() {
211            d
212        } else {
213            d + 1u32
214        }
215    }
216
217    /// Calculates the Greatest Common Divisor (GCD) of the number and `other`.
218    ///
219    /// The result is always positive.
220    #[inline]
221    fn gcd(&self, other: &Self) -> Self {
222        #[inline]
223        fn twos(x: &BigUint) -> u64 {
224            x.trailing_zeros().unwrap_or(0)
225        }
226
227        // Stein's algorithm
228        if self.is_zero() {
229            return other.clone();
230        }
231        if other.is_zero() {
232            return self.clone();
233        }
234        let mut m = self.clone();
235        let mut n = other.clone();
236
237        // find common factors of 2
238        let shift = cmp::min(twos(&n), twos(&m));
239
240        // divide m and n by 2 until odd
241        // m inside loop
242        n >>= twos(&n);
243
244        while !m.is_zero() {
245            m >>= twos(&m);
246            if n > m {
247                mem::swap(&mut n, &mut m)
248            }
249            m -= &n;
250        }
251
252        n << shift
253    }
254
255    /// Calculates the Lowest Common Multiple (LCM) of the number and `other`.
256    #[inline]
257    fn lcm(&self, other: &BigUint) -> BigUint {
258        if self.is_zero() && other.is_zero() {
259            Self::ZERO
260        } else {
261            self / self.gcd(other) * other
262        }
263    }
264
265    /// Calculates the Greatest Common Divisor (GCD) and
266    /// Lowest Common Multiple (LCM) together.
267    #[inline]
268    fn gcd_lcm(&self, other: &Self) -> (Self, Self) {
269        let gcd = self.gcd(other);
270        let lcm = if gcd.is_zero() {
271            Self::ZERO
272        } else {
273            self / &gcd * other
274        };
275        (gcd, lcm)
276    }
277
278    /// Deprecated, use `is_multiple_of` instead.
279    #[inline]
280    fn divides(&self, other: &BigUint) -> bool {
281        self.is_multiple_of(other)
282    }
283
284    /// Returns `true` if the number is a multiple of `other`.
285    #[inline]
286    fn is_multiple_of(&self, other: &BigUint) -> bool {
287        if other.is_zero() {
288            return self.is_zero();
289        }
290        (self % other).is_zero()
291    }
292
293    /// Returns `true` if the number is divisible by `2`.
294    #[inline]
295    fn is_even(&self) -> bool {
296        // Considering only the last digit.
297        match self.data.first() {
298            Some(x) => x.is_even(),
299            None => true,
300        }
301    }
302
303    /// Returns `true` if the number is not divisible by `2`.
304    #[inline]
305    fn is_odd(&self) -> bool {
306        !self.is_even()
307    }
308
309    /// Rounds up to nearest multiple of argument.
310    #[inline]
311    fn next_multiple_of(&self, other: &Self) -> Self {
312        let m = self.mod_floor(other);
313        if m.is_zero() {
314            self.clone()
315        } else {
316            self + (other - m)
317        }
318    }
319    /// Rounds down to nearest multiple of argument.
320    #[inline]
321    fn prev_multiple_of(&self, other: &Self) -> Self {
322        self - self.mod_floor(other)
323    }
324
325    fn dec(&mut self) {
326        *self -= 1u32;
327    }
328
329    fn inc(&mut self) {
330        *self += 1u32;
331    }
332}
333
334#[inline]
335fn fixpoint<F>(mut x: BigUint, max_bits: u64, f: F) -> BigUint
336where
337    F: Fn(&BigUint) -> BigUint,
338{
339    let mut xn = f(&x);
340
341    // If the value increased, then the initial guess must have been low.
342    // Repeat until we reverse course.
343    while x < xn {
344        // Sometimes an increase will go way too far, especially with large
345        // powers, and then take a long time to walk back.  We know an upper
346        // bound based on bit size, so saturate on that.
347        x = if xn.bits() > max_bits {
348            BigUint::one() << max_bits
349        } else {
350            xn
351        };
352        xn = f(&x);
353    }
354
355    // Now keep repeating while the estimate is decreasing.
356    while x > xn {
357        x = xn;
358        xn = f(&x);
359    }
360    x
361}
362
363impl Roots for BigUint {
364    // nth_root, sqrt and cbrt use Newton's method to compute
365    // principal root of a given degree for a given integer.
366
367    // Reference:
368    // Brent & Zimmermann, Modern Computer Arithmetic, v0.5.9, Algorithm 1.14
369    fn nth_root(&self, n: u32) -> Self {
370        assert!(n > 0, "root degree n must be at least 1");
371
372        if self.is_zero() || self.is_one() {
373            return self.clone();
374        }
375
376        match n {
377            // Optimize for small n
378            1 => return self.clone(),
379            2 => return self.sqrt(),
380            3 => return self.cbrt(),
381            _ => (),
382        }
383
384        // The root of non-zero values less than 2ⁿ can only be 1.
385        let bits = self.bits();
386        let n64 = u64::from(n);
387        if bits <= n64 {
388            return BigUint::one();
389        }
390
391        // If we fit in `u64`, compute the root that way.
392        if let Some(x) = self.to_u64() {
393            return x.nth_root(n).into();
394        }
395
396        let max_bits = bits / n64 + 1;
397
398        #[cfg(feature = "std")]
399        let guess = match self.to_f64() {
400            Some(f) if f.is_finite() => {
401                use num_traits::FromPrimitive;
402
403                // We fit in `f64` (lossy), so get a better initial guess from that.
404                BigUint::from_f64((f.ln() / f64::from(n)).exp()).unwrap()
405            }
406            _ => {
407                // Try to guess by scaling down such that it does fit in `f64`.
408                // With some (x * 2ⁿᵏ), its nth root ≈ (ⁿ√x * 2ᵏ)
409                let extra_bits = bits - (f64::MAX_EXP as u64 - 1);
410                let root_scale = Integer::div_ceil(&extra_bits, &n64);
411                let scale = root_scale * n64;
412                if scale < bits && bits - scale > n64 {
413                    (self >> scale).nth_root(n) << root_scale
414                } else {
415                    BigUint::one() << max_bits
416                }
417            }
418        };
419
420        #[cfg(not(feature = "std"))]
421        let guess = BigUint::one() << max_bits;
422
423        let n_min_1 = n - 1;
424        fixpoint(guess, max_bits, move |s| {
425            let q = self / s.pow(n_min_1);
426            let t = n_min_1 * s + q;
427            t / n
428        })
429    }
430
431    // Reference:
432    // Brent & Zimmermann, Modern Computer Arithmetic, v0.5.9, Algorithm 1.13
433    fn sqrt(&self) -> Self {
434        if self.is_zero() || self.is_one() {
435            return self.clone();
436        }
437
438        // If we fit in `u64`, compute the root that way.
439        if let Some(x) = self.to_u64() {
440            return x.sqrt().into();
441        }
442
443        let bits = self.bits();
444        let max_bits = bits / 2 + 1;
445
446        #[cfg(feature = "std")]
447        let guess = match self.to_f64() {
448            Some(f) if f.is_finite() => {
449                use num_traits::FromPrimitive;
450
451                // We fit in `f64` (lossy), so get a better initial guess from that.
452                BigUint::from_f64(f.sqrt()).unwrap()
453            }
454            _ => {
455                // Try to guess by scaling down such that it does fit in `f64`.
456                // With some (x * 2²ᵏ), its sqrt ≈ (√x * 2ᵏ)
457                let extra_bits = bits - (f64::MAX_EXP as u64 - 1);
458                let root_scale = (extra_bits + 1) / 2;
459                let scale = root_scale * 2;
460                (self >> scale).sqrt() << root_scale
461            }
462        };
463
464        #[cfg(not(feature = "std"))]
465        let guess = BigUint::one() << max_bits;
466
467        fixpoint(guess, max_bits, move |s| {
468            let q = self / s;
469            let t = s + q;
470            t >> 1
471        })
472    }
473
474    fn cbrt(&self) -> Self {
475        if self.is_zero() || self.is_one() {
476            return self.clone();
477        }
478
479        // If we fit in `u64`, compute the root that way.
480        if let Some(x) = self.to_u64() {
481            return x.cbrt().into();
482        }
483
484        let bits = self.bits();
485        let max_bits = bits / 3 + 1;
486
487        #[cfg(feature = "std")]
488        let guess = match self.to_f64() {
489            Some(f) if f.is_finite() => {
490                use num_traits::FromPrimitive;
491
492                // We fit in `f64` (lossy), so get a better initial guess from that.
493                BigUint::from_f64(f.cbrt()).unwrap()
494            }
495            _ => {
496                // Try to guess by scaling down such that it does fit in `f64`.
497                // With some (x * 2³ᵏ), its cbrt ≈ (∛x * 2ᵏ)
498                let extra_bits = bits - (f64::MAX_EXP as u64 - 1);
499                let root_scale = (extra_bits + 2) / 3;
500                let scale = root_scale * 3;
501                (self >> scale).cbrt() << root_scale
502            }
503        };
504
505        #[cfg(not(feature = "std"))]
506        let guess = BigUint::one() << max_bits;
507
508        fixpoint(guess, max_bits, move |s| {
509            let q = self / (s * s);
510            let t = (s << 1) + q;
511            t / 3u32
512        })
513    }
514}
515
516/// A generic trait for converting a value to a [`BigUint`].
517pub trait ToBigUint {
518    /// Converts the value of `self` to a [`BigUint`].
519    fn to_biguint(&self) -> Option<BigUint>;
520}
521
522/// Creates and initializes a [`BigUint`].
523///
524/// The digits are in little-endian base matching `BigDigit`.
525#[inline]
526pub(crate) fn biguint_from_vec(digits: Vec<BigDigit>) -> BigUint {
527    BigUint { data: digits }.normalized()
528}
529
530impl BigUint {
531    /// A constant `BigUint` with value 0, useful for static initialization.
532    pub const ZERO: Self = BigUint { data: Vec::new() };
533
534    /// Creates and initializes a [`BigUint`].
535    ///
536    /// The base 2<sup>32</sup> digits are ordered least significant digit first.
537    #[inline]
538    pub fn new(digits: Vec<u32>) -> BigUint {
539        let mut big = Self::ZERO;
540
541        cfg_digit_expr!(
542            {
543                big.data = digits;
544                big.normalize();
545            },
546            big.assign_from_slice(&digits)
547        );
548
549        big
550    }
551
552    /// Creates and initializes a [`BigUint`].
553    ///
554    /// The base 2<sup>32</sup> digits are ordered least significant digit first.
555    #[inline]
556    pub fn from_slice(slice: &[u32]) -> BigUint {
557        let mut big = Self::ZERO;
558        big.assign_from_slice(slice);
559        big
560    }
561
562    /// Assign a value to a [`BigUint`].
563    ///
564    /// The base 2<sup>32</sup> digits are ordered least significant digit first.
565    #[inline]
566    pub fn assign_from_slice(&mut self, slice: &[u32]) {
567        self.data.clear();
568
569        cfg_digit_expr!(
570            self.data.extend_from_slice(slice),
571            self.data.extend(slice.chunks(2).map(u32_chunk_to_u64))
572        );
573
574        self.normalize();
575    }
576
577    /// Creates and initializes a [`BigUint`].
578    ///
579    /// The bytes are in big-endian byte order.
580    ///
581    /// # Examples
582    ///
583    /// ```
584    /// use num_bigint::BigUint;
585    ///
586    /// assert_eq!(BigUint::from_bytes_be(b"A"),
587    ///            BigUint::parse_bytes(b"65", 10).unwrap());
588    /// assert_eq!(BigUint::from_bytes_be(b"AA"),
589    ///            BigUint::parse_bytes(b"16705", 10).unwrap());
590    /// assert_eq!(BigUint::from_bytes_be(b"AB"),
591    ///            BigUint::parse_bytes(b"16706", 10).unwrap());
592    /// assert_eq!(BigUint::from_bytes_be(b"Hello world!"),
593    ///            BigUint::parse_bytes(b"22405534230753963835153736737", 10).unwrap());
594    /// ```
595    #[inline]
596    pub fn from_bytes_be(bytes: &[u8]) -> BigUint {
597        if bytes.is_empty() {
598            Self::ZERO
599        } else {
600            let mut v = bytes.to_vec();
601            v.reverse();
602            BigUint::from_bytes_le(&v)
603        }
604    }
605
606    /// Creates and initializes a [`BigUint`].
607    ///
608    /// The bytes are in little-endian byte order.
609    #[inline]
610    pub fn from_bytes_le(bytes: &[u8]) -> BigUint {
611        if bytes.is_empty() {
612            Self::ZERO
613        } else {
614            convert::from_bitwise_digits_le(bytes, 8)
615        }
616    }
617
618    /// Creates and initializes a [`BigUint`]. The input slice must contain
619    /// ascii/utf8 characters in [0-9a-zA-Z].
620    /// `radix` must be in the range `2...36`.
621    ///
622    /// The function `from_str_radix` from the `Num` trait provides the same logic
623    /// for `&str` buffers.
624    ///
625    /// # Examples
626    ///
627    /// ```
628    /// use num_bigint::{BigUint, ToBigUint};
629    ///
630    /// assert_eq!(BigUint::parse_bytes(b"1234", 10), ToBigUint::to_biguint(&1234));
631    /// assert_eq!(BigUint::parse_bytes(b"ABCD", 16), ToBigUint::to_biguint(&0xABCD));
632    /// assert_eq!(BigUint::parse_bytes(b"G", 16), None);
633    /// ```
634    #[inline]
635    pub fn parse_bytes(buf: &[u8], radix: u32) -> Option<BigUint> {
636        let s = str::from_utf8(buf).ok()?;
637        BigUint::from_str_radix(s, radix).ok()
638    }
639
640    /// Creates and initializes a [`BigUint`]. Each `u8` of the input slice is
641    /// interpreted as one digit of the number
642    /// and must therefore be less than `radix`.
643    ///
644    /// The bytes are in big-endian byte order.
645    /// `radix` must be in the range `2...256`.
646    ///
647    /// # Examples
648    ///
649    /// ```
650    /// use num_bigint::{BigUint};
651    ///
652    /// let inbase190 = &[15, 33, 125, 12, 14];
653    /// let a = BigUint::from_radix_be(inbase190, 190).unwrap();
654    /// assert_eq!(a.to_radix_be(190), inbase190);
655    /// ```
656    pub fn from_radix_be(buf: &[u8], radix: u32) -> Option<BigUint> {
657        convert::from_radix_be(buf, radix)
658    }
659
660    /// Creates and initializes a [`BigUint`]. Each `u8` of the input slice is
661    /// interpreted as one digit of the number
662    /// and must therefore be less than `radix`.
663    ///
664    /// The bytes are in little-endian byte order.
665    /// `radix` must be in the range `2...256`.
666    ///
667    /// # Examples
668    ///
669    /// ```
670    /// use num_bigint::{BigUint};
671    ///
672    /// let inbase190 = &[14, 12, 125, 33, 15];
673    /// let a = BigUint::from_radix_be(inbase190, 190).unwrap();
674    /// assert_eq!(a.to_radix_be(190), inbase190);
675    /// ```
676    pub fn from_radix_le(buf: &[u8], radix: u32) -> Option<BigUint> {
677        convert::from_radix_le(buf, radix)
678    }
679
680    /// Returns the byte representation of the [`BigUint`] in big-endian byte order.
681    ///
682    /// # Examples
683    ///
684    /// ```
685    /// use num_bigint::BigUint;
686    ///
687    /// let i = BigUint::parse_bytes(b"1125", 10).unwrap();
688    /// assert_eq!(i.to_bytes_be(), vec![4, 101]);
689    /// ```
690    #[inline]
691    pub fn to_bytes_be(&self) -> Vec<u8> {
692        let mut v = self.to_bytes_le();
693        v.reverse();
694        v
695    }
696
697    /// Returns the byte representation of the [`BigUint`] in little-endian byte order.
698    ///
699    /// # Examples
700    ///
701    /// ```
702    /// use num_bigint::BigUint;
703    ///
704    /// let i = BigUint::parse_bytes(b"1125", 10).unwrap();
705    /// assert_eq!(i.to_bytes_le(), vec![101, 4]);
706    /// ```
707    #[inline]
708    pub fn to_bytes_le(&self) -> Vec<u8> {
709        if self.is_zero() {
710            vec![0]
711        } else {
712            convert::to_bitwise_digits_le(self, 8)
713        }
714    }
715
716    /// Returns the `u32` digits representation of the [`BigUint`] ordered least significant digit
717    /// first.
718    ///
719    /// # Examples
720    ///
721    /// ```
722    /// use num_bigint::BigUint;
723    ///
724    /// assert_eq!(BigUint::from(1125u32).to_u32_digits(), vec![1125]);
725    /// assert_eq!(BigUint::from(4294967295u32).to_u32_digits(), vec![4294967295]);
726    /// assert_eq!(BigUint::from(4294967296u64).to_u32_digits(), vec![0, 1]);
727    /// assert_eq!(BigUint::from(112500000000u64).to_u32_digits(), vec![830850304, 26]);
728    /// ```
729    #[inline]
730    pub fn to_u32_digits(&self) -> Vec<u32> {
731        self.iter_u32_digits().collect()
732    }
733
734    /// Returns the `u64` digits representation of the [`BigUint`] ordered least significant digit
735    /// first.
736    ///
737    /// # Examples
738    ///
739    /// ```
740    /// use num_bigint::BigUint;
741    ///
742    /// assert_eq!(BigUint::from(1125u32).to_u64_digits(), vec![1125]);
743    /// assert_eq!(BigUint::from(4294967295u32).to_u64_digits(), vec![4294967295]);
744    /// assert_eq!(BigUint::from(4294967296u64).to_u64_digits(), vec![4294967296]);
745    /// assert_eq!(BigUint::from(112500000000u64).to_u64_digits(), vec![112500000000]);
746    /// assert_eq!(BigUint::from(1u128 << 64).to_u64_digits(), vec![0, 1]);
747    /// ```
748    #[inline]
749    pub fn to_u64_digits(&self) -> Vec<u64> {
750        self.iter_u64_digits().collect()
751    }
752
753    /// Returns an iterator of `u32` digits representation of the [`BigUint`] ordered least
754    /// significant digit first.
755    ///
756    /// # Examples
757    ///
758    /// ```
759    /// use num_bigint::BigUint;
760    ///
761    /// assert_eq!(BigUint::from(1125u32).iter_u32_digits().collect::<Vec<u32>>(), vec![1125]);
762    /// assert_eq!(BigUint::from(4294967295u32).iter_u32_digits().collect::<Vec<u32>>(), vec![4294967295]);
763    /// assert_eq!(BigUint::from(4294967296u64).iter_u32_digits().collect::<Vec<u32>>(), vec![0, 1]);
764    /// assert_eq!(BigUint::from(112500000000u64).iter_u32_digits().collect::<Vec<u32>>(), vec![830850304, 26]);
765    /// ```
766    #[inline]
767    pub fn iter_u32_digits(&self) -> U32Digits<'_> {
768        U32Digits::new(self.data.as_slice())
769    }
770
771    /// Returns an iterator of `u64` digits representation of the [`BigUint`] ordered least
772    /// significant digit first.
773    ///
774    /// # Examples
775    ///
776    /// ```
777    /// use num_bigint::BigUint;
778    ///
779    /// assert_eq!(BigUint::from(1125u32).iter_u64_digits().collect::<Vec<u64>>(), vec![1125]);
780    /// assert_eq!(BigUint::from(4294967295u32).iter_u64_digits().collect::<Vec<u64>>(), vec![4294967295]);
781    /// assert_eq!(BigUint::from(4294967296u64).iter_u64_digits().collect::<Vec<u64>>(), vec![4294967296]);
782    /// assert_eq!(BigUint::from(112500000000u64).iter_u64_digits().collect::<Vec<u64>>(), vec![112500000000]);
783    /// assert_eq!(BigUint::from(1u128 << 64).iter_u64_digits().collect::<Vec<u64>>(), vec![0, 1]);
784    /// ```
785    #[inline]
786    pub fn iter_u64_digits(&self) -> U64Digits<'_> {
787        U64Digits::new(self.data.as_slice())
788    }
789
790    /// Returns the integer formatted as a string in the given radix.
791    /// `radix` must be in the range `2...36`.
792    ///
793    /// # Examples
794    ///
795    /// ```
796    /// use num_bigint::BigUint;
797    ///
798    /// let i = BigUint::parse_bytes(b"ff", 16).unwrap();
799    /// assert_eq!(i.to_str_radix(16), "ff");
800    /// ```
801    #[inline]
802    pub fn to_str_radix(&self, radix: u32) -> String {
803        let mut v = to_str_radix_reversed(self, radix);
804        v.reverse();
805        unsafe { String::from_utf8_unchecked(v) }
806    }
807
808    /// Returns the integer in the requested base in big-endian digit order.
809    /// The output is not given in a human readable alphabet but as a zero
810    /// based `u8` number.
811    /// `radix` must be in the range `2...256`.
812    ///
813    /// # Examples
814    ///
815    /// ```
816    /// use num_bigint::BigUint;
817    ///
818    /// assert_eq!(BigUint::from(0xFFFFu64).to_radix_be(159),
819    ///            vec![2, 94, 27]);
820    /// // 0xFFFF = 65535 = 2*(159^2) + 94*159 + 27
821    /// ```
822    #[inline]
823    pub fn to_radix_be(&self, radix: u32) -> Vec<u8> {
824        let mut v = convert::to_radix_le(self, radix);
825        v.reverse();
826        v
827    }
828
829    /// Returns the integer in the requested base in little-endian digit order.
830    /// The output is not given in a human readable alphabet but as a zero
831    /// based u8 number.
832    /// `radix` must be in the range `2...256`.
833    ///
834    /// # Examples
835    ///
836    /// ```
837    /// use num_bigint::BigUint;
838    ///
839    /// assert_eq!(BigUint::from(0xFFFFu64).to_radix_le(159),
840    ///            vec![27, 94, 2]);
841    /// // 0xFFFF = 65535 = 27 + 94*159 + 2*(159^2)
842    /// ```
843    #[inline]
844    pub fn to_radix_le(&self, radix: u32) -> Vec<u8> {
845        convert::to_radix_le(self, radix)
846    }
847
848    /// Determines the fewest bits necessary to express the [`BigUint`].
849    #[inline]
850    pub fn bits(&self) -> u64 {
851        if self.is_zero() {
852            return 0;
853        }
854        let zeros: u64 = self.data.last().unwrap().leading_zeros().into();
855        self.data.len() as u64 * u64::from(big_digit::BITS) - zeros
856    }
857
858    /// Strips off trailing zero bigdigits - comparisons require the last element in the vector to
859    /// be nonzero.
860    #[inline]
861    fn normalize(&mut self) {
862        if let Some(&0) = self.data.last() {
863            let len = self.data.iter().rposition(|&d| d != 0).map_or(0, |i| i + 1);
864            self.data.truncate(len);
865        }
866        if self.data.len() < self.data.capacity() / 4 {
867            self.data.shrink_to_fit();
868        }
869    }
870
871    /// Returns a normalized [`BigUint`].
872    #[inline]
873    fn normalized(mut self) -> BigUint {
874        self.normalize();
875        self
876    }
877
878    /// Returns `self ^ exponent`.
879    pub fn pow(&self, exponent: u32) -> Self {
880        Pow::pow(self, exponent)
881    }
882
883    /// Returns `(self ^ exponent) % modulus`.
884    ///
885    /// Panics if the modulus is zero.
886    pub fn modpow(&self, exponent: &Self, modulus: &Self) -> Self {
887        power::modpow(self, exponent, modulus)
888    }
889
890    /// Returns the modular multiplicative inverse if it exists, otherwise `None`.
891    ///
892    /// This solves for `x` in the interval `[0, modulus)` such that `self * x ≡ 1 (mod modulus)`.
893    /// The solution exists if and only if `gcd(self, modulus) == 1`.
894    ///
895    /// ```
896    /// use num_bigint::BigUint;
897    /// use num_traits::{One, Zero};
898    ///
899    /// let m = BigUint::from(383_u32);
900    ///
901    /// // Trivial cases
902    /// assert_eq!(BigUint::zero().modinv(&m), None);
903    /// assert_eq!(BigUint::one().modinv(&m), Some(BigUint::one()));
904    /// let neg1 = &m - 1u32;
905    /// assert_eq!(neg1.modinv(&m), Some(neg1));
906    ///
907    /// let a = BigUint::from(271_u32);
908    /// let x = a.modinv(&m).unwrap();
909    /// assert_eq!(x, BigUint::from(106_u32));
910    /// assert_eq!(x.modinv(&m).unwrap(), a);
911    /// assert!((a * x % m).is_one());
912    /// ```
913    pub fn modinv(&self, modulus: &Self) -> Option<Self> {
914        // Based on the inverse pseudocode listed here:
915        // https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#Modular_integers
916        // TODO: consider Binary or Lehmer's GCD algorithms for optimization.
917
918        assert!(
919            !modulus.is_zero(),
920            "attempt to calculate with zero modulus!"
921        );
922        if modulus.is_one() {
923            return Some(Self::zero());
924        }
925
926        let mut r0; // = modulus.clone();
927        let mut r1 = self % modulus;
928        let mut t0; // = Self::zero();
929        let mut t1; // = Self::one();
930
931        // Lift and simplify the first iteration to avoid some initial allocations.
932        if r1.is_zero() {
933            return None;
934        } else if r1.is_one() {
935            return Some(r1);
936        } else {
937            let (q, r2) = modulus.div_rem(&r1);
938            if r2.is_zero() {
939                return None;
940            }
941            r0 = r1;
942            r1 = r2;
943            t0 = Self::one();
944            t1 = modulus - q;
945        }
946
947        while !r1.is_zero() {
948            let (q, r2) = r0.div_rem(&r1);
949            r0 = r1;
950            r1 = r2;
951
952            // let t2 = (t0 - q * t1) % modulus;
953            let qt1 = q * &t1 % modulus;
954            let t2 = if t0 < qt1 {
955                t0 + (modulus - qt1)
956            } else {
957                t0 - qt1
958            };
959            t0 = t1;
960            t1 = t2;
961        }
962
963        if r0.is_one() {
964            Some(t0)
965        } else {
966            None
967        }
968    }
969
970    /// Returns the truncated principal square root of `self` --
971    /// see [Roots::sqrt](https://docs.rs/num-integer/0.1/num_integer/trait.Roots.html#method.sqrt)
972    pub fn sqrt(&self) -> Self {
973        Roots::sqrt(self)
974    }
975
976    /// Returns the truncated principal cube root of `self` --
977    /// see [Roots::cbrt](https://docs.rs/num-integer/0.1/num_integer/trait.Roots.html#method.cbrt).
978    pub fn cbrt(&self) -> Self {
979        Roots::cbrt(self)
980    }
981
982    /// Returns the truncated principal `n`th root of `self` --
983    /// see [Roots::nth_root](https://docs.rs/num-integer/0.1/num_integer/trait.Roots.html#tymethod.nth_root).
984    pub fn nth_root(&self, n: u32) -> Self {
985        Roots::nth_root(self, n)
986    }
987
988    /// Returns the number of least-significant bits that are zero,
989    /// or `None` if the entire number is zero.
990    pub fn trailing_zeros(&self) -> Option<u64> {
991        let i = self.data.iter().position(|&digit| digit != 0)?;
992        let zeros: u64 = self.data[i].trailing_zeros().into();
993        Some(i as u64 * u64::from(big_digit::BITS) + zeros)
994    }
995
996    /// Returns the number of least-significant bits that are ones.
997    pub fn trailing_ones(&self) -> u64 {
998        if let Some(i) = self.data.iter().position(|&digit| !digit != 0) {
999            let ones: u64 = self.data[i].trailing_ones().into();
1000            i as u64 * u64::from(big_digit::BITS) + ones
1001        } else {
1002            self.data.len() as u64 * u64::from(big_digit::BITS)
1003        }
1004    }
1005
1006    /// Returns the number of one bits.
1007    pub fn count_ones(&self) -> u64 {
1008        self.data.iter().map(|&d| u64::from(d.count_ones())).sum()
1009    }
1010
1011    /// Returns whether the bit in the given position is set
1012    pub fn bit(&self, bit: u64) -> bool {
1013        let bits_per_digit = u64::from(big_digit::BITS);
1014        if let Some(digit_index) = (bit / bits_per_digit).to_usize() {
1015            if let Some(digit) = self.data.get(digit_index) {
1016                let bit_mask = (1 as BigDigit) << (bit % bits_per_digit);
1017                return (digit & bit_mask) != 0;
1018            }
1019        }
1020        false
1021    }
1022
1023    /// Sets or clears the bit in the given position
1024    ///
1025    /// Note that setting a bit greater than the current bit length, a reallocation may be needed
1026    /// to store the new digits
1027    pub fn set_bit(&mut self, bit: u64, value: bool) {
1028        // Note: we're saturating `digit_index` and `new_len` -- any such case is guaranteed to
1029        // fail allocation, and that's more consistent than adding our own overflow panics.
1030        let bits_per_digit = u64::from(big_digit::BITS);
1031        let digit_index = (bit / bits_per_digit).to_usize().unwrap_or(usize::MAX);
1032        let bit_mask = (1 as BigDigit) << (bit % bits_per_digit);
1033        if value {
1034            if digit_index >= self.data.len() {
1035                let new_len = digit_index.saturating_add(1);
1036                self.data.resize(new_len, 0);
1037            }
1038            self.data[digit_index] |= bit_mask;
1039        } else if digit_index < self.data.len() {
1040            self.data[digit_index] &= !bit_mask;
1041            // the top bit may have been cleared, so normalize
1042            self.normalize();
1043        }
1044    }
1045}
1046
1047impl num_traits::FromBytes for BigUint {
1048    type Bytes = [u8];
1049
1050    fn from_be_bytes(bytes: &Self::Bytes) -> Self {
1051        Self::from_bytes_be(bytes)
1052    }
1053
1054    fn from_le_bytes(bytes: &Self::Bytes) -> Self {
1055        Self::from_bytes_le(bytes)
1056    }
1057}
1058
1059impl num_traits::ToBytes for BigUint {
1060    type Bytes = Vec<u8>;
1061
1062    fn to_be_bytes(&self) -> Self::Bytes {
1063        self.to_bytes_be()
1064    }
1065
1066    fn to_le_bytes(&self) -> Self::Bytes {
1067        self.to_bytes_le()
1068    }
1069}
1070
1071pub(crate) trait IntDigits {
1072    fn digits(&self) -> &[BigDigit];
1073    fn digits_mut(&mut self) -> &mut Vec<BigDigit>;
1074    fn normalize(&mut self);
1075    fn capacity(&self) -> usize;
1076    fn len(&self) -> usize;
1077}
1078
1079impl IntDigits for BigUint {
1080    #[inline]
1081    fn digits(&self) -> &[BigDigit] {
1082        &self.data
1083    }
1084    #[inline]
1085    fn digits_mut(&mut self) -> &mut Vec<BigDigit> {
1086        &mut self.data
1087    }
1088    #[inline]
1089    fn normalize(&mut self) {
1090        self.normalize();
1091    }
1092    #[inline]
1093    fn capacity(&self) -> usize {
1094        self.data.capacity()
1095    }
1096    #[inline]
1097    fn len(&self) -> usize {
1098        self.data.len()
1099    }
1100}
1101
1102/// Convert a `u32` chunk (len is either 1 or 2) to a single `u64` digit
1103#[inline]
1104fn u32_chunk_to_u64(chunk: &[u32]) -> u64 {
1105    // raw could have odd length
1106    let mut digit = chunk[0] as u64;
1107    if let Some(&hi) = chunk.get(1) {
1108        digit |= (hi as u64) << 32;
1109    }
1110    digit
1111}
1112
1113cfg_32_or_test!(
1114    /// Combine four `u32`s into a single `u128`.
1115    #[inline]
1116    fn u32_to_u128(a: u32, b: u32, c: u32, d: u32) -> u128 {
1117        u128::from(d) | (u128::from(c) << 32) | (u128::from(b) << 64) | (u128::from(a) << 96)
1118    }
1119);
1120
1121cfg_32_or_test!(
1122    /// Split a single `u128` into four `u32`.
1123    #[inline]
1124    fn u32_from_u128(n: u128) -> (u32, u32, u32, u32) {
1125        (
1126            (n >> 96) as u32,
1127            (n >> 64) as u32,
1128            (n >> 32) as u32,
1129            n as u32,
1130        )
1131    }
1132);
1133
1134cfg_digit!(
1135    #[test]
1136    fn test_from_slice() {
1137        fn check(slice: &[u32], data: &[BigDigit]) {
1138            assert_eq!(BigUint::from_slice(slice).data, data);
1139        }
1140        check(&[1], &[1]);
1141        check(&[0, 0, 0], &[]);
1142        check(&[1, 2, 0, 0], &[1, 2]);
1143        check(&[0, 0, 1, 2], &[0, 0, 1, 2]);
1144        check(&[0, 0, 1, 2, 0, 0], &[0, 0, 1, 2]);
1145        check(&[-1i32 as u32], &[-1i32 as BigDigit]);
1146    }
1147
1148    #[test]
1149    fn test_from_slice() {
1150        fn check(slice: &[u32], data: &[BigDigit]) {
1151            assert_eq!(
1152                BigUint::from_slice(slice).data,
1153                data,
1154                "from {:?}, to {:?}",
1155                slice,
1156                data
1157            );
1158        }
1159        check(&[1], &[1]);
1160        check(&[0, 0, 0], &[]);
1161        check(&[1, 2], &[8_589_934_593]);
1162        check(&[1, 2, 0, 0], &[8_589_934_593]);
1163        check(&[0, 0, 1, 2], &[0, 8_589_934_593]);
1164        check(&[0, 0, 1, 2, 0, 0], &[0, 8_589_934_593]);
1165        check(&[-1i32 as u32], &[(-1i32 as u32) as BigDigit]);
1166    }
1167);
1168
1169#[test]
1170fn test_u32_u128() {
1171    assert_eq!(u32_from_u128(0u128), (0, 0, 0, 0));
1172    assert_eq!(
1173        u32_from_u128(u128::MAX),
1174        (u32::MAX, u32::MAX, u32::MAX, u32::MAX)
1175    );
1176
1177    assert_eq!(u32_from_u128(u32::MAX as u128), (0, 0, 0, u32::MAX));
1178
1179    assert_eq!(u32_from_u128(u64::MAX as u128), (0, 0, u32::MAX, u32::MAX));
1180
1181    assert_eq!(
1182        u32_from_u128((u64::MAX as u128) + u32::MAX as u128),
1183        (0, 1, 0, u32::MAX - 1)
1184    );
1185
1186    assert_eq!(u32_from_u128(36_893_488_151_714_070_528), (0, 2, 1, 0));
1187}
1188
1189#[test]
1190fn test_u128_u32_roundtrip() {
1191    // roundtrips
1192    let values = vec![
1193        0u128,
1194        1u128,
1195        u64::MAX as u128 * 3,
1196        u32::MAX as u128,
1197        u64::MAX as u128,
1198        (u64::MAX as u128) + u32::MAX as u128,
1199        u128::MAX,
1200    ];
1201
1202    for val in &values {
1203        let (a, b, c, d) = u32_from_u128(*val);
1204        assert_eq!(u32_to_u128(a, b, c, d), *val);
1205    }
1206}