arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/math/src/ring/impl_u64/ring.rs
math/src/ring/impl_u64/ring.rsRaw
  1use crate::ring::Ring;
  2use crate::dft::ntt::Table;
  3use crate::modulus::prime::Prime;
  4use crate::modulus::montgomery::Montgomery;
  5use crate::poly::Poly;
  6use crate::modulus::REDUCEMOD;
  7use crate::modulus::VecOperations;
  8use crate::CHUNK;
  9
 10impl Ring<u64>{
 11    pub fn new(n:usize, q_base:u64, q_power:usize) -> Self{
 12        let prime: Prime<u64> = Prime::<u64>::new(q_base, q_power);
 13        Self {
 14            n: n,
 15            modulus: prime.clone(),
 16            dft: Box::new(Table::<u64>::new(prime, (2 * n) as u64)),
 17        }
 18    }
 19
 20    pub fn n(&self) -> usize{
 21        return self.n
 22    }
 23
 24    pub fn new_poly(&self) -> Poly<u64>{
 25        Poly::<u64>::new(self.n())
 26    }
 27}
 28
 29impl Ring<u64>{
 30    pub fn ntt_inplace<const LAZY:bool>(&self, poly: &mut Poly<u64>){
 31        match LAZY{
 32            true => self.dft.forward_inplace_lazy(&mut poly.0),
 33            false => self.dft.forward_inplace(&mut poly.0)
 34        }
 35    }
 36
 37    pub fn intt_inplace<const LAZY:bool>(&self, poly: &mut Poly<u64>){
 38        match LAZY{
 39            true => self.dft.forward_inplace_lazy(&mut poly.0),
 40            false => self.dft.forward_inplace(&mut poly.0)
 41        }
 42    }
 43
 44    pub fn ntt<const LAZY:bool>(&self, poly_in: &Poly<u64>, poly_out: &mut Poly<u64>){
 45        poly_out.0.copy_from_slice(&poly_in.0);
 46        match LAZY{
 47            true => self.dft.backward_inplace_lazy(&mut poly_out.0),
 48            false => self.dft.backward_inplace(&mut poly_out.0)
 49        }
 50    }
 51
 52    pub fn intt<const LAZY:bool>(&self, poly_in: &Poly<u64>, poly_out: &mut Poly<u64>){
 53        poly_out.0.copy_from_slice(&poly_in.0);
 54        match LAZY{
 55            true => self.dft.backward_inplace_lazy(&mut poly_out.0),
 56            false => self.dft.backward_inplace(&mut poly_out.0)
 57        }
 58    }
 59}
 60
 61impl Ring<u64>{
 62
 63    #[inline(always)]
 64    pub fn add_inplace<const REDUCE: REDUCEMOD>(&self, a: &Poly<u64>, b: &mut Poly<u64>){
 65        self.modulus.vec_add_unary_assign::<CHUNK, REDUCE>(&a.0, &mut b.0);
 66    }
 67
 68    #[inline(always)]
 69    pub fn add<const REDUCE: REDUCEMOD>(&self, a: &Poly<u64>, b: &Poly<u64>, c: &mut Poly<u64>){
 70        self.modulus.vec_add_binary_assign::<CHUNK, REDUCE>(&a.0, &b.0, &mut c.0);
 71    }
 72
 73    #[inline(always)]
 74    pub fn sub_inplace<const REDUCE: REDUCEMOD>(&self, a: &Poly<u64>, b: &mut Poly<u64>){
 75        self.modulus.vec_sub_unary_assign::<CHUNK, REDUCE>(&a.0, &mut b.0);
 76    }
 77
 78    #[inline(always)]
 79    pub fn sub<const REDUCE: REDUCEMOD>(&self, a: &Poly<u64>, b: &Poly<u64>, c: &mut Poly<u64>){
 80        self.modulus.vec_sub_binary_assign::<CHUNK, REDUCE>(&a.0, &b.0, &mut c.0);
 81    }
 82
 83    #[inline(always)]
 84    pub fn neg<const REDUCE: REDUCEMOD>(&self, a: &Poly<u64>, b: &mut Poly<u64>){
 85        self.modulus.vec_neg_binary_assign::<CHUNK, REDUCE>(&a.0, &mut b.0);
 86    }
 87
 88    #[inline(always)]
 89    pub fn neg_inplace<const REDUCE: REDUCEMOD>(&self, a: &mut Poly<u64>){
 90        self.modulus.vec_neg_unary_assign::<CHUNK, REDUCE>(&mut a.0);
 91    }
 92
 93    #[inline(always)]
 94    pub fn  mul_montgomery_external<const REDUCE:REDUCEMOD>(&self, a:&Poly<Montgomery<u64>>, b:&Poly<u64>, c: &mut Poly<u64>){
 95        self.modulus.vec_mul_montgomery_external_binary_assign::<CHUNK, REDUCE>(&a.0, &b.0, &mut c.0);
 96    }
 97
 98    #[inline(always)]
 99    pub fn mul_montgomery_external_inplace<const REDUCE:REDUCEMOD>(&self, a:&Poly<Montgomery<u64>>, b:&mut Poly<u64>){
100        self.modulus.vec_mul_montgomery_external_unary_assign::<CHUNK, REDUCE>(&a.0, &mut b.0);
101    }
102}