arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/math/src/poly.rs
math/src/poly.rsRaw
  1pub mod poly;
  2use std::cmp::PartialEq;
  3
  4#[derive(Clone, Debug, Eq)]
  5pub struct Poly<O>(pub Vec<O>);
  6
  7impl<O> Poly<O>where
  8    O: Default + Clone + Copy,
  9    {
 10    pub fn new(n: usize) -> Self{
 11        Self(vec![O::default();n])
 12    }
 13
 14    pub fn buffer_size(&self) -> usize{
 15        return self.0.len()
 16    }
 17
 18    pub fn from_buffer(&mut self, n: usize, buf: &mut [O]){
 19        assert!(buf.len() >= n, "invalid buffer: buf.len()={} < n={}", buf.len(), n);
 20        self.0 = Vec::from(&buf[..n]);
 21    }
 22
 23    pub fn n(&self) -> usize{
 24        (usize::BITS - self.0.len().leading_zeros()) as usize
 25    }
 26
 27    pub fn log_n(&self) -> usize{
 28        self.0.len()-1
 29    }
 30
 31    pub fn resize(&mut self, n:usize){
 32        self.0.resize(n, O::default());
 33    }
 34
 35    pub fn set_all(&mut self, v: &O){
 36        self.0.fill(*v)
 37    }
 38
 39    pub fn zero(&mut self){
 40        self.set_all(&O::default())
 41    }
 42
 43    pub fn copy_from(&mut self, other: &Poly<O>){
 44        if std::ptr::eq(self, other){
 45            return
 46        }
 47        self.resize(other.n());
 48        self.0.copy_from_slice(&other.0)
 49    }
 50}
 51
 52impl<O: PartialEq> PartialEq for Poly<O> {
 53    fn eq(&self, other: &Self) -> bool {
 54        std::ptr::eq(self, other) || (self.0 == other.0)
 55    }
 56}
 57
 58#[derive(Clone, Debug, Eq)]
 59pub struct PolyRNS<O>(pub Vec<Poly<O>>);
 60
 61impl<O> PolyRNS<O>where
 62    O: Default + Clone + Copy,
 63    {
 64
 65    pub fn new(n: usize, level: usize) -> Self{
 66        let mut polyrns: PolyRNS<O> = PolyRNS::<O>::default();
 67        let mut buf: Vec<O> = vec![O::default();polyrns.buffer_size(n, level)];
 68        polyrns.from_buffer(n, level, &mut buf[..]);
 69        polyrns
 70    }
 71
 72    pub fn n(&self) -> usize{
 73        self.0[0].n()
 74    }
 75
 76    pub fn log_n(&self) -> usize{
 77        self.0[0].log_n()
 78    }
 79
 80    pub fn level(&self) -> usize{
 81        self.0.len()-1
 82    }
 83
 84    pub fn buffer_size(&self, n: usize, level:usize) -> usize{
 85        n * (level+1)
 86    }
 87
 88    pub fn from_buffer(&mut self, n: usize, level: usize, buf: &mut [O]){
 89        assert!(buf.len() >= n * (level+1), "invalid buffer: buf.len()={} < n * (level+1)={}", buf.len(), level+1);
 90        self.0.clear();
 91        for chunk in buf.chunks_mut(n).take(level+1) {
 92            let mut poly: Poly<O> = Poly(Vec::new());
 93            poly.from_buffer(n, chunk);
 94            self.0.push(poly);
 95        }
 96    }
 97
 98    pub fn resize(&mut self, level:usize){
 99        self.0.resize(level+1, Poly::<O>::new(self.n()));
100    }
101
102    pub fn split_at_mut(&mut self, level:usize) -> (&mut [Poly<O>], &mut [Poly<O>]){
103        self.0.split_at_mut(level)
104    }
105
106    pub fn at(&self, level:usize) -> &Poly<O>{
107        assert!(level <= self.level(), "invalid argument level: level={} > self.level()={}", level, self.level());
108        &self.0[level]
109    }
110
111    pub fn at_mut(&mut self, level:usize) -> &mut Poly<O>{
112        &mut self.0[level]
113    }
114
115    pub fn set_all(&mut self, v: &O){
116        (0..self.level()+1).for_each(|i| self.at_mut(i).set_all(v))
117    }
118
119    pub fn zero(&mut self){
120        self.set_all(&O::default())
121    }
122
123    pub fn copy(&mut self, other: &PolyRNS<O>){
124        if std::ptr::eq(self, other){
125            return
126        }
127        self.resize(other.level());
128        self.copy_level(other.level(), other);
129    }
130
131    pub fn copy_level(&mut self, level:usize, other: &PolyRNS<O>){
132        assert!(self.level() <= level, "invalid argument level: level={} > self.level()={}", level, self.level());
133        assert!(other.level() <= level, "invalid argument level: level={} > other.level()={}", level, other.level());
134        (0..level+1).for_each(|i| self.at_mut(i).copy_from(other.at(i)))
135    }
136}
137
138impl<O: PartialEq> PartialEq for PolyRNS<O> {
139    fn eq(&self, other: &Self) -> bool {
140        std::ptr::eq(self, other) && (self.0 == other.0)
141    }
142}
143
144impl<O> Default for PolyRNS<O>{
145    fn default() -> Self{
146        let polys:Vec<Poly<O>> = Vec::new();
147        Self{0:polys}
148    }
149}