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