pub struct Felt(_);
Expand description
Represents base field element in the field using Montgomery representation.
Internal values represent x * R mod M where R = 2^64 mod M and x in [0, M).
The backing type is u64
but the internal values are always in the range [0, M).
Implementations§
§impl BaseElement
impl BaseElement
pub const fn new(value: u64) -> BaseElement
pub const fn new(value: u64) -> BaseElement
Creates a new field element from the provided value
; the value is converted into
Montgomery representation.
pub const fn from_mont(value: u64) -> BaseElement
pub const fn from_mont(value: u64) -> BaseElement
Returns a new field element from the provided ‘value’. Assumes that ‘value’ is already in canonical Montgomery form.
pub fn exp7(self) -> BaseElement
pub fn exp7(self) -> BaseElement
Computes an exponentiation to the power 7. This is useful for computing Rescue-Prime S-Box over this field.
pub fn mul_small(self, rhs: u32) -> BaseElement
pub fn mul_small(self, rhs: u32) -> BaseElement
Multiplies an element that is less than 2^32 by a field element. This implementation is faster as it avoids the use of Montgomery reduction.
Trait Implementations§
§impl Add<BaseElement> for BaseElement
impl Add<BaseElement> for BaseElement
§type Output = BaseElement
type Output = BaseElement
+
operator.§fn add(self, rhs: BaseElement) -> BaseElement
fn add(self, rhs: BaseElement) -> BaseElement
+
operation. Read more§impl AddAssign<BaseElement> for BaseElement
impl AddAssign<BaseElement> for BaseElement
§fn add_assign(&mut self, rhs: BaseElement)
fn add_assign(&mut self, rhs: BaseElement)
+=
operation. Read more§impl AsBytes for BaseElement
impl AsBytes for BaseElement
§impl Clone for BaseElement
impl Clone for BaseElement
§fn clone(&self) -> BaseElement
fn clone(&self) -> BaseElement
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more§impl Debug for BaseElement
impl Debug for BaseElement
§impl Default for BaseElement
impl Default for BaseElement
§fn default() -> BaseElement
fn default() -> BaseElement
§impl Deserializable for BaseElement
impl Deserializable for BaseElement
§fn read_from<R>(source: &mut R) -> Result<BaseElement, DeserializationError>where
R: ByteReader,
fn read_from<R>(source: &mut R) -> Result<BaseElement, DeserializationError>where R: ByteReader,
source
, attempts to deserialize these bytes
into Self
, and returns the result. Read more§fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
§fn read_batch_from<R>(
source: &mut R,
num_elements: usize
) -> Result<Vec<Self, Global>, DeserializationError>where
R: ByteReader,
fn read_batch_from<R>( source: &mut R, num_elements: usize ) -> Result<Vec<Self, Global>, DeserializationError>where R: ByteReader,
source
, attempts to deserialize these bytes
into a vector with the specified number of Self
elements, and returns the result. Read more§impl Display for BaseElement
impl Display for BaseElement
§impl Div<BaseElement> for BaseElement
impl Div<BaseElement> for BaseElement
§type Output = BaseElement
type Output = BaseElement
/
operator.§fn div(self, rhs: BaseElement) -> BaseElement
fn div(self, rhs: BaseElement) -> BaseElement
/
operation. Read more§impl DivAssign<BaseElement> for BaseElement
impl DivAssign<BaseElement> for BaseElement
§fn div_assign(&mut self, rhs: BaseElement)
fn div_assign(&mut self, rhs: BaseElement)
/=
operation. Read more§impl ExtensibleField<2> for BaseElement
impl ExtensibleField<2> for BaseElement
Defines a quadratic extension of the base field over an irreducible polynomial x2 - x + 2. Thus, an extension element is defined as α + β * φ, where φ is a root of this polynomial, and α and β are base field elements.
§fn mul(a: [BaseElement; 2], b: [BaseElement; 2]) -> [BaseElement; 2]
fn mul(a: [BaseElement; 2], b: [BaseElement; 2]) -> [BaseElement; 2]
a
and b
in the field defined by this extension.§fn square(a: [BaseElement; 2]) -> [BaseElement; 2]
fn square(a: [BaseElement; 2]) -> [BaseElement; 2]
a
in the field defined by this extension.§fn mul_base(a: [BaseElement; 2], b: BaseElement) -> [BaseElement; 2]
fn mul_base(a: [BaseElement; 2], b: BaseElement) -> [BaseElement; 2]
a
and b
in the field defined by this extension. b
represents
an element in the base field.§fn frobenius(x: [BaseElement; 2]) -> [BaseElement; 2]
fn frobenius(x: [BaseElement; 2]) -> [BaseElement; 2]
x
in the field defined by this extension.§fn is_supported() -> bool
fn is_supported() -> bool
§impl ExtensibleField<3> for BaseElement
impl ExtensibleField<3> for BaseElement
Defines a cubic extension of the base field over an irreducible polynomial x3 - x - 1. Thus, an extension element is defined as α + β * φ + γ * φ^2, where φ is a root of this polynomial, and α, β and γ are base field elements.
§fn mul(a: [BaseElement; 3], b: [BaseElement; 3]) -> [BaseElement; 3]
fn mul(a: [BaseElement; 3], b: [BaseElement; 3]) -> [BaseElement; 3]
a
and b
in the field defined by this extension.§fn square(a: [BaseElement; 3]) -> [BaseElement; 3]
fn square(a: [BaseElement; 3]) -> [BaseElement; 3]
a
in the field defined by this extension.§fn mul_base(a: [BaseElement; 3], b: BaseElement) -> [BaseElement; 3]
fn mul_base(a: [BaseElement; 3], b: BaseElement) -> [BaseElement; 3]
a
and b
in the field defined by this extension. b
represents
an element in the base field.§fn frobenius(x: [BaseElement; 3]) -> [BaseElement; 3]
fn frobenius(x: [BaseElement; 3]) -> [BaseElement; 3]
x
in the field defined by this extension.§fn is_supported() -> bool
fn is_supported() -> bool
§impl FieldElement for BaseElement
impl FieldElement for BaseElement
§type PositiveInteger = u64
type PositiveInteger = u64
Self::BaseField
with no loss of precision.§type BaseField = BaseElement
type BaseField = BaseElement
BaseField
should be set
to Self
.§const EXTENSION_DEGREE: usize = 1usize
const EXTENSION_DEGREE: usize = 1usize
Self::BaseField
. For prime fields,
extension degree should be set to 1.§const ZERO: BaseElement = Self::new(0)
const ZERO: BaseElement = Self::new(0)
§const ONE: BaseElement = Self::new(1)
const ONE: BaseElement = Self::new(1)
§const ELEMENT_BYTES: usize = 8usize
const ELEMENT_BYTES: usize = 8usize
§const IS_CANONICAL: bool = false
const IS_CANONICAL: bool = false
§fn double(self) -> BaseElement
fn double(self) -> BaseElement
§fn exp(
self,
power: <BaseElement as FieldElement>::PositiveInteger
) -> BaseElement
fn exp( self, power: <BaseElement as FieldElement>::PositiveInteger ) -> BaseElement
power
parameter.§fn inv(self) -> BaseElement
fn inv(self) -> BaseElement
§fn conjugate(&self) -> BaseElement
fn conjugate(&self) -> BaseElement
§fn base_element(&self, i: usize) -> <BaseElement as FieldElement>::BaseField
fn base_element(&self, i: usize) -> <BaseElement as FieldElement>::BaseField
i
. Read more§fn slice_as_base_elements(
elements: &[BaseElement]
) -> &[<BaseElement as FieldElement>::BaseField]
fn slice_as_base_elements( elements: &[BaseElement] ) -> &[<BaseElement as FieldElement>::BaseField]
§fn slice_from_base_elements(
elements: &[<BaseElement as FieldElement>::BaseField]
) -> &[BaseElement]
fn slice_from_base_elements( elements: &[<BaseElement as FieldElement>::BaseField] ) -> &[BaseElement]
§fn elements_as_bytes(elements: &[BaseElement]) -> &[u8] ⓘ
fn elements_as_bytes(elements: &[BaseElement]) -> &[u8] ⓘ
§unsafe fn bytes_as_elements(
bytes: &[u8]
) -> Result<&[BaseElement], DeserializationError>
unsafe fn bytes_as_elements( bytes: &[u8] ) -> Result<&[BaseElement], DeserializationError>
§fn zeroed_vector(n: usize) -> Vec<BaseElement, Global>
fn zeroed_vector(n: usize) -> Vec<BaseElement, Global>
n
initialized with all ZERO elements. Read more§fn exp_vartime(self, power: Self::PositiveInteger) -> Self
fn exp_vartime(self, power: Self::PositiveInteger) -> Self
power
parameter.
This function is expressly variable time, to speed-up verifier computations.§impl From<[u8; 8]> for BaseElement
impl From<[u8; 8]> for BaseElement
§fn from(bytes: [u8; 8]) -> BaseElement
fn from(bytes: [u8; 8]) -> BaseElement
Converts the value encoded in an array of 8 bytes into a field element. The bytes are assumed to encode the element in the canonical representation in little-endian byte order. If the value is greater than or equal to the field modulus, modular reduction is silently performed.
§impl From<u128> for BaseElement
impl From<u128> for BaseElement
§fn from(x: u128) -> BaseElement
fn from(x: u128) -> BaseElement
Converts a 128-bit value into a field element.
§impl From<u16> for BaseElement
impl From<u16> for BaseElement
§fn from(value: u16) -> BaseElement
fn from(value: u16) -> BaseElement
Converts a 16-bit value into a field element.
§impl From<u32> for BaseElement
impl From<u32> for BaseElement
§fn from(value: u32) -> BaseElement
fn from(value: u32) -> BaseElement
Converts a 32-bit value into a field element.
§impl From<u64> for BaseElement
impl From<u64> for BaseElement
§fn from(value: u64) -> BaseElement
fn from(value: u64) -> BaseElement
Converts a 64-bit value into a field element. If the value is greater than or equal to the field modulus, modular reduction is silently performed.
§impl From<u8> for BaseElement
impl From<u8> for BaseElement
§fn from(value: u8) -> BaseElement
fn from(value: u8) -> BaseElement
Converts an 8-bit value into a field element.
§impl Mul<BaseElement> for BaseElement
impl Mul<BaseElement> for BaseElement
§type Output = BaseElement
type Output = BaseElement
*
operator.§fn mul(self, rhs: BaseElement) -> BaseElement
fn mul(self, rhs: BaseElement) -> BaseElement
*
operation. Read more§impl MulAssign<BaseElement> for BaseElement
impl MulAssign<BaseElement> for BaseElement
§fn mul_assign(&mut self, rhs: BaseElement)
fn mul_assign(&mut self, rhs: BaseElement)
*=
operation. Read more§impl Neg for BaseElement
impl Neg for BaseElement
§type Output = BaseElement
type Output = BaseElement
-
operator.§fn neg(self) -> BaseElement
fn neg(self) -> BaseElement
-
operation. Read more§impl PartialEq<BaseElement> for BaseElement
impl PartialEq<BaseElement> for BaseElement
§fn eq(&self, other: &BaseElement) -> bool
fn eq(&self, other: &BaseElement) -> bool
self
and other
values to be equal, and is used
by ==
.§impl Randomizable for BaseElement
impl Randomizable for BaseElement
§const VALUE_SIZE: usize = 8usize
const VALUE_SIZE: usize = 8usize
Self
in bytes. Read more§fn from_random_bytes(bytes: &[u8]) -> Option<BaseElement>
fn from_random_bytes(bytes: &[u8]) -> Option<BaseElement>
Self
if the set of bytes forms a valid value, otherwise returns None.§impl Serializable for BaseElement
impl Serializable for BaseElement
§fn write_into<W>(&self, target: &mut W)where
W: ByteWriter,
fn write_into<W>(&self, target: &mut W)where W: ByteWriter,
self
into bytes and writes these bytes into the target
.§fn write_batch_into<W>(source: &[Self], target: &mut W)where
W: ByteWriter,
fn write_batch_into<W>(source: &[Self], target: &mut W)where W: ByteWriter,
§fn get_size_hint(&self) -> usize
fn get_size_hint(&self) -> usize
§impl StarkField for BaseElement
impl StarkField for BaseElement
§const MODULUS: <BaseElement as FieldElement>::PositiveInteger = {transmute(0xffffffff00000001): <miden_core::Felt as miden_core::FieldElement>::PositiveInteger}
const MODULUS: <BaseElement as FieldElement>::PositiveInteger = {transmute(0xffffffff00000001): <miden_core::Felt as miden_core::FieldElement>::PositiveInteger}
sage: MODULUS = 2^64 - 2^32 + 1
sage: GF(MODULUS).is_prime_field()
True
sage: GF(MODULUS).order()
18446744069414584321
§const GENERATOR: BaseElement = Self::new(7)
const GENERATOR: BaseElement = Self::new(7)
sage: GF(MODULUS).primitive_element()
7
§const TWO_ADICITY: u32 = 32u32
const TWO_ADICITY: u32 = 32u32
sage: is_odd((MODULUS - 1) / 2^32)
True
§const TWO_ADIC_ROOT_OF_UNITY: BaseElement = Self::new(7277203076849721926)
const TWO_ADIC_ROOT_OF_UNITY: BaseElement = Self::new(7277203076849721926)
Root of unity for domain of 2^32 elements. This root of unity is selected because it implies that the generator for domain of size 64 is 8. This is attractive because it allows replacing some multiplications with shifts (e.g., for NTT computations).
sage: Fp = GF(MODULUS)
sage: g = Fp(7277203076849721926)
sage: g^(2^32)
1
sage: [int(g^(2^i) == 1) for i in range(1,32)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
§const MODULUS_BITS: u32 = 64u32
const MODULUS_BITS: u32 = 64u32
Self::MODULUS
.§fn get_modulus_le_bytes() -> Vec<u8, Global> ⓘ
fn get_modulus_le_bytes() -> Vec<u8, Global> ⓘ
§fn as_int(&self) -> <BaseElement as FieldElement>::PositiveInteger
fn as_int(&self) -> <BaseElement as FieldElement>::PositiveInteger
§fn get_root_of_unity(n: u32) -> Self
fn get_root_of_unity(n: u32) -> Self
n
. Read more§impl Sub<BaseElement> for BaseElement
impl Sub<BaseElement> for BaseElement
§type Output = BaseElement
type Output = BaseElement
-
operator.§fn sub(self, rhs: BaseElement) -> BaseElement
fn sub(self, rhs: BaseElement) -> BaseElement
-
operation. Read more§impl SubAssign<BaseElement> for BaseElement
impl SubAssign<BaseElement> for BaseElement
§fn sub_assign(&mut self, rhs: BaseElement)
fn sub_assign(&mut self, rhs: BaseElement)
-=
operation. Read moresource§impl ToElements<BaseElement> for PublicInputs
impl ToElements<BaseElement> for PublicInputs
fn to_elements(&self) -> Vec<Felt>
§impl<'a> TryFrom<&'a [u8]> for BaseElement
impl<'a> TryFrom<&'a [u8]> for BaseElement
§fn try_from(
bytes: &[u8]
) -> Result<BaseElement, <BaseElement as TryFrom<&'a [u8]>>::Error>
fn try_from( bytes: &[u8] ) -> Result<BaseElement, <BaseElement as TryFrom<&'a [u8]>>::Error>
Converts a slice of bytes into a field element; returns error if the value encoded in bytes is not a valid field element. The bytes are assumed to encode the element in the canonical representation in little-endian byte order.