pub struct MontBackend<T: MontConfig<N>, const N: usize>(_);
Trait Implementations§
source§impl<T: MontConfig<N>, const N: usize> FpConfig<N> for MontBackend<T, N>
impl<T: MontConfig<N>, const N: usize> FpConfig<N> for MontBackend<T, N>
source§const GENERATOR: Fp<Self, N> = T::GENERATOR
const GENERATOR: Fp<Self, N> = T::GENERATOR
A multiplicative generator of the field.
Self::GENERATOR
is an element having multiplicative order
Self::MODULUS - 1
.
source§const ZERO: Fp<Self, N> = _
const ZERO: Fp<Self, N> = _
Additive identity of the field, i.e. the element e
such that, for all elements f
of the field, e + f = f
.
source§const ONE: Fp<Self, N> = _
const ONE: Fp<Self, N> = _
Multiplicative identity of the field, i.e. the element e
such that, for all elements f
of the field, e * f = f
.
source§fn mul_assign(a: &mut Fp<Self, N>, b: &Fp<Self, N>)
fn mul_assign(a: &mut Fp<Self, N>, b: &Fp<Self, N>)
This modular multiplication algorithm uses Montgomery
reduction for efficient implementation. It also additionally
uses the “no-carry optimization” outlined
here if
P::MODULUS
has (a) a non-zero MSB, and (b) at least one
zero bit in the rest of the modulus.
source§const TWO_ADICITY: u32 = _
const TWO_ADICITY: u32 = _
Let
N
be the size of the multiplicative group defined by the field.
Then TWO_ADICITY
is the two-adicity of N
, i.e. the integer s
such that N = 2^s * t
for some odd integer t
.source§const TWO_ADIC_ROOT_OF_UNITY: Fp<Self, N> = T::TWO_ADIC_ROOT_OF_UNITY
const TWO_ADIC_ROOT_OF_UNITY: Fp<Self, N> = T::TWO_ADIC_ROOT_OF_UNITY
2^s root of unity computed by GENERATOR^t
source§const SMALL_SUBGROUP_BASE: Option<u32> = T::SMALL_SUBGROUP_BASE
const SMALL_SUBGROUP_BASE: Option<u32> = T::SMALL_SUBGROUP_BASE
An integer
b
such that there exists a multiplicative subgroup
of size b^k
for some integer k
.source§const SMALL_SUBGROUP_BASE_ADICITY: Option<u32> = T::SMALL_SUBGROUP_BASE_ADICITY
const SMALL_SUBGROUP_BASE_ADICITY: Option<u32> = T::SMALL_SUBGROUP_BASE_ADICITY
The integer
k
such that there exists a multiplicative subgroup
of size Self::SMALL_SUBGROUP_BASE^k
.source§const LARGE_SUBGROUP_ROOT_OF_UNITY: Option<Fp<Self, N>> = T::LARGE_SUBGROUP_ROOT_OF_UNITY
const LARGE_SUBGROUP_ROOT_OF_UNITY: Option<Fp<Self, N>> = T::LARGE_SUBGROUP_ROOT_OF_UNITY
GENERATOR^((MODULUS-1) / (2^s *
SMALL_SUBGROUP_BASE^SMALL_SUBGROUP_BASE_ADICITY)) Used for mixed-radix
FFT.
source§const SQRT_PRECOMP: Option<SqrtPrecomputation<Fp<Self, N>>> = T::SQRT_PRECOMP
const SQRT_PRECOMP: Option<SqrtPrecomputation<Fp<Self, N>>> = T::SQRT_PRECOMP
Precomputed material for use when computing square roots.
Currently uses the generic Tonelli-Shanks,
which works for every modulus.
source§fn add_assign(a: &mut Fp<Self, N>, b: &Fp<Self, N>)
fn add_assign(a: &mut Fp<Self, N>, b: &Fp<Self, N>)
Set a += b.
source§fn sub_assign(a: &mut Fp<Self, N>, b: &Fp<Self, N>)
fn sub_assign(a: &mut Fp<Self, N>, b: &Fp<Self, N>)
Set a -= b.
source§fn double_in_place(a: &mut Fp<Self, N>)
fn double_in_place(a: &mut Fp<Self, N>)
Set a = a + a.
source§fn neg_in_place(a: &mut Fp<Self, N>)
fn neg_in_place(a: &mut Fp<Self, N>)
Set a = -a;
source§fn sum_of_products<const M: usize>(
a: &[Fp<Self, N>; M],
b: &[Fp<Self, N>; M]
) -> Fp<Self, N>
fn sum_of_products<const M: usize>( a: &[Fp<Self, N>; M], b: &[Fp<Self, N>; M] ) -> Fp<Self, N>
Compute the inner product
<a, b>
.source§fn square_in_place(a: &mut Fp<Self, N>)
fn square_in_place(a: &mut Fp<Self, N>)
Set a *= b.
source§fn from_bigint(r: BigInt<N>) -> Option<Fp<Self, N>>
fn from_bigint(r: BigInt<N>) -> Option<Fp<Self, N>>
Construct a field element from an integer in the range
0..(Self::MODULUS - 1)
. Returns None
if the integer is outside
this range.source§fn into_bigint(a: Fp<Self, N>) -> BigInt<N>
fn into_bigint(a: Fp<Self, N>) -> BigInt<N>
Convert a field element to an integer in the range
0..(Self::MODULUS - 1)
.