pub struct Ghash128(/* private fields */);Expand description
The binary field GF(2^128) modulo x^128 + x^7 + x^2 + x + 1.
Bit i stores the coefficient of x^i. Every 128-bit pattern is a distinct field element.
Hardware carryless multiplication operates directly on this representation. The tower representation instead provides byte-aligned subfields.
Inversion and conversions to or from the tower use operand-indexed tables. They are not constant-time for secret inputs.
NIST GCM blocks use the opposite coefficient order. Reverse all 128 bits of a big-endian block integer before interpreting it here.
Implementations§
Source§impl Ghash128
impl Ghash128
Sourcepub fn from_tower_vec(values: Vec<BinaryField128>) -> Vec<Self>
pub fn from_tower_vec(values: Vec<BinaryField128>) -> Vec<Self>
A whole table of tower elements, seen in the polynomial basis, in the table’s own buffer.
Each entry becomes what From makes of it.
Chunks of the table convert in parallel, a block at a time where the build has the
blocked kernel crate::poly_basis::from_tower_slice describes.
Sourcepub fn try_apply_linear_map_into(
images: &[Self; 128],
input: &[BinaryField128],
output: &mut [Self],
) -> bool
pub fn try_apply_linear_map_into( images: &[Self; 128], input: &[BinaryField128], output: &mut [Self], ) -> bool
Tries to apply an arbitrary F_2-linear map, given by its column images, to a batch.
images[j] is the output image of input bit j, in the little-endian coordinate order.
The map need not be a change of basis: any linear map, invertible or not, is applied to the
raw bits of each input.
A short or unsupported target returns false without touching output; equal lengths are
required before that dispatch so an invalid call cannot be mistaken for a refusal.
Sourcepub const fn from_le_bytes(bytes: [u8; 16]) -> Self
pub const fn from_le_bytes(bytes: [u8; 16]) -> Self
Construct a field element from its little-endian byte representation.
Every byte string of this length is a valid element.
Sourcepub fn dot_powers_of_x(values: &[Self]) -> Self
pub fn dot_powers_of_x(values: &[Self]) -> Self
Combine values against the successive powers of the indeterminate.
sum_k values_k * x^kIn this representation a power of the indeterminate shifts the coefficients up.
So the combination can be shifts and exclusive ors, with no multiplication at all.
Either way the modulus is folded in once at the end, not once per term.
Which route is faster depends on the target.
A hardware carryless multiply turns each term into one cheap product, and beats the shifts.
Without one a product costs sixteen integer multiplies, and the shifts win by an order of magnitude.
The choice is made at compile time from the same flag the rest of the crate reads.
§Panics
Panics on more values than the field has bits.
That ceiling is where the last shift would leave the word.
Sourcepub fn invert_or_zero(self) -> Self
pub fn invert_or_zero(self) -> Self
The inverse of this element, with zero sent to zero.
On a carryless-multiply target the addition chain runs whatever the operand is, so its cost says nothing about the value. The operand-indexed tables it uses still make it variable-time.
Trait Implementations§
Source§impl Add<BinaryField8> for Ghash128
impl Add<BinaryField8> for Ghash128
Source§impl Add<BinaryField16> for Ghash128
impl Add<BinaryField16> for Ghash128
Source§impl Add<BinaryField32> for Ghash128
impl Add<BinaryField32> for Ghash128
Source§impl Add<BinaryField64> for Ghash128
impl Add<BinaryField64> for Ghash128
Source§impl Add<BinaryField128> for Ghash128
impl Add<BinaryField128> for Ghash128
Source§impl Add<Ghash128> for BinaryField8
impl Add<Ghash128> for BinaryField8
Source§impl Add<Ghash128> for BinaryField16
impl Add<Ghash128> for BinaryField16
Source§impl Add<Ghash128> for BinaryField32
impl Add<Ghash128> for BinaryField32
Source§impl Add<Ghash128> for BinaryField64
impl Add<Ghash128> for BinaryField64
Source§impl<T: Into<Self>> AddAssign<T> for Ghash128
impl<T: Into<Self>> AddAssign<T> for Ghash128
Source§fn add_assign(&mut self, rhs: T)
fn add_assign(&mut self, rhs: T)
+= operation. Read moreSource§impl Algebra<BinaryField8> for Ghash128
impl Algebra<BinaryField8> for Ghash128
Source§fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
Source§fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
Source§const BATCHED_LC_CHUNK: usize = 8
const BATCHED_LC_CHUNK: usize = 8
batched_linear_combination. Read moreSource§impl Algebra<BinaryField16> for Ghash128
impl Algebra<BinaryField16> for Ghash128
Source§fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
Source§fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
Source§const BATCHED_LC_CHUNK: usize = 8
const BATCHED_LC_CHUNK: usize = 8
batched_linear_combination. Read moreSource§impl Algebra<BinaryField32> for Ghash128
impl Algebra<BinaryField32> for Ghash128
Source§fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
Source§fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
Source§const BATCHED_LC_CHUNK: usize = 8
const BATCHED_LC_CHUNK: usize = 8
batched_linear_combination. Read moreSource§impl Algebra<BinaryField64> for Ghash128
impl Algebra<BinaryField64> for Ghash128
Source§fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
Source§fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
Source§const BATCHED_LC_CHUNK: usize = 8
const BATCHED_LC_CHUNK: usize = 8
batched_linear_combination. Read moreSource§impl Algebra<BinaryField128> for Ghash128
impl Algebra<BinaryField128> for Ghash128
Source§fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
Source§fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
Source§const BATCHED_LC_CHUNK: usize = 8
const BATCHED_LC_CHUNK: usize = 8
batched_linear_combination. Read moreSource§impl Algebra<Gf2> for Ghash128
impl Algebra<Gf2> for Ghash128
Source§fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
Source§fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
fn mixed_dot_product<const N: usize>(a: &[Self; N], f: &[F; N]) -> Selfwhere
F: Dup,
Source§const BATCHED_LC_CHUNK: usize = 8
const BATCHED_LC_CHUNK: usize = 8
batched_linear_combination. Read moreimpl Copy for Ghash128
Source§impl<'de> Deserialize<'de> for Ghash128
impl<'de> Deserialize<'de> for Ghash128
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Distribution<Ghash128> for StandardUniform
impl Distribution<Ghash128> for StandardUniform
Source§impl DivAssign for Ghash128
impl DivAssign for Ghash128
Source§fn div_assign(&mut self, rhs: Ghash128)
fn div_assign(&mut self, rhs: Ghash128)
/= operation. Read moreimpl Eq for Ghash128
Source§impl Field for Ghash128
impl Field for Ghash128
Source§fn try_inverse(&self) -> Option<Self>
fn try_inverse(&self) -> Option<Self>
Invert through precomputed squaring maps on carryless-multiply targets. The software backend instead uses the recursive tower norm.
The operand-indexed tables make this operation variable-time.
Source§fn interpolation_node(i: usize) -> Self
fn interpolation_node(i: usize) -> Self
The enumeration by bit pattern.
The coordinates of the returned element over GF(2) are the bits of the index.
A pointer is never 128 bits wide, so every index is in range.
type Packing = Ghash128
Source§fn try_sqrt(&self) -> Option<Self>
fn try_sqrt(&self) -> Option<Self>
Source§const BENEFITS_FROM_LOCKSTEP_EVALUATION: bool = false
const BENEFITS_FROM_LOCKSTEP_EVALUATION: bool = false
Source§fn is_zero(&self) -> bool
fn is_zero(&self) -> bool
Source§fn is_one(&self) -> bool
fn is_one(&self) -> bool
Source§fn add_slices(slice_1: &mut [Self], slice_2: &[Self])
fn add_slices(slice_1: &mut [Self], slice_2: &[Self])
Source§fn batched_columnwise_dot_product<EF, R, I, const N: usize>(
acc: &mut [<EF as ExtensionField<Self>>::ExtensionPacking],
items: I,
)where
EF: ExtensionField<Self>,
R: Iterator<Item = Self::Packing>,
I: Iterator<Item = (R, [EF; N])>,
fn batched_columnwise_dot_product<EF, R, I, const N: usize>(
acc: &mut [<EF as ExtensionField<Self>>::ExtensionPacking],
items: I,
)where
EF: ExtensionField<Self>,
R: Iterator<Item = Self::Packing>,
I: Iterator<Item = (R, [EF; N])>,
acc[c * N + j] += scales[j] * row[c] over a stream of packed rows. Read moreSource§impl From<BinaryField8> for Ghash128
impl From<BinaryField8> for Ghash128
Source§fn from(x: BinaryField8) -> Self
fn from(x: BinaryField8) -> Self
Source§impl From<BinaryField16> for Ghash128
impl From<BinaryField16> for Ghash128
Source§fn from(x: BinaryField16) -> Self
fn from(x: BinaryField16) -> Self
Source§impl From<BinaryField32> for Ghash128
impl From<BinaryField32> for Ghash128
Source§fn from(x: BinaryField32) -> Self
fn from(x: BinaryField32) -> Self
Source§impl From<BinaryField64> for Ghash128
impl From<BinaryField64> for Ghash128
Source§fn from(x: BinaryField64) -> Self
fn from(x: BinaryField64) -> Self
Source§impl From<BinaryField128> for Ghash128
impl From<BinaryField128> for Ghash128
Source§fn from(x: BinaryField128) -> Self
fn from(x: BinaryField128) -> Self
The same field element, seen in the polynomial basis.
Source§impl From<Ghash128> for BinaryField128
impl From<Ghash128> for BinaryField128
Source§impl Mul<BinaryField8> for Ghash128
impl Mul<BinaryField8> for Ghash128
Source§impl Mul<BinaryField16> for Ghash128
impl Mul<BinaryField16> for Ghash128
Source§impl Mul<BinaryField32> for Ghash128
impl Mul<BinaryField32> for Ghash128
Source§impl Mul<BinaryField64> for Ghash128
impl Mul<BinaryField64> for Ghash128
Source§impl Mul<BinaryField128> for Ghash128
impl Mul<BinaryField128> for Ghash128
Source§impl Mul<Ghash128> for BinaryField8
impl Mul<Ghash128> for BinaryField8
Source§impl Mul<Ghash128> for BinaryField16
impl Mul<Ghash128> for BinaryField16
Source§impl Mul<Ghash128> for BinaryField32
impl Mul<Ghash128> for BinaryField32
Source§impl Mul<Ghash128> for BinaryField64
impl Mul<Ghash128> for BinaryField64
Source§impl<T: Into<Self>> MulAssign<T> for Ghash128
impl<T: Into<Self>> MulAssign<T> for Ghash128
Source§fn mul_assign(&mut self, rhs: T)
fn mul_assign(&mut self, rhs: T)
*= operation. Read moreSource§impl Ord for Ghash128
impl Ord for Ghash128
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
impl Packable for Ghash128
Source§impl PartialOrd for Ghash128
impl PartialOrd for Ghash128
Source§impl PrimeCharacteristicRing for Ghash128
impl PrimeCharacteristicRing for Ghash128
Source§fn div_2exp_u64(&self, _exp: u64) -> Self
fn div_2exp_u64(&self, _exp: u64) -> Self
§Panics
Always panics: 2 is not invertible in characteristic 2.
Source§fn bool_check(&self) -> Self
fn bool_check(&self) -> Self
x·(x - 1) = x² - x = x² + x in characteristic 2, and poly_square_128 skips the
cross-term carryless multiplies a general product pays for.
Source§type PrimeSubfield = Gf2
type PrimeSubfield = Gf2
ℤ/p where the characteristic of this ring is p.Source§fn zero_vec(len: usize) -> Vec<Self>
fn zero_vec(len: usize) -> Vec<Self>
len. Many operating systems zero pages
before assigning them to a userspace process. In that case, our process should not need to
write zeros, which would be redundant. However, the compiler may not always recognize this. Read moreSource§fn from_prime_subfield(f: Self::PrimeSubfield) -> Self
fn from_prime_subfield(f: Self::PrimeSubfield) -> Self
Source§fn xor(&self, y: &Self) -> Self
fn xor(&self, y: &Self) -> Self
xor. Read moreSource§fn mul_2exp_u64(&self, exp: u64) -> Self
fn mul_2exp_u64(&self, exp: u64) -> Self
mul_2exp_u64(a, exp) = a * 2^{exp}. Read moreSource§fn dot_product<const N: usize>(u: &[Self; N], v: &[Self; N]) -> Self
fn dot_product<const N: usize>(u: &[Self; N], v: &[Self; N]) -> Self
Source§fn from_usize(int: usize) -> Self
fn from_usize(int: usize) -> Self
Source§fn from_isize(int: isize) -> Self
fn from_isize(int: isize) -> Self
Source§fn xor3(&self, y: &Self, z: &Self) -> Self
fn xor3(&self, y: &Self, z: &Self) -> Self
xor. Read moreSource§fn exp_const_u64<const POWER: u64>(&self) -> Self
fn exp_const_u64<const POWER: u64>(&self) -> Self
Source§fn exp_power_of_2(&self, power_log: usize) -> Self
fn exp_power_of_2(&self, power_log: usize) -> Self
exp_power_of_2(a, power_log) = a^{2^power_log}. Read moreSource§fn powers(&self) -> Powers<Self> ⓘ
fn powers(&self) -> Powers<Self> ⓘ
self: self^0, self^1, self^2, ....Source§fn shifted_powers(&self, start: Self) -> Powers<Self> ⓘ
fn shifted_powers(&self, start: Self) -> Powers<Self> ⓘ
self shifted by start: start, start*self^1, start*self^2, ....Source§impl RawDataSerializable for Ghash128
impl RawDataSerializable for Ghash128
Source§const NUM_BYTES: usize = 16
const NUM_BYTES: usize = 16
Source§fn into_bytes(self) -> impl IntoIterator<Item = u8>
fn into_bytes(self) -> impl IntoIterator<Item = u8>
Source§fn into_byte_stream(
input: impl IntoIterator<Item = Self>,
) -> impl IntoIterator<Item = u8>
fn into_byte_stream( input: impl IntoIterator<Item = Self>, ) -> impl IntoIterator<Item = u8>
Source§fn into_u32_stream(
input: impl IntoIterator<Item = Self>,
) -> impl IntoIterator<Item = u32>
fn into_u32_stream( input: impl IntoIterator<Item = Self>, ) -> impl IntoIterator<Item = u32>
Source§fn into_u64_stream(
input: impl IntoIterator<Item = Self>,
) -> impl IntoIterator<Item = u64>
fn into_u64_stream( input: impl IntoIterator<Item = Self>, ) -> impl IntoIterator<Item = u64>
Source§fn into_parallel_byte_streams<const N: usize>(
input: impl IntoIterator<Item = [Self; N]>,
) -> impl IntoIterator<Item = [u8; N]>
fn into_parallel_byte_streams<const N: usize>( input: impl IntoIterator<Item = [Self; N]>, ) -> impl IntoIterator<Item = [u8; N]>
Source§fn into_parallel_u32_streams<const N: usize>(
input: impl IntoIterator<Item = [Self; N]>,
) -> impl IntoIterator<Item = [u32; N]>
fn into_parallel_u32_streams<const N: usize>( input: impl IntoIterator<Item = [Self; N]>, ) -> impl IntoIterator<Item = [u32; N]>
Source§fn into_parallel_u64_streams<const N: usize>(
input: impl IntoIterator<Item = [Self; N]>,
) -> impl IntoIterator<Item = [u64; N]>
fn into_parallel_u64_streams<const N: usize>( input: impl IntoIterator<Item = [Self; N]>, ) -> impl IntoIterator<Item = [u64; N]>
impl StructuralPartialEq for Ghash128
Source§impl Sub<BinaryField8> for Ghash128
impl Sub<BinaryField8> for Ghash128
Source§impl Sub<BinaryField16> for Ghash128
impl Sub<BinaryField16> for Ghash128
Source§impl Sub<BinaryField32> for Ghash128
impl Sub<BinaryField32> for Ghash128
Source§impl Sub<BinaryField64> for Ghash128
impl Sub<BinaryField64> for Ghash128
Source§impl Sub<BinaryField128> for Ghash128
impl Sub<BinaryField128> for Ghash128
Source§impl Sub<Ghash128> for BinaryField8
impl Sub<Ghash128> for BinaryField8
Source§impl Sub<Ghash128> for BinaryField16
impl Sub<Ghash128> for BinaryField16
Source§impl Sub<Ghash128> for BinaryField32
impl Sub<Ghash128> for BinaryField32
Source§impl Sub<Ghash128> for BinaryField64
impl Sub<Ghash128> for BinaryField64
Source§impl<T: Into<Self>> SubAssign<T> for Ghash128
impl<T: Into<Self>> SubAssign<T> for Ghash128
Source§fn sub_assign(&mut self, rhs: T)
fn sub_assign(&mut self, rhs: T)
-= operation. Read moreSource§impl TowerLevel for Ghash128
impl TowerLevel for Ghash128
Source§fn mul_alpha(self) -> Self
fn mul_alpha(self) -> Self
That generator is a basis element in the tower, which gets this for a shift. Here it is an arbitrary element, so it costs a full product.
Source§fn from_le_byte_iter(bytes: impl Iterator<Item = u8>) -> Self
fn from_le_byte_iter(bytes: impl Iterator<Item = u8>) -> Self
§Panics
Panics if the stream ends before a whole element has been read.
Source§fn cantor_basis(i: usize) -> Self
fn cantor_basis(i: usize) -> Self
§Panics
Panics if the index is at least the bit width of the field.
Auto Trait Implementations§
impl Freeze for Ghash128
impl RefUnwindSafe for Ghash128
impl Send for Ghash128
impl Sync for Ghash128
impl Unpin for Ghash128
impl UnsafeUnpin for Ghash128
impl UnwindSafe for Ghash128
Blanket Implementations§
Source§impl<R> Algebra<R> for Rwhere
R: PrimeCharacteristicRing,
impl<R> Algebra<R> for Rwhere
R: PrimeCharacteristicRing,
Source§fn mixed_dot_product<const N: usize>(a: &[R; N], f: &[R; N]) -> R
fn mixed_dot_product<const N: usize>(a: &[R; N], f: &[R; N]) -> R
Source§fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
fn quadratic_extension_square(a: &[Self; 2], w: F) -> [Self; 2]
Source§const BATCHED_LC_CHUNK: usize = 8
const BATCHED_LC_CHUNK: usize = 8
batched_linear_combination. Read moreSource§impl<F> AlgebraIdentity<F> for Fwhere
F: PrimeCharacteristicRing,
impl<F> AlgebraIdentity<F> for Fwhere
F: PrimeCharacteristicRing,
Source§impl<F> BasedVectorSpace<F> for Fwhere
F: PrimeCharacteristicRing,
impl<F> BasedVectorSpace<F> for Fwhere
F: PrimeCharacteristicRing,
Source§const DIMENSION: usize = 1
const DIMENSION: usize = 1
Source§fn as_basis_coefficients_slice(&self) -> &[F]
fn as_basis_coefficients_slice(&self) -> &[F]
A and uses this to
map an element of A to a slice of DIMENSION F elements. Read moreSource§fn from_basis_coefficients_fn<Fn>(f: Fn) -> F
fn from_basis_coefficients_fn<Fn>(f: Fn) -> F
A and uses this to
map DIMENSION F elements to an element of A. Similar
to core:array::from_fn, the DIMENSION F elements are
given by Fn(0), ..., Fn(DIMENSION - 1) called in that order. Read moreSource§fn from_basis_coefficients_iter<I>(iter: I) -> Option<F>where
I: ExactSizeIterator<Item = F>,
fn from_basis_coefficients_iter<I>(iter: I) -> Option<F>where
I: ExactSizeIterator<Item = F>,
A and uses this to
map DIMENSION F elements to an element of A. Read moreSource§fn flatten_to_base(vec: Vec<F>) -> Vec<F>
fn flatten_to_base(vec: Vec<F>) -> Vec<F>
Source§fn reconstitute_from_base(vec: Vec<F>) -> Vec<F>
fn reconstitute_from_base(vec: Vec<F>) -> Vec<F>
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<F> ExtensionField<F> for Fwhere
F: Field,
impl<F> ExtensionField<F> for Fwhere
F: Field,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<F> PackedField for Fwhere
F: Field,
impl<F> PackedField for Fwhere
F: Field,
type Scalar = F
Source§fn packed_powers(base: Self::Scalar) -> Powers<Self> ⓘ
fn packed_powers(base: Self::Scalar) -> Powers<Self> ⓘ
base packed into packed field elements. Read more