1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//! Big Integer Types for Rust
//!
//! * A [`BigUint`] is unsigned and represented as a vector of digits.
//! * A [`BigInt`] is signed and is a combination of [`BigUint`] and [`Sign`].
//!
//! Common numerical operations are overloaded, so we can treat them
//! the same way we treat other numbers.
//!
//! ## Example
//!
//! ```rust
//! # fn main() {
//! use num_bigint::BigUint;
//! use num_traits::One;
//!
//! // Calculate large fibonacci numbers.
//! fn fib(n: usize) -> BigUint {
//! let mut f0 = BigUint::ZERO;
//! let mut f1 = BigUint::ONE;
//! for _ in 0..n {
//! let f2 = f0 + &f1;
//! f0 = f1;
//! f1 = f2;
//! }
//! f0
//! }
//!
//! // This is a very large number.
//! println!("fib(1000) = {}", fib(1000));
//! # }
//! ```
//!
//! It's easy to generate large random numbers:
//!
//! # use ::rand_0_10 as rand;
//! use rand::{SeedableRng, rngs::SmallRng};
//! use num_bigint::{BigInt, BigRng010};
//!
//! // This seed is just for demonstration, but in most cases
//! // you'll probably want a non-deterministic `rng`.
//! let mut rng = SmallRng::seed_from_u64(42);
//! let a = rng.random_bigint(1000);
//!
//! let low = BigInt::from(-10000);
//! let high = BigInt::from(10000);
//! let b = rng.random_bigint_range(&low, &high);
//!
//! // Probably an even larger number.
//! println!("{}", a * b);
//!
//! See the "Features" section for instructions for enabling random number generation.
//!
//! ## Features
//!
//! The `std` crate feature is enabled by default, which enables [`std::error::Error`]
//! implementations and some internal use of floating point approximations. This can be disabled by
//! depending on `num-bigint` with `default-features = false`. Either way, the `alloc` crate is
//! always required for heap allocation of the [`BigInt`]/[`BigUint`] digits.
//!
//! ### Random Generation
//!
//! `num-bigint` supports the generation of random big integers when either of the `rand_0_9` or
//! `rand_0_10` features are enabled. The [`BigRng09`] and [`BigRng010`] traits provide extension
//! methods for any `rand_core` RNG of their respective version, while the structs [`RandomBits`],
//! [`UniformBigInt`], and [`UniformBigUint`] fulfill further functionality for random
//! distributions in `rand::distr`.
//!
//! For example, using `rand v0.10` in your `Cargo.toml` may look like this:
//!
//! ```toml
//! rand = "0.10"
//! num-bigint = { version = "0.5", features = ["rand_0_10"] }
//! ```
//!
//! Note that you must use the same version of `rand` as the feature you enable in `num-bigint`.
//! It's also fine for multiple versions to be enabled at once -- the random-distribution structs
//! will be shared with trait implementations for each `rand` feature that is enabled, while the
//! `BigRng` traits are distinct.
//!
//! You can instead use `rand_core_0_9` or `rand_core_0_10` for a more restricted subset, with
//! *only* the `BigRng` traits.
//!
//! ### Arbitrary Big Integers
//!
//! `num-bigint` supports `arbitrary` and `quickcheck` features to implement
//! [`arbitrary::Arbitrary`] and [`quickcheck::Arbitrary`], respectively, for both [`BigInt`] and
//! [`BigUint`]. These are useful for fuzzing and other forms of randomized testing.
//!
//! ### Serialization
//!
//! The `serde` feature adds implementations of [`Serialize`][serde::Serialize] and
//! [`Deserialize`][serde::Deserialize] for both [`BigInt`] and [`BigUint`]. Their serialized data is
//! generated portably, regardless of platform differences like the internal digit size.
//!
//!
//! ## Compatibility
//!
//! The `num-bigint` crate is tested for rustc 1.60 and greater.
extern crate alloc;
extern crate std;
use fmt;
type UsizePromotion = u32;
type UsizePromotion = u64;
type IsizePromotion = i32;
type IsizePromotion = i64;
/// The error type returned when a checked conversion regarding big integer fails.
pub use crateBigUint;
pub use crateToBigUint;
pub use crateU32Digits;
pub use crateU64Digits;
pub use crateBigInt;
pub use crateSign;
pub use crateToBigInt;
pub use crateBigRng010;
pub use crateBigRng09;
pub use crate;