poulpy/math/src/poly.rs
math/src/poly.rsRaw
1pub mod poly;
2
3#[derive(Clone, Debug, PartialEq, Eq)]
4pub struct Poly<O>(pub Vec<O>);
5
6impl<O> Poly<O>where
7 O: Default + Clone,
8 {
9 pub fn new(n: usize) -> Self{
10 Self(vec![O::default();n])
11 }
12
13 pub fn buffer_size(&self) -> usize{
14 return self.0.len()
15 }
16
17 pub fn from_buffer(&mut self, n: usize, buf: &mut [O]){
18 assert!(buf.len() >= n, "invalid buffer: buf.len()={} < n={}", buf.len(), n);
19 self.0 = Vec::from(&buf[..n]);
20 }
21
22 pub fn n(&self) -> usize{
23 return self.0.len()
24 }
25}
26
27#[derive(Clone, Debug, PartialEq, Eq)]
28pub struct PolyRNS<O>(pub Vec<Poly<O>>);
29
30impl<O> PolyRNS<O>where
31 O: Default + Clone,
32 {
33 pub fn new(n: usize) -> Self{
34 Self(vec![Poly::<O>::new(n);n])
35 }
36
37 pub fn n(&self) -> usize{
38 self.0[0].n()
39 }
40
41 pub fn level(&self) -> usize{
42 self.0.len()-1
43 }
44
45 pub fn buffer_size(&self) -> usize{
46 self.n() * (self.level()+1)
47 }
48
49 pub fn from_buffer(&mut self, n: usize, level: usize, buf: &mut [O]){
50 assert!(buf.len() >= n * (level+1), "invalid buffer: buf.len()={} < n * (level+1)={}", buf.len(), level+1);
51 self.0.clear();
52 for chunk in buf.chunks_mut(n).take(level+1) {
53 let mut poly: Poly<O> = Poly(Vec::new());
54 poly.from_buffer(n, chunk);
55 self.0.push(poly);
56 }
57 }
58}