Trait miden_air::StarkField

pub trait StarkField: FieldElement<BaseField = Self> {
    const MODULUS: <Self as FieldElement>::PositiveInteger;
    const MODULUS_BITS: u32;
    const GENERATOR: Self;
    const TWO_ADICITY: u32;
    const TWO_ADIC_ROOT_OF_UNITY: Self;

    // Required methods
    fn get_modulus_le_bytes() -> Vec<u8, Global> ;
    fn as_int(&self) -> Self::PositiveInteger;

    // Provided method
    fn get_root_of_unity(n: u32) -> Self { ... }
}
Expand description

Defines an element in a STARK-friendly finite field.

A STARK-friendly field is defined as a prime field with high two-addicity. That is, the the modulus of the field should be a prime number of the form k * 2^n + 1 (a Proth prime), where n is relatively large (e.g., greater than 32).

Required Associated Constants§

const MODULUS: <Self as FieldElement>::PositiveInteger

Prime modulus of the field. Must be of the form k * 2^n + 1 (a Proth prime). This ensures that the field has high 2-adicity.

const MODULUS_BITS: u32

The number of bits needed to represents Self::MODULUS.

const GENERATOR: Self

A multiplicative generator of the field.

const TWO_ADICITY: u32

Let Self::MODULUS = k * 2^n + 1; then, TWO_ADICITY is n.

const TWO_ADIC_ROOT_OF_UNITY: Self

Let Self::MODULUS = k * 2^n + 1; then, TWO_ADIC_ROOT_OF_UNITY is 2^n root of unity computed as Self::GENERATOR^k.

Required Methods§

fn get_modulus_le_bytes() -> Vec<u8, Global>

Returns byte representation of the field modulus in little-endian byte order.

fn as_int(&self) -> Self::PositiveInteger

Returns a canonical integer representation of this field element.

Provided Methods§

fn get_root_of_unity(n: u32) -> Self

Returns the root of unity of order 2^n.

Panics

Panics if the root of unity for the specified order does not exist in this field.

Implementors§

§

impl StarkField for miden_air::Felt

§

const MODULUS: <BaseElement as FieldElement>::PositiveInteger = {transmute(0xffffffff00000001): <miden_core::Felt as miden_core::FieldElement>::PositiveInteger}

§

const MODULUS_BITS: u32 = 64u32

§

const GENERATOR: BaseElement = Self::new(7)

§

const TWO_ADICITY: u32 = 32u32

§

const TWO_ADIC_ROOT_OF_UNITY: BaseElement = Self::new(7277203076849721926)

§

impl StarkField for BaseElement

§

const MODULUS: <BaseElement as FieldElement>::PositiveInteger = {transmute(0x3fffc88000000001): <winter_math::field::f62::BaseElement as miden_core::FieldElement>::PositiveInteger}

§

const MODULUS_BITS: u32 = 62u32

§

const GENERATOR: BaseElement = BaseElement::new(3)

§

const TWO_ADICITY: u32 = 39u32

§

const TWO_ADIC_ROOT_OF_UNITY: BaseElement = BaseElement::new(G)

§

impl StarkField for BaseElement

§

const MODULUS: <BaseElement as FieldElement>::PositiveInteger = {transmute(0xffffffffffffffffffffd30000000001): <winter_math::field::f128::BaseElement as miden_core::FieldElement>::PositiveInteger}

§

const MODULUS_BITS: u32 = 128u32

§

const GENERATOR: BaseElement = BaseElement(3)

§

const TWO_ADICITY: u32 = 40u32

§

const TWO_ADIC_ROOT_OF_UNITY: BaseElement = BaseElement(G)