WAD

Struct WAD 

Source
pub struct WAD { /* private fields */ }
Expand description

WAD (1e18) - used for fixed-point arithmetic

Methods from Deref<Target = BigInt>§

Source

pub const ZERO: BigInt

Source

pub fn to_bytes_be(&self) -> (Sign, Vec<u8>)

Returns the sign and the byte representation of the BigInt in big-endian byte order.

§Examples
use num_bigint::{ToBigInt, Sign};

let i = -1125.to_bigint().unwrap();
assert_eq!(i.to_bytes_be(), (Sign::Minus, vec![4, 101]));
Source

pub fn to_bytes_le(&self) -> (Sign, Vec<u8>)

Returns the sign and the byte representation of the BigInt in little-endian byte order.

§Examples
use num_bigint::{ToBigInt, Sign};

let i = -1125.to_bigint().unwrap();
assert_eq!(i.to_bytes_le(), (Sign::Minus, vec![101, 4]));
Source

pub fn to_u32_digits(&self) -> (Sign, Vec<u32>)

Returns the sign and the u32 digits representation of the BigInt ordered least significant digit first.

§Examples
use num_bigint::{BigInt, Sign};

assert_eq!(BigInt::from(-1125).to_u32_digits(), (Sign::Minus, vec![1125]));
assert_eq!(BigInt::from(4294967295u32).to_u32_digits(), (Sign::Plus, vec![4294967295]));
assert_eq!(BigInt::from(4294967296u64).to_u32_digits(), (Sign::Plus, vec![0, 1]));
assert_eq!(BigInt::from(-112500000000i64).to_u32_digits(), (Sign::Minus, vec![830850304, 26]));
assert_eq!(BigInt::from(112500000000i64).to_u32_digits(), (Sign::Plus, vec![830850304, 26]));
Source

pub fn to_u64_digits(&self) -> (Sign, Vec<u64>)

Returns the sign and the u64 digits representation of the BigInt ordered least significant digit first.

§Examples
use num_bigint::{BigInt, Sign};

assert_eq!(BigInt::from(-1125).to_u64_digits(), (Sign::Minus, vec![1125]));
assert_eq!(BigInt::from(4294967295u32).to_u64_digits(), (Sign::Plus, vec![4294967295]));
assert_eq!(BigInt::from(4294967296u64).to_u64_digits(), (Sign::Plus, vec![4294967296]));
assert_eq!(BigInt::from(-112500000000i64).to_u64_digits(), (Sign::Minus, vec![112500000000]));
assert_eq!(BigInt::from(112500000000i64).to_u64_digits(), (Sign::Plus, vec![112500000000]));
assert_eq!(BigInt::from(1u128 << 64).to_u64_digits(), (Sign::Plus, vec![0, 1]));
Source

pub fn iter_u32_digits(&self) -> U32Digits<'_>

Returns an iterator of u32 digits representation of the BigInt ordered least significant digit first.

§Examples
use num_bigint::BigInt;

assert_eq!(BigInt::from(-1125).iter_u32_digits().collect::<Vec<u32>>(), vec![1125]);
assert_eq!(BigInt::from(4294967295u32).iter_u32_digits().collect::<Vec<u32>>(), vec![4294967295]);
assert_eq!(BigInt::from(4294967296u64).iter_u32_digits().collect::<Vec<u32>>(), vec![0, 1]);
assert_eq!(BigInt::from(-112500000000i64).iter_u32_digits().collect::<Vec<u32>>(), vec![830850304, 26]);
assert_eq!(BigInt::from(112500000000i64).iter_u32_digits().collect::<Vec<u32>>(), vec![830850304, 26]);
Source

pub fn iter_u64_digits(&self) -> U64Digits<'_>

Returns an iterator of u64 digits representation of the BigInt ordered least significant digit first.

§Examples
use num_bigint::BigInt;

