Skip to main content

poulpy_cpu_ref/ntt120/
znx.rs

1//! Single ring element (`Z[X]/(X^n+1)`) arithmetic for [`NTT120Ref`](crate::NTT120Ref).
2//!
3//! Implements the `Znx*` traits from `crate::reference::znx`. All implementations
4//! delegate to the same `_ref` functions as `poulpy-cpu-ref` — these operate on plain
5//! `&[i64]` slices, which are backend-independent.
6
7use crate::reference::znx::{
8    ZnxAdd, ZnxAddAssign, ZnxAutomorphism, ZnxCopy, ZnxExtractDigitAddMul, ZnxMulAddPowerOfTwo, ZnxMulPowerOfTwo,
9    ZnxMulPowerOfTwoAssign, ZnxNegate, ZnxNegateAssign, ZnxNormalizeDigit, ZnxNormalizeFinalStep, ZnxNormalizeFinalStepAssign,
10    ZnxNormalizeFinalStepSub, ZnxNormalizeFirstStep, ZnxNormalizeFirstStepAssign, ZnxNormalizeFirstStepCarryOnly,
11    ZnxNormalizeMiddleStep, ZnxNormalizeMiddleStepAssign, ZnxNormalizeMiddleStepCarryOnly, ZnxNormalizeMiddleStepSub, ZnxRotate,
12    ZnxSub, ZnxSubAssign, ZnxSubNegateAssign, ZnxSwitchRing, ZnxZero, znx_add_assign_ref, znx_add_ref, znx_automorphism_ref,
13    znx_copy_ref, znx_extract_digit_addmul_ref, znx_mul_add_power_of_two_ref, znx_mul_power_of_two_assign_ref,
14    znx_mul_power_of_two_ref, znx_negate_assign_ref, znx_negate_ref, znx_normalize_digit_ref,
15    znx_normalize_final_step_assign_ref, znx_normalize_final_step_ref, znx_normalize_final_step_sub_ref,
16    znx_normalize_first_step_assign_ref, znx_normalize_first_step_carry_only_ref, znx_normalize_first_step_ref,
17    znx_normalize_middle_step_assign_ref, znx_normalize_middle_step_carry_only_ref, znx_normalize_middle_step_ref,
18    znx_normalize_middle_step_sub_ref, znx_rotate, znx_sub_assign_ref, znx_sub_negate_assign_ref, znx_sub_ref,
19    znx_switch_ring_ref, znx_zero_ref,
20};
21
22use crate::NTT120Ref;
23
24impl ZnxAdd for NTT120Ref {
25    #[inline(always)]
26    fn znx_add(res: &mut [i64], a: &[i64], b: &[i64]) {
27        znx_add_ref(res, a, b);
28    }
29}
30
31impl ZnxAddAssign for NTT120Ref {
32    #[inline(always)]
33    fn znx_add_assign(res: &mut [i64], a: &[i64]) {
34        znx_add_assign_ref(res, a);
35    }
36}
37
38impl ZnxSub for NTT120Ref {
39    #[inline(always)]
40    fn znx_sub(res: &mut [i64], a: &[i64], b: &[i64]) {
41        znx_sub_ref(res, a, b);
42    }
43}
44
45impl ZnxSubAssign for NTT120Ref {
46    #[inline(always)]
47    fn znx_sub_assign(res: &mut [i64], a: &[i64]) {
48        znx_sub_assign_ref(res, a);
49    }
50}
51
52impl ZnxSubNegateAssign for NTT120Ref {
53    #[inline(always)]
54    fn znx_sub_negate_assign(res: &mut [i64], a: &[i64]) {
55        znx_sub_negate_assign_ref(res, a);
56    }
57}
58
59impl ZnxMulAddPowerOfTwo for NTT120Ref {
60    #[inline(always)]
61    fn znx_muladd_power_of_two(k: i64, res: &mut [i64], a: &[i64]) {
62        znx_mul_add_power_of_two_ref(k, res, a);
63    }
64}
65
66impl ZnxMulPowerOfTwo for NTT120Ref {
67    #[inline(always)]
68    fn znx_mul_power_of_two(k: i64, res: &mut [i64], a: &[i64]) {
69        znx_mul_power_of_two_ref(k, res, a);
70    }
71}
72
73impl ZnxMulPowerOfTwoAssign for NTT120Ref {
74    #[inline(always)]
75    fn znx_mul_power_of_two_assign(k: i64, res: &mut [i64]) {
76        znx_mul_power_of_two_assign_ref(k, res);
77    }
78}
79
80impl ZnxAutomorphism for NTT120Ref {
81    #[inline(always)]
82    fn znx_automorphism(p: i64, res: &mut [i64], a: &[i64]) {
83        znx_automorphism_ref(p, res, a);
84    }
85}
86
87impl ZnxCopy for NTT120Ref {
88    #[inline(always)]
89    fn znx_copy(res: &mut [i64], a: &[i64]) {
90        znx_copy_ref(res, a);
91    }
92}
93
94impl ZnxNegate for NTT120Ref {
95    #[inline(always)]
96    fn znx_negate(res: &mut [i64], src: &[i64]) {
97        znx_negate_ref(res, src);
98    }
99}
100
101impl ZnxNegateAssign for NTT120Ref {
102    #[inline(always)]
103    fn znx_negate_assign(res: &mut [i64]) {
104        znx_negate_assign_ref(res);
105    }
106}
107
108impl ZnxRotate for NTT120Ref {
109    #[inline(always)]
110    fn znx_rotate(p: i64, res: &mut [i64], src: &[i64]) {
111        znx_rotate::<Self>(p, res, src);
112    }
113}
114
115impl ZnxZero for NTT120Ref {
116    #[inline(always)]
117    fn znx_zero(res: &mut [i64]) {
118        znx_zero_ref(res);
119    }
120}
121
122impl ZnxSwitchRing for NTT120Ref {
123    #[inline(always)]
124    fn znx_switch_ring(res: &mut [i64], a: &[i64]) {
125        znx_switch_ring_ref(res, a);
126    }
127}
128
129impl ZnxNormalizeFirstStep for NTT120Ref {
130    #[inline(always)]
131    fn znx_normalize_first_step<const OVERWRITE: bool>(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64]) {
132        znx_normalize_first_step_ref::<OVERWRITE>(base2k, lsh, x, a, carry);
133    }
134}
135
136impl ZnxNormalizeMiddleStep for NTT120Ref {
137    #[inline(always)]
138    fn znx_normalize_middle_step<const OVERWRITE: bool>(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64]) {
139        znx_normalize_middle_step_ref::<OVERWRITE>(base2k, lsh, x, a, carry);
140    }
141}
142
143impl ZnxNormalizeFinalStep for NTT120Ref {
144    #[inline(always)]
145    fn znx_normalize_final_step<const OVERWRITE: bool>(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64]) {
146        znx_normalize_final_step_ref::<OVERWRITE>(base2k, lsh, x, a, carry);
147    }
148}
149
150impl ZnxNormalizeMiddleStepSub for NTT120Ref {
151    #[inline(always)]
152    fn znx_normalize_middle_step_sub(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64]) {
153        znx_normalize_middle_step_sub_ref(base2k, lsh, x, a, carry);
154    }
155}
156
157impl ZnxNormalizeFinalStepSub for NTT120Ref {
158    #[inline(always)]
159    fn znx_normalize_final_step_sub(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64]) {
160        znx_normalize_final_step_sub_ref(base2k, lsh, x, a, carry);
161    }
162}
163
164impl ZnxNormalizeFinalStepAssign for NTT120Ref {
165    #[inline(always)]
166    fn znx_normalize_final_step_assign(base2k: usize, lsh: usize, x: &mut [i64], carry: &mut [i64]) {
167        znx_normalize_final_step_assign_ref(base2k, lsh, x, carry);
168    }
169}
170
171impl ZnxNormalizeFirstStepCarryOnly for NTT120Ref {
172    #[inline(always)]
173    fn znx_normalize_first_step_carry_only(base2k: usize, lsh: usize, x: &[i64], carry: &mut [i64]) {
174        znx_normalize_first_step_carry_only_ref(base2k, lsh, x, carry);
175    }
176}
177
178impl ZnxNormalizeFirstStepAssign for NTT120Ref {
179    #[inline(always)]
180    fn znx_normalize_first_step_assign(base2k: usize, lsh: usize, x: &mut [i64], carry: &mut [i64]) {
181        znx_normalize_first_step_assign_ref(base2k, lsh, x, carry);
182    }
183}
184
185impl ZnxNormalizeMiddleStepCarryOnly for NTT120Ref {
186    #[inline(always)]
187    fn znx_normalize_middle_step_carry_only(base2k: usize, lsh: usize, x: &[i64], carry: &mut [i64]) {
188        znx_normalize_middle_step_carry_only_ref(base2k, lsh, x, carry);
189    }
190}
191
192impl ZnxNormalizeMiddleStepAssign for NTT120Ref {
193    #[inline(always)]
194    fn znx_normalize_middle_step_assign(base2k: usize, lsh: usize, x: &mut [i64], carry: &mut [i64]) {
195        znx_normalize_middle_step_assign_ref(base2k, lsh, x, carry);
196    }
197}
198
199impl ZnxExtractDigitAddMul for NTT120Ref {
200    #[inline(always)]
201    fn znx_extract_digit_addmul(base2k: usize, lsh: usize, res: &mut [i64], src: &mut [i64]) {
202        znx_extract_digit_addmul_ref(base2k, lsh, res, src);
203    }
204}
205
206impl ZnxNormalizeDigit for NTT120Ref {
207    #[inline(always)]
208    fn znx_normalize_digit(base2k: usize, res: &mut [i64], src: &mut [i64]) {
209        znx_normalize_digit_ref(base2k, res, src);
210    }
211}