Struct LispBigInt

Source
pub(crate) struct LispBigInt(GcHeap<BigInt>);

Tuple Fields§

§0: GcHeap<BigInt>

Implementations§

Source§

impl LispBigInt

Source

pub fn new(big_int: BigInt, constant: bool) -> Self

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<'new> CloneIn<'new, &'new LispBigInt> for LispBigInt

Source§

fn clone_in<const C: bool>(&self, bk: &'new Block<C>) -> Gc<&'new Self>

Source§

impl Deref for LispBigInt

Source§

type Target = BigInt

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl Display for LispBigInt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'ob> From<&LispBigInt> for Gc<NumberType<'ob>>

Source§

fn from(x: &LispBigInt) -> Self

Converts to this type from the input type.
Source§

impl<'ob> From<&'ob LispBigInt> for Gc<ObjectType<'ob>>

Source§

fn from(x: &'ob LispBigInt) -> Self

Converts to this type from the input type.
Source§

impl GcMoveable for LispBigInt

Source§

type Value = NonNull<LispBigInt>

Source§

fn move_value(&self, to_space: &Bump) -> Option<(Self::Value, bool)>

Source§

impl PartialEq for LispBigInt

Source§

fn eq(&self, other: &LispBigInt) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl TaggedPtr for &LispBigInt

Source§

const TAG: Tag = Tag::BigInt

Tag value. This is only applicable to base values. Use Int for sum types.
Source§

type Ptr = LispBigInt

The type of object being pointed to. This will be different for all implementors.
Source§

unsafe fn from_obj_ptr(ptr: *const u8) -> Self

Given an untyped pointer, reinterpret to self. Read more
Source§

fn get_ptr(self) -> *const Self::Ptr

Get the underlying pointer. Read more
Source§

unsafe fn tag_ptr(ptr: *const Self::Ptr) -> Gc<Self>

Given a pointer to Ptr return a Tagged pointer. Read more
Source§

fn untag(val: Gc<Self>) -> Self

Remove the tag from the Gc<T> and return the inner type. If it is base type then it will only have a single possible value and can be untagged without checks, but sum types need to create all values they can hold. We use tagged base types to let us reinterpret bits without actually modify them. Read more
Source§

fn tag(self) -> Gc<Self>

Given the type, return a tagged version of it. When using a sum type or an immediate value like i64, we override this method to set the proper tag. Read more
Source§

impl Trace for LispBigInt

Source§

fn trace(&self, _: &mut GcState)

Source§

impl<'old, 'new> WithLifetime<'new> for &'old LispBigInt

Source§

type Out = &'new LispBigInt

Source§

unsafe fn with_lifetime(self) -> Self::Out

Source§

impl Eq for LispBigInt

Source§

impl GcPtr for &LispBigInt

Source§

impl StructuralPartialEq for LispBigInt

Auto Trait Implementations§

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
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V