assert_eq!(BigInt::from(-1125).iter_u64_digits().collect::<Vec<u64>>(), vec![1125u64]);
assert_eq!(BigInt::from(4294967295u32).iter_u64_digits().collect::<Vec<u64>>(), vec![4294967295u64]);
assert_eq!(BigInt::from(4294967296u64).iter_u64_digits().collect::<Vec<u64>>(), vec![4294967296u64]);
assert_eq!(BigInt::from(-112500000000i64).iter_u64_digits().collect::<Vec<u64>>(), vec![112500000000u64]);
assert_eq!(BigInt::from(112500000000i64).iter_u64_digits().collect::<Vec<u64>>(), vec![112500000000u64]);
assert_eq!(BigInt::from(1u128 << 64).iter_u64_digits().collect::<Vec<u64>>(), vec![0, 1]);
Source

pub fn to_signed_bytes_be(&self) -> Vec<u8>

Returns the two’s-complement byte representation of the BigInt in big-endian byte order.

§Examples
use num_bigint::ToBigInt;

let i = -1125.to_bigint().unwrap();
assert_eq!(i.to_signed_bytes_be(), vec![251, 155]);
Source

pub fn to_signed_bytes_le(&self) -> Vec<u8>

Returns the two’s-complement byte representation of the BigInt in little-endian byte order.

§Examples
use num_bigint::ToBigInt;

let i = -1125.to_bigint().unwrap();
assert_eq!(i.to_signed_bytes_le(), vec![155, 251]);
Source

pub fn to_str_radix(&self, radix: u32) -> String

Returns the integer formatted as a string in the given radix. radix must be in the range 2...36.

§Examples
use num_bigint::BigInt;

let i = BigInt::parse_bytes(b"ff", 16).unwrap();
assert_eq!(i.to_str_radix(16), "ff");
Source

pub fn to_radix_be(&self, radix: u32) -> (Sign, Vec<u8>)

Returns the integer in the requested base in big-endian digit order. The output is not given in a human readable alphabet but as a zero based u8 number. radix must be in the range 2...256.

§Examples
use num_bigint::{BigInt, Sign};

assert_eq!(BigInt::from(-0xFFFFi64).to_radix_be(159),
           (Sign::Minus, vec![2, 94, 27]));
// 0xFFFF = 65535 = 2*(159^2) + 94*159 + 27
Source

pub fn to_radix_le(&self, radix: u32) -> (Sign, Vec<u8>)

Returns the integer in the requested base in little-endian digit order. The output is not given in a human readable alphabet but as a zero based u8 number. radix must be in the range 2...256.

§Examples
use num_bigint::{BigInt, Sign};

assert_eq!(BigInt::from(-0xFFFFi64).to_radix_le(159),
           (Sign::Minus, vec![27, 94, 2]));
// 0xFFFF = 65535 = 27 + 94*159 + 2*(159^2)
Source

pub fn sign(&self) -> Sign

Returns the sign of the BigInt as a Sign.

§Examples
use num_bigint::{BigInt, Sign};

assert_eq!(BigInt::from(1234).sign(), Sign::Plus);
assert_eq!(BigInt::from(-4321).sign(), Sign::Minus);
assert_eq!(BigInt::ZERO.sign(), Sign::NoSign);
Source

pub fn magnitude(&self) -> &BigUint

Returns the magnitude of the BigInt as a BigUint.

§Examples
use num_bigint::{BigInt, BigUint};
use num_traits::Zero;

assert_eq!(BigInt::from(1234).magnitude(), &BigUint::from(1234u32));
assert_eq!(BigInt::from(-4321).magnitude(), &BigUint::from(4321u32));
assert!(BigInt::ZERO.magnitude().is_zero());
Source

pub fn bits(&self) -> u64

Determines the fewest bits necessary to express the BigInt, not including the sign.

Source

pub fn to_biguint(&self) -> Option<BigUint>

