use num_bigint::BigUint;
use p3_field::{PrimeField, PrimeField32};
pub(crate) fn checked_num_packed_f_elms<F: PrimeField32, SF: PrimeField>() -> usize {
assert!(
F::order() < SF::order(),
"F::order() must be less than SF::order()"
);
let num_f_elms = SF::bits() / F::bits();
let max_packed = BigUint::from(1u64) << (F::bits() * num_f_elms);
assert!(
max_packed <= SF::order(),
"SF::order() too small for injective base-2^{} packing of {} F elements",
F::bits(),
num_f_elms,
);
num_f_elms
}
pub fn pack_f_to_sf<F: PrimeField32, SF: PrimeField>(buf: &[F]) -> SF {
let base = SF::from_int(1u64 << F::bits());
buf.iter().rev().fold(SF::ZERO, |acc, val| {
acc * base + SF::from_int(val.as_canonical_u32())
})
}