use crate::bignum::Uint;
use super::field::Fe;
fn narrow(a: &Uint<15>) -> Fe {
let l = a.as_limbs();
Uint::from_limbs([l[0], l[1], l[2], l[3], l[4], l[5], l[6]])
}
fn widen(a: &Fe) -> Uint<15> {
let l = a.as_limbs();
Uint::from_limbs([
l[0], l[1], l[2], l[3], l[4], l[5], l[6], 0, 0, 0, 0, 0, 0, 0, 0,
])
}
pub(crate) fn scalar_reduce_wide(bytes: &[u8; 114], l15: &Uint<15>) -> Fe {
narrow(&Uint::<15>::from_le_bytes(bytes).reduce(l15))
}
pub(crate) fn scalar_muladd(r: &Fe, k: &Fe, a: &Fe, l15: &Uint<15>) -> Fe {
let (lo, hi) = k.mul_wide(a); let lo = lo.as_limbs();
let hi = hi.as_limbs();
let prod = Uint::<15>::from_limbs([
lo[0], lo[1], lo[2], lo[3], lo[4], lo[5], lo[6], hi[0], hi[1], hi[2], hi[3], hi[4], hi[5],
hi[6], 0,
]);
let (sum, _) = prod.adc(&widen(r), 0);
narrow(&sum.reduce(l15))
}
pub(crate) fn prune(b: &mut [u8; 57]) {
b[0] &= 0xFC;
b[55] |= 0x80;
b[56] = 0;
}