#[cfg(doc)]
use crate::modular::{ConstMontyForm, ConstMontyParams, ConstPrimeMontyParams};
#[macro_export]
macro_rules! const_monty_params {
($name:ident, $uint_type:ty, $value:expr) => {
$crate::const_monty_params!(
$name,
$uint_type,
$value,
"Modulus which impls `ConstMontyParams`"
);
};
($name:ident, $uint_type:ty, $value:expr, $doc:expr) => {
#[doc = $doc]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct $name;
impl $crate::modular::ConstMontyParams<{ <$uint_type>::LIMBS }> for $name {
const LIMBS: usize = <$uint_type>::LIMBS;
const PARAMS: $crate::modular::FixedMontyParams<{ <$uint_type>::LIMBS }> =
$crate::modular::FixedMontyParams::new_vartime(
$crate::Odd::<$uint_type>::from_be_hex($value),
);
}
};
}
#[macro_export]
macro_rules! const_prime_monty_params {
($name:ident, $uint_type:ty, $value:expr, $generator:literal) => {
$crate::const_prime_monty_params!(
$name,
$uint_type,
$value,
$generator,
"Modulus which impls `ConstPrimeMontyParams`"
);
};
($name:ident, $uint_type:ty, $value:expr, $generator:literal, $doc:expr) => {
$crate::const_monty_params!($name, $uint_type, $value, $doc);
impl $crate::modular::ConstPrimeMontyParams<{ <$uint_type>::LIMBS }> for $name {
const PRIME_PARAMS: $crate::modular::PrimeParams<{ <$uint_type>::LIMBS }> =
$crate::modular::PrimeParams::new_vartime(
&<$name as $crate::modular::ConstMontyParams<{ <$uint_type>::LIMBS }>>::PARAMS,
$generator,
);
}
};
}
#[macro_export]
macro_rules! const_monty_form {
($name:ident, $modulus:ident) => {
$crate::const_monty_form!(
$name,
$modulus,
"Type alias for `ConstMontyForm` specialized for a particular modulus"
);
};
($name:ident, $modulus:ident, $doc:expr) => {
#[doc = $doc]
pub type $name = $crate::modular::ConstMontyForm<$modulus, { $modulus::LIMBS }>;
};
}
#[deprecated(since = "0.7.0", note = "use `const_monty_params!` instead")]
#[macro_export]
macro_rules! impl_modulus {
($name:ident, $uint_type:ty, $value:expr) => {
$crate::const_monty_params!(
$name,
$uint_type,
$value,
"Modulus which impls `ConstMontyParams`"
);
};
($name:ident, $uint_type:ty, $value:expr, $doc:expr) => {
$crate::const_monty_params!($name, $uint_type, $value, $doc);
};
}
#[cfg(test)]
mod tests {
use crate::modular::ConstMontyParams;
use crate::{Limb, U64};
#[test]
fn new_params_with_valid_modulus() {
const_monty_params!(Mod, U64, "0000000000000003");
assert_eq!(
Mod::PARAMS.mod_leading_zeros,
core::cmp::min(Limb::BITS - 1, 62)
);
}
#[test]
#[allow(deprecated)]
fn impl_modulus_with_valid_modulus() {
impl_modulus!(Mod, U64, "0000000000000003");
assert_eq!(
Mod::PARAMS.mod_leading_zeros,
core::cmp::min(Limb::BITS - 1, 62)
);
}
}