binius_field/
extension.rs1use std::{
4 iter,
5 ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign},
6};
7
8use super::Field;
9
10pub trait ExtensionField<F: Field>:
11 Field
12 + From<F>
13 + TryInto<F>
14 + Add<F, Output = Self>
15 + Sub<F, Output = Self>
16 + Mul<F, Output = Self>
17 + AddAssign<F>
18 + SubAssign<F>
19 + MulAssign<F>
20{
21 const LOG_DEGREE: usize;
23
24 const DEGREE: usize = 1 << Self::LOG_DEGREE;
28
29 fn basis(i: usize) -> Self;
35
36 #[inline]
44 fn from_bases(base_elems: impl IntoIterator<Item = F>) -> Self {
45 Self::from_bases_sparse(base_elems, 0)
46 }
47
48 fn from_bases_sparse(base_elems: impl IntoIterator<Item = F>, log_stride: usize) -> Self;
60
61 fn iter_bases(&self) -> impl Iterator<Item = F>;
63
64 fn into_iter_bases(self) -> impl Iterator<Item = F>;
66
67 #[inline]
69 fn get_base(&self, i: usize) -> F {
70 assert!(i < Self::DEGREE, "index out of bounds");
71 unsafe { self.get_base_unchecked(i) }
72 }
73
74 unsafe fn get_base_unchecked(&self, i: usize) -> F;
79
80 fn square_transpose(values: &mut [Self]);
86}
87
88impl<F: Field> ExtensionField<F> for F {
89 const LOG_DEGREE: usize = 0;
90
91 #[inline(always)]
92 fn basis(i: usize) -> Self {
93 assert!(i == 0, "index {i} out of range for degree 1");
94 Self::ONE
95 }
96
97 #[inline(always)]
98 fn from_bases_sparse(base_elems: impl IntoIterator<Item = F>, log_stride: usize) -> Self {
99 assert!(log_stride == 0, "log_stride must be 0 for degree-1 extension");
100 let mut base_elems = base_elems.into_iter();
101 base_elems.next().unwrap_or(Self::ZERO)
102 }
103
104 #[inline(always)]
105 fn iter_bases(&self) -> impl Iterator<Item = F> {
106 iter::once(*self)
107 }
108
109 #[inline(always)]
110 fn into_iter_bases(self) -> impl Iterator<Item = F> {
111 iter::once(self)
112 }
113
114 #[inline(always)]
115 unsafe fn get_base_unchecked(&self, i: usize) -> F {
116 debug_assert_eq!(i, 0);
117 *self
118 }
119
120 #[inline]
121 fn square_transpose(values: &mut [Self]) {
122 assert!(values.len() == 1, "values.len() must be 1 for degree-1 extension");
123 }
124}