arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}