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}