Skip to main content

SafeGcdInverter

Struct SafeGcdInverter 

Source
pub(crate) struct SafeGcdInverter<const LIMBS: usize> {
    pub(super) modulus: Odd<Uint<LIMBS>>,
    inverse: u64,
    adjuster: Uint<LIMBS>,
}
Expand description

Modular multiplicative inverter based on the Bernstein-Yang method.

The inverter can be created for a specified modulus M and adjusting parameter A to compute the adjusted multiplicative inverses of positive integers, i.e. for computing (1 / x) * A (mod M) for a positive integer x.

The adjusting parameter allows computing the multiplicative inverses in the case of using the Montgomery representation for the input or the expected output. If R is the Montgomery factor, the multiplicative inverses in the appropriate representation can be computed provided that the value of A is chosen as follows:

  • A = 1, if both the input and the expected output are in the standard form
  • A = R^2 mod M, if both the input and the expected output are in the Montgomery form
  • A = R mod M, if either the input or the expected output is in the Montgomery form, but not both of them

The public methods of this type receive and return unsigned big integers as arrays of 64-bit chunks, the ordering of which is little-endian. Both the modulus and the integer to be inverted should not exceed 2 ^ (62 * L - 64).

For better understanding the implementation, the following resources are recommended:

Fields§

§modulus: Odd<Uint<LIMBS>>

Modulus

§inverse: u64

Multiplicative inverse of the modulus modulo 2^62

§adjuster: Uint<LIMBS>

Adjusting parameter (see toplevel documentation).

Implementations§

Source§

impl<const LIMBS: usize> SafeGcdInverter<LIMBS>

Source

pub(crate) const fn new_with_inverse( modulus: &Odd<Uint<LIMBS>>, inverse: U64, adjuster: &Uint<LIMBS>, ) -> Self

Source

pub const fn invert(&self, value: &Uint<LIMBS>) -> CtOption<Uint<LIMBS>>

Returns either the adjusted modular multiplicative inverse for the argument or None depending on invertibility of the argument, i.e. its coprimality with the modulus.

Source

pub const fn invert_vartime(&self, value: &Uint<LIMBS>) -> CtOption<Uint<LIMBS>>

Returns either the adjusted modular multiplicative inverse for the argument or None depending on invertibility of the argument, i.e. its coprimality with the modulus.

This version is variable-time with respect to value.

Trait Implementations§

Source§

impl<const LIMBS: usize> Clone for SafeGcdInverter<LIMBS>

Source§

fn clone(&self) -> SafeGcdInverter<LIMBS>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<const LIMBS: usize> Debug for SafeGcdInverter<LIMBS>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<const LIMBS: usize> Freeze for SafeGcdInverter<LIMBS>

§

impl<const LIMBS: usize> RefUnwindSafe for SafeGcdInverter<LIMBS>

§

impl<const LIMBS: usize> Send for SafeGcdInverter<LIMBS>

§

impl<const LIMBS: usize> Sync for SafeGcdInverter<LIMBS>

§

impl<const LIMBS: usize> Unpin for SafeGcdInverter<LIMBS>

§

impl<const LIMBS: usize> UnsafeUnpin for SafeGcdInverter<LIMBS>

§

impl<const LIMBS: usize> UnwindSafe for SafeGcdInverter<LIMBS>

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.