use crate::params::{Q_I16, Q_I32};
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
pub fn montgomery_reduce(x: i32) -> i16 {
const QPRIME: i32 = 62209;
let m = x.wrapping_mul(QPRIME) as i16;
let t = (x - i32::from(m).wrapping_mul(Q_I32)) >> 16;
t as i16
}
pub fn mont_form(x: i16) -> i16 {
const R_SQUARED_MOD_Q: i32 = 1353;
montgomery_reduce(i32::from(x) * R_SQUARED_MOD_Q)
}
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
pub fn barrett_reduce(x: i16) -> i16 {
const APPROXIMATION: i32 = 20159;
let inside_floor = (i32::from(x).wrapping_mul(APPROXIMATION) >> 26) as i16;
x.wrapping_sub(inside_floor.wrapping_mul(Q_I16))
}
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
pub const fn conditional_sub_q(x: i16) -> i16 {
const Q_16: i16 = Q_I16;
if x < Q_16 {
x
} else {
let mut result = x - Q_16;
result += (result >> 15) & Q_16;
result
}
}