arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/math/src/ring/impl_u64/trace.rs
math/src/ring/impl_u64/trace.rsRaw
 1use crate::ring::Ring;
 2use crate::poly::Poly;
 3use crate::modulus::barrett::Barrett;
 4use crate::modulus::ONCE;
 5
 6impl Ring<u64>{
 7    pub fn trace_inplace<const NTT:bool>(&self, log_start: usize, log_end: usize, a: &mut Poly<u64>){
 8        assert!(log_end <= self.log_n(), "invalid argument log_end: log_end={} > self.log_n()={}", log_end, self.log_n());
 9        assert!(log_end > log_start, "invalid argument log_start: log_start={} > log_end={}", log_start, log_end);
10
11        let log_steps = log_end - log_start;
12
13        if log_steps > 0 {
14            let n_inv: Barrett<u64> = self.modulus.barrett.prepare(self.modulus.inv(1<<log_steps));
15            self.a_mul_b_scalar_barrett_into_a::<ONCE>(&n_inv, a);
16
17            if !NTT{
18                self.ntt_inplace::<false>(a);
19            }
20
21            let mut tmp: Poly<u64> = self.new_poly();
22
23            (log_start..log_end).for_each(|i|{
24
25            });
26        }
27
28        
29
30        
31    }
32}