use crate::{
error::MathError,
integer::Z,
integer_mod_q::{Modulus, Zq},
rational::Q,
utils::sample::binomial::BinomialSampler,
};
impl Zq {
pub fn sample_binomial(
modulus: impl Into<Modulus>,
n: impl Into<Z>,
p: impl Into<Q>,
) -> Result<Self, MathError> {
let modulus: Modulus = modulus.into();
let mut bin_sampler = BinomialSampler::init(n, p)?;
let sample = bin_sampler.sample();
Ok(Zq::from((sample, modulus)))
}
}
#[cfg(test)]
mod test_sample_binomial {
use super::{Q, Z, Zq};
#[test]
fn availability() {
let _ = Zq::sample_binomial(7u8, 1u16, 7u8);
let _ = Zq::sample_binomial(7u16, 1u32, 7u16);
let _ = Zq::sample_binomial(7u32, 1u64, 7u32);
let _ = Zq::sample_binomial(7u64, 1i8, 7u64);
let _ = Zq::sample_binomial(7i8, 1i16, 7i8);
let _ = Zq::sample_binomial(7i16, 1i32, 7i16);
let _ = Zq::sample_binomial(7i32, 1i64, 7i32);
let _ = Zq::sample_binomial(7i64, Z::ONE, 7i64);
let _ = Zq::sample_binomial(7, 1u8, 0.5f32);
let _ = Zq::sample_binomial(7, 1u8, 0.5f64);
let _ = Zq::sample_binomial(7, 1, Q::from((1, 2)));
}
}