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}