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
// 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. //! A Big integer (signed version: `BigInt`, unsigned version: `BigUint`). //! //! A `BigUint` is represented as a vector of `BigDigit`s. //! A `BigInt` 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 //! extern crate num_bigint; //! extern crate num_traits; //! //! # fn main() { //! use num_bigint::BigUint; //! use num_traits::{Zero, One}; //! use std::mem::replace; //! //! // Calculate large fibonacci numbers. //! fn fib(n: usize) -> BigUint { //! let mut f0: BigUint = Zero::zero(); //! let mut f1: BigUint = One::one(); //! for _ in 0..n { //! let f2 = f0 + &f1; //! // This is a low cost way of swapping f0 with f1 and f1 with f2. //! f0 = replace(&mut f1, f2); //! } //! f0 //! } //! //! // This is a very large number. //! println!("fib(1000) = {}", fib(1000)); //! # } //! ``` //! //! It's easy to generate large random numbers: //! //! ```rust //! extern crate rand; //! extern crate num_bigint as bigint; //! //! # #[cfg(feature = "rand")] //! # fn main() { //! use bigint::{ToBigInt, RandBigInt}; //! //! let mut rng = rand::thread_rng(); //! let a = rng.gen_bigint(1000); //! //! let low = -10000.to_bigint().unwrap(); //! let high = 10000.to_bigint().unwrap(); //! let b = rng.gen_bigint_range(&low, &high); //! //! // Probably an even larger number. //! println!("{}", a * b); //! # } //! //! # #[cfg(not(feature = "rand"))] //! # fn main() { //! # } //! ``` #[cfg(any(feature = "rand", test))] extern crate rand; #[cfg(feature = "rustc-serialize")] extern crate rustc_serialize; #[cfg(feature = "serde")] extern crate serde; extern crate num_integer as integer; extern crate num_traits as traits; use std::error::Error; use std::num::ParseIntError; use std::fmt; #[derive(Debug, PartialEq)] pub enum ParseBigIntError { ParseInt(ParseIntError), Other, } impl fmt::Display for ParseBigIntError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { &ParseBigIntError::ParseInt(ref e) => e.fmt(f), &ParseBigIntError::Other => "failed to parse provided string".fmt(f), } } } impl Error for ParseBigIntError { fn description(&self) -> &str { "failed to parse bigint/biguint" } } impl From<ParseIntError> for ParseBigIntError { fn from(err: ParseIntError) -> ParseBigIntError { ParseBigIntError::ParseInt(err) } } #[cfg(test)] use std::hash; #[cfg(test)] fn hash<T: hash::Hash>(x: &T) -> u64 { use std::hash::Hasher; let mut hasher = hash::SipHasher::new(); x.hash(&mut hasher); hasher.finish() } #[macro_use] mod macros; mod biguint; mod bigint; pub use biguint::BigUint; pub use biguint::ToBigUint; pub use biguint::big_digit; pub use biguint::big_digit::{BigDigit, DoubleBigDigit, ZERO_BIG_DIGIT}; pub use bigint::Sign; pub use bigint::BigInt; pub use bigint::ToBigInt; pub use bigint::RandBigInt;