Converts this BigInt into a BigUint, if it’s not negative.

Source

pub fn checked_add(&self, v: &BigInt) -> Option<BigInt>

Source

pub fn checked_sub(&self, v: &BigInt) -> Option<BigInt>

Source

pub fn checked_mul(&self, v: &BigInt) -> Option<BigInt>

Source

pub fn checked_div(&self, v: &BigInt) -> Option<BigInt>

Source

pub fn pow(&self, exponent: u32) -> BigInt

Returns self ^ exponent.

Source

pub fn modpow(&self, exponent: &BigInt, modulus: &BigInt) -> BigInt

Returns (self ^ exponent) mod modulus

Note that this rounds like mod_floor, not like the % operator, which makes a difference when given a negative self or modulus. The result will be in the interval [0, modulus) for modulus > 0, or in the interval (modulus, 0] for modulus < 0

Panics if the exponent is negative or the modulus is zero.

Source

pub fn modinv(&self, modulus: &BigInt) -> Option<BigInt>

Returns the modular multiplicative inverse if it exists, otherwise None.

This solves for x such that self * x ≡ 1 (mod modulus). Note that this rounds like mod_floor, not like the % operator, which makes a difference when given a negative self or modulus. The solution will be in the interval [0, modulus) for modulus > 0, or in the interval (modulus, 0] for modulus < 0, and it exists if and only if gcd(self, modulus) == 1.

use num_bigint::BigInt;
use num_integer::Integer;
use num_traits::{One, Zero};

let m = BigInt::from(383);

// Trivial cases
assert_eq!(BigInt::zero().modinv(&m), None);
assert_eq!(BigInt::one().modinv(&m), Some(BigInt::one()));
let neg1 = &m - 1u32;
assert_eq!(neg1.modinv(&m), Some(neg1));

// Positive self and modulus
let a = BigInt::from(271);
let x = a.modinv(&m).unwrap();
assert_eq!(x, BigInt::from(106));
assert_eq!(x.modinv(&m).unwrap(), a);
assert_eq!((&a * x).mod_floor(&m), BigInt::one());

// Negative self and positive modulus
let b = -&a;
let x = b.modinv(&m).unwrap();
assert_eq!(x, BigInt::from(277));
assert_eq!((&b * x).mod_floor(&m), BigInt::one());

// Positive self and negative modulus
let n = -&m;
let x = a.modinv(&n).unwrap();
assert_eq!(x, BigInt::from(-277));
assert_eq!((&a * x).mod_floor(&n), &n + 1);

// Negative self and modulus
let x = b.modinv(&n).unwrap();
assert_eq!(x, BigInt::from(-106));
assert_eq!((&b * x).mod_floor(&n), &n + 1);
Source

pub fn sqrt(&self) -> BigInt

Returns the truncated principal square root of self – see num_integer::Roots::sqrt().

Source

pub fn cbrt(&self) -> BigInt

Returns the truncated principal cube root of self – see num_integer::Roots::cbrt().

Source

pub fn nth_root(&self, n: u32) -> BigInt

Returns the truncated principal nth root of self – See num_integer::Roots::nth_root().

Source

pub fn trailing_zeros(&self) -> Option<u64>

Returns the number of least-significant bits that are zero, or None if the entire number is zero.

Source

pub fn bit(&self, bit: u64) -> bool

Returns whether the bit in position bit is set, using the two’s complement for negative numbers

Trait Implementations§

Source§

impl Deref for WAD

Source§

type Target = BigInt

The resulting type after dereferencing.
Source§

fn deref(&self) -> &BigInt

Dereferences the value.
Source§

impl LazyStatic for WAD

Auto Trait Implementations§

§

impl Freeze for WAD

§

impl RefUnwindSafe for WAD

§

impl Send for WAD

§

impl Sync for WAD

§

impl Unpin for WAD

§

impl UnwindSafe for WAD

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.