poulpy/math/src/modulus.rs
math/src/modulus.rsRaw
1pub mod prime;
2pub mod barrett;
3pub mod montgomery;
4pub mod impl_u64;
5
6pub type REDUCEMOD = u8;
7
8pub const NONE: REDUCEMOD = 0;
9pub const ONCE: REDUCEMOD = 1;
10pub const TWICE: REDUCEMOD = 2;
11pub const FOURTIMES: REDUCEMOD = 3;
12pub const BARRETT: REDUCEMOD = 4;
13pub const BARRETTLAZY: REDUCEMOD = 5;
14
15pub trait WordOps<O>{
16 fn log2(self) -> O;
17 fn reverse_bits_msb(self, n:u32) -> O;
18 fn mask(self) -> O;
19}
20
21impl WordOps<u64> for u64{
22 #[inline(always)]
23 fn log2(self) -> u64{
24 (u64::BITS - (self-1).leading_zeros()) as _
25 }
26 #[inline(always)]
27 fn reverse_bits_msb(self, n: u32) -> u64{
28 self.reverse_bits() >> (usize::BITS - n)
29 }
30 #[inline(always)]
31 fn mask(self) -> u64{
32 (1<<self.log2())-1
33 }
34}
35
36impl WordOps<usize> for usize{
37 #[inline(always)]
38 fn log2(self) -> usize{
39 (usize::BITS - (self-1).leading_zeros()) as _
40 }
41 #[inline(always)]
42 fn reverse_bits_msb(self, n: u32) -> usize{
43 self.reverse_bits() >> (usize::BITS - n)
44 }
45 #[inline(always)]
46 fn mask(self) -> usize{
47 (1<<self.log2())-1
48 }
49}
50
51pub trait ReduceOnce<O>{
52 /// Assigns self-q to self if self >= q in constant time.
53 /// User must ensure that 2q fits in O.
54 fn reduce_once_constant_time_assign(&mut self, q: O);
55 /// Returns self-q if self >= q else self in constant time.
56 /// /// User must ensure that 2q fits in O.
57 fn reduce_once_constant_time(&self, q:O) -> O;
58 /// Assigns self-q to self if self >= q.
59 /// /// User must ensure that 2q fits in O.
60 fn reduce_once_assign(&mut self, q: O);
61 /// Returns self-q if self >= q else self.
62 /// /// User must ensure that 2q fits in O.
63 fn reduce_once(&self, q:O) -> O;
64}
65
66pub trait ScalarOperations<O>{
67
68 // Applies a parameterized modular reduction.
69 fn sa_reduce_into_sa<const REDUCE:REDUCEMOD>(&self, x: &mut O);
70
71 // Assigns a + b to c.
72 fn sa_add_sb_into_sc<const REDUCE:REDUCEMOD>(&self, a: &O, b:&O, c: &mut O);
73
74 // Assigns a + b to b.
75 fn sa_add_sb_into_sb<const REDUCE:REDUCEMOD>(&self, a: &O, b: &mut O);
76
77 // Assigns a - b to c.
78 fn sa_sub_sb_into_sc<const REDUCE:REDUCEMOD>(&self, a: &O, b:&O, c: &mut O);
79
80 // Assigns b - a to b.
81 fn sa_sub_sb_into_sb<const REDUCE:REDUCEMOD>(&self, a: &O, b: &mut O);
82
83 // Assigns -a to a.
84 fn sa_neg_into_sa<const REDUCE:REDUCEMOD>(&self, a:&mut O);
85
86 // Assigns -a to b.
87 fn sa_neg_into_sb<const REDUCE:REDUCEMOD>(&self, a: &O, b:&mut O);
88
89 // Assigns a * 2^64 to b.
90 fn sa_prep_mont_into_sb<const REDUCE:REDUCEMOD>(&self, a: &O, b: &mut montgomery::Montgomery<O>);
91
92 // Assigns a * b to c.
93 fn sa_mont_mul_sb_into_sc<const REDUCE:REDUCEMOD>(&self, a:&montgomery::Montgomery<O>, b:&O, c: &mut O);
94
95 // Assigns a * b to b.
96 fn sa_mont_mul_sb_into_sb<const REDUCE:REDUCEMOD>(&self, a:&montgomery::Montgomery<O>, b:&mut O);
97
98 // Assigns a * b to c.
99 fn sa_barrett_mul_sb_into_sc<const REDUCE:REDUCEMOD>(&self, a: &barrett::Barrett<O>, b:&O, c: &mut O);
100
101 // Assigns a * b to b.
102 fn sa_barrett_mul_sb_into_sb<const REDUCE:REDUCEMOD>(&self, a:&barrett::Barrett<O>, b:&mut O);
103
104 // Assigns (a + 2q - b) * c to d.
105 fn sa_sub_sb_mul_sc_into_sd<const REDUCE:REDUCEMOD>(&self, a: &O, b: &O, c: &barrett::Barrett<O>, d: &mut O);
106
107 // Assigns (a + 2q - b) * c to b.
108 fn sa_sub_sb_mul_sc_into_sb<const REDUCE:REDUCEMOD>(&self, a: &u64, c: &barrett::Barrett<u64>, b: &mut u64);
109}
110
111pub trait VectorOperations<O>{
112
113 // Applies a parameterized modular reduction.
114 fn va_reduce_into_va<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, x: &mut [O]);
115
116 // ADD
117 // Assigns a[i] + b[i] to c[i]
118 fn va_add_vb_into_vc<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b:&[O], c: &mut [O]);
119
120 // Assigns a[i] + b[i] to b[i]
121 fn va_add_vb_into_vb<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b: &mut [O]);
122
123 // Assigns a[i] + b to c[i]
124 fn va_add_sb_into_vc<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b:&O, c:&mut [O]);
125
126 // Assigns b[i] + a to b[i]
127 fn sa_add_vb_into_vb<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a:&O, b:&mut [O]);
128
129 // SUB
130 // Assigns a[i] - b[i] to b[i]
131 fn va_sub_vb_into_vb<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b: &mut [O]);
132
133 // Assigns a[i] - b[i] to c[i]
134 fn va_sub_vb_into_vc<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b:&[O], c: &mut [O]);
135
136 // NEG
137 // Assigns -a[i] to a[i].
138 fn va_neg_into_va<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &mut [O]);
139
140 // Assigns -a[i] to a[i].
141 fn va_neg_into_vb<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b: &mut [O]);
142
143 // MUL MONTGOMERY
144 // Assigns a * 2^64 to b.
145 fn va_prep_mont_into_vb<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b: &mut [montgomery::Montgomery<O>]);
146
147 // Assigns a[i] * b[i] to c[i].
148 fn va_mont_mul_vb_into_vc<const CHUNK:usize,const REDUCE:REDUCEMOD>(&self, a:&[montgomery::Montgomery<O>], b:&[O], c: &mut [O]);
149
150 // Assigns a[i] * b[i] to b[i].
151 fn va_mont_mul_vb_into_vb<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a:&[montgomery::Montgomery<O>], b:&mut [O]);
152
153 // MUL BARRETT
154 // Assigns a * b[i] to b[i].
155 fn sa_barrett_mul_vb_into_vb<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a:& barrett::Barrett<u64>, b:&mut [u64]);
156
157 // Assigns a * b[i] to c[i].
158 fn sa_barrett_mul_vb_into_vc<const CHUNK:usize,const REDUCE:REDUCEMOD>(&self, a:& barrett::Barrett<u64>, b:&[u64], c: &mut [u64]);
159
160 // OTHERS
161 // Assigns (a[i] + 2q - b[i]) * c to d[i].
162 fn va_sub_vb_mul_sc_into_vd<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[u64], b: &[u64], c: &barrett::Barrett<u64>, d: &mut [u64]);
163
164 // Assigns (a[i] + 2q - b[i]) * c to b[i].
165 fn va_sub_vb_mul_sc_into_vb<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[u64], c: &barrett::Barrett<u64>, b: &mut [u64]);
166}
167
168
169
170