Skip to content

Commit 6d33b3c

Browse files
authored
fp: refactor from_base_prime_field_elems (#965)
* fp: refactor from_base_prime_field_elems * more refactor
1 parent cae69c5 commit 6d33b3c

File tree

3 files changed

+17
-31
lines changed

3 files changed

+17
-31
lines changed

ff/src/fields/models/cubic_extension.rs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -205,19 +205,14 @@ impl<P: CubicExtConfig> Field for CubicExtField<P> {
205205
fn from_base_prime_field_elems(
206206
elems: impl IntoIterator<Item = Self::BasePrimeField>,
207207
) -> Option<Self> {
208-
let mut elems = elems.into_iter();
209-
let elems = elems.by_ref();
210-
let base_ext_deg = P::BaseField::extension_degree() as usize;
211-
let element = Some(Self::new(
212-
P::BaseField::from_base_prime_field_elems(elems.take(base_ext_deg))?,
213-
P::BaseField::from_base_prime_field_elems(elems.take(base_ext_deg))?,
214-
P::BaseField::from_base_prime_field_elems(elems.take(base_ext_deg))?,
215-
));
216-
if elems.next().is_some() {
217-
None
218-
} else {
219-
element
220-
}
208+
let mut iter = elems.into_iter();
209+
let d = P::BaseField::extension_degree() as usize;
210+
211+
let a = P::BaseField::from_base_prime_field_elems(iter.by_ref().take(d))?;
212+
let b = P::BaseField::from_base_prime_field_elems(iter.by_ref().take(d))?;
213+
let c = P::BaseField::from_base_prime_field_elems(iter.by_ref().take(d))?;
214+
215+
iter.next().is_none().then(|| Self::new(a, b, c))
221216
}
222217

223218
#[inline]

ff/src/fields/models/fp/mod.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use ark_std::{
1515
string::*,
1616
};
1717
use core::iter;
18+
use itertools::Itertools;
1819

1920
#[macro_use]
2021
mod montgomery_backend;
@@ -226,12 +227,7 @@ impl<P: FpConfig<N>, const N: usize> Field for Fp<P, N> {
226227
fn from_base_prime_field_elems(
227228
elems: impl IntoIterator<Item = Self::BasePrimeField>,
228229
) -> Option<Self> {
229-
let mut elems = elems.into_iter();
230-
let elem = elems.next()?;
231-
if elems.next().is_some() {
232-
return None;
233-
}
234-
Some(elem)
230+
elems.into_iter().exactly_one().ok()
235231
}
236232

237233
#[inline]

ff/src/fields/models/quadratic_extension.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -230,18 +230,13 @@ impl<P: QuadExtConfig> Field for QuadExtField<P> {
230230
fn from_base_prime_field_elems(
231231
elems: impl IntoIterator<Item = Self::BasePrimeField>,
232232
) -> Option<Self> {
233-
let mut elems = elems.into_iter();
234-
let elems = elems.by_ref();
235-
let base_ext_deg = P::BaseField::extension_degree() as usize;
236-
let element = Some(Self::new(
237-
P::BaseField::from_base_prime_field_elems(elems.take(base_ext_deg))?,
238-
P::BaseField::from_base_prime_field_elems(elems.take(base_ext_deg))?,
239-
));
240-
if elems.next().is_some() {
241-
None
242-
} else {
243-
element
244-
}
233+
let mut iter = elems.into_iter();
234+
let d = P::BaseField::extension_degree() as usize;
235+
236+
let a = P::BaseField::from_base_prime_field_elems(iter.by_ref().take(d))?;
237+
let b = P::BaseField::from_base_prime_field_elems(iter.by_ref().take(d))?;
238+
239+
iter.next().is_none().then(|| Self::new(a, b))
245240
}
246241

247242
fn square(&self) -> Self {

0 commit comments

Comments
 (0)