Trait ark_ff::fields::PrimeField

source ·
pub trait PrimeField: Field<BasePrimeField = Self> + FftField + FromStr + From<Self::BigInt> + Into<Self::BigInt> + From<BigUint> + Into<BigUint> {
    type BigInt: BigInteger;

    const MODULUS: Self::BigInt;
    const MODULUS_MINUS_ONE_DIV_TWO: Self::BigInt;
    const MODULUS_BIT_SIZE: u32;
    const TRACE: Self::BigInt;
    const TRACE_MINUS_ONE_DIV_TWO: Self::BigInt;

    // Required methods
    fn from_bigint(repr: Self::BigInt) -> Option<Self>;
    fn into_bigint(self) -> Self::BigInt;

    // Provided methods
    fn from_be_bytes_mod_order(bytes: &[u8]) -> Self { ... }
    fn from_le_bytes_mod_order(bytes: &[u8]) -> Self { ... }
}
Expand description

The interface for a prime field, i.e. the field of integers modulo a prime $p$.
In the following example we’ll use the prime field underlying the BLS12-381 G1 curve.

use ark_ff::{BigInteger, Field, PrimeField};
use ark_std::{test_rng, One, UniformRand, Zero};
use ark_test_curves::bls12_381::Fq as F;

let mut rng = test_rng();
let a = F::rand(&mut rng);
// We can access the prime modulus associated with `F`:
let modulus = <F as PrimeField>::MODULUS;
assert_eq!(a.pow(&modulus), a); // the Euler-Fermat theorem tells us: a^{p-1} = 1 mod p

// We can convert field elements to integers in the range [0, MODULUS - 1]:
let one: num_bigint::BigUint = F::one().into();
assert_eq!(one, num_bigint::BigUint::one());

// We can construct field elements from an arbitrary sequence of bytes:
let n = F::from_le_bytes_mod_order(&modulus.to_bytes_le());
assert_eq!(n, F::zero());

Required Associated Types§

source

type BigInt: BigInteger

A BigInteger type that can represent elements of this field.

Required Associated Constants§

source

const MODULUS: Self::BigInt

The modulus p.

source

const MODULUS_MINUS_ONE_DIV_TWO: Self::BigInt

The value (p - 1)/ 2.

source

const MODULUS_BIT_SIZE: u32

The size of the modulus in bits.

source

const TRACE: Self::BigInt

The trace of the field is defined as the smallest integer t such that by 2^s * t = p - 1, and t is coprime to 2.

source

const TRACE_MINUS_ONE_DIV_TWO: Self::BigInt

The value (t - 1)/ 2.

Required Methods§

source

fn from_bigint(repr: Self::BigInt) -> Option<Self>

Construct a prime field element from an integer in the range 0..(p - 1).

source

fn into_bigint(self) -> Self::BigInt

Converts an element of the prime field into an integer in the range 0..(p - 1).

Provided Methods§

source

fn from_be_bytes_mod_order(bytes: &[u8]) -> Self

Reads bytes in big-endian, and converts them to a field element. If the integer represented by bytes is larger than the modulus p, this method performs the appropriate reduction.

source

fn from_le_bytes_mod_order(bytes: &[u8]) -> Self

Reads bytes in little-endian, and converts them to a field element. If the integer represented by bytes is larger than the modulus p, this method performs the appropriate reduction.

Implementors§

source§

impl<P: FpConfig<N>, const N: usize> PrimeField for Fp<P, N>