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
34    pub fn new(n: usize, level: usize) -> Self{
35        let mut polyrns: PolyRNS<O> = PolyRNS::<O>::default();
36        let mut buf: Vec<O> = vec![O::default();polyrns.buffer_size(n, level)];
37        polyrns.from_buffer(n, level, &mut buf[..]);
38        polyrns
39    }
40
41    pub fn n(&self) -> usize{
42        self.0[0].n()
43    }
44
45    pub fn level(&self) -> usize{
46        self.0.len()-1
47    }
48
49    pub fn buffer_size(&self, n: usize, level:usize) -> usize{
50        n * (level+1)
51    }
52
53    pub fn from_buffer(&mut self, n: usize, level: usize, buf: &mut [O]){
54        assert!(buf.len() >= n * (level+1), "invalid buffer: buf.len()={} < n * (level+1)={}", buf.len(), level+1);
55        self.0.clear();
56        for chunk in buf.chunks_mut(n).take(level+1) {
57            let mut poly: Poly<O> = Poly(Vec::new());
58            poly.from_buffer(n, chunk);
59            self.0.push(poly);
60        }
61    }
62
63    pub fn at(&self, level:usize) -> &Poly<O>{
64        &self.0[level]
65    }
66
67    pub fn at_mut(&mut self, level:usize) -> &mut Poly<O>{
68        &mut self.0[level]
69    }
70}
71
72impl<O> Default for PolyRNS<O>{
73    fn default() -> Self{
74        let polys:Vec<Poly<O>> = Vec::new();
75        Self{0:polys}
76    }
77}