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}