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}