use super::trapdoor_distribution::{
PlusMinusOneZero, TrapdoorDistribution, TrapdoorDistributionRing,
};
use crate::{
sample::g_trapdoor::trapdoor_distribution::SampleZ, utils::common_moduli::new_anticyclic,
};
use qfall_math::{
integer::Z,
integer_mod_q::{Modulus, ModulusPolynomialRingZq},
traits::Pow,
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
pub struct GadgetParameters {
pub n: Z,
pub k: Z,
pub m_bar: Z,
pub base: Z,
pub q: Modulus,
pub distribution: Box<dyn TrapdoorDistribution>,
}
#[derive(Serialize, Deserialize)]
pub struct GadgetParametersRing {
pub n: Z,
pub k: Z,
pub m_bar: Z,
pub base: Z,
pub modulus: ModulusPolynomialRingZq,
pub distribution: Box<dyn TrapdoorDistributionRing>,
}
impl GadgetParameters {
pub fn init_default(n: impl Into<Z>, q: impl Into<Modulus>) -> Self {
let q = q.into();
let n: Z = n.into();
assert!(n >= Z::ONE && n <= i64::MAX);
let base = Z::from(2);
let log_q = Z::from(&q).log_ceil(&base).unwrap();
let n_log_q = &n * &log_q;
let log_n = n.log_ceil(&base).unwrap();
let m_bar = &n_log_q + &log_n.pow(2).unwrap();
Self {
n,
k: log_q,
m_bar,
base,
q,
distribution: Box::new(PlusMinusOneZero),
}
}
}
impl GadgetParametersRing {
pub fn init_default(n: impl Into<Z>, q: impl Into<Modulus>) -> Self {
let q = q.into();
let n = n.into();
assert!(n >= Z::ONE && n <= i64::MAX);
let base = Z::from(2);
let log_q = Z::from(&q).log_ceil(&base).unwrap();
let poly_mod = new_anticyclic(&n, &q).unwrap();
Self {
n,
k: log_q.clone(),
m_bar: log_q + 2,
base,
modulus: poly_mod,
distribution: Box::new(SampleZ),
}
}
}
#[cfg(test)]
mod test_default_parameter {
use crate::sample::g_trapdoor::gadget_parameters::GadgetParameters;
use qfall_math::{integer::Z, integer_mod_q::Modulus, traits::Pow};
#[test]
fn default_unchanged() {
for n in [5, 10, 50, 100] {
for k in [5, 10, 25] {
let q = 2_i64.pow(k);
let n_log_2_pow_2 = Z::from(n).log_ceil(2).unwrap().pow(2).unwrap();
let m_bar = n * k + n_log_2_pow_2;
let gp = GadgetParameters::init_default(n, q);
assert_eq!(Z::from(2), gp.base);
assert_eq!(Z::from(k), gp.k);
assert_eq!(m_bar, gp.m_bar);
assert_eq!(Z::from(n), gp.n);
assert_eq!(Modulus::from(q), gp.q);
}
}
}
}