|
1 | 1 | use std::ops::Mul; |
2 | 2 |
|
3 | | -use super::{MlKemField, Ntt}; |
| 3 | +use super::{MlKemField, Ntt, PolyVec}; |
4 | 4 | use crate::{ |
5 | 5 | algebra::{field::Field, Finite}, |
6 | 6 | polynomial::{Monomial, Polynomial}, |
@@ -71,21 +71,38 @@ impl<const D: usize> Polynomial<Monomial, MlKemField, D> { |
71 | 71 | } |
72 | 72 | } |
73 | 73 |
|
74 | | -impl Mul<Polynomial<Ntt, MlKemField, 256>> for Polynomial<Ntt, MlKemField, 256> { |
75 | | - type Output = Self; |
| 74 | +impl<const D: usize, const K: usize> PolyVec<Monomial, D, K> { |
| 75 | + pub fn ntt(self) -> PolyVec<Ntt, D, K> { |
| 76 | + let ntt_vec = self.vec.iter().map(|poly| poly.ntt()).collect::<Vec<_>>().try_into().unwrap(); |
76 | 77 |
|
77 | | - fn mul(self, rhs: Polynomial<Ntt, MlKemField, 256>) -> Self::Output { |
78 | | - let mut res_coeffs = [MlKemField::ZERO; 256]; |
| 78 | + PolyVec::<Ntt, D, K> { vec: ntt_vec } |
| 79 | + } |
| 80 | +} |
| 81 | + |
| 82 | +impl<const D: usize, const K: usize> PolyVec<Ntt, D, K> { |
| 83 | + pub fn ntt_inv(self) -> PolyVec<Monomial, D, K> { |
| 84 | + let ntt_inv_vec = |
| 85 | + self.vec.iter().map(|poly| poly.ntt_inv()).collect::<Vec<_>>().try_into().unwrap(); |
| 86 | + |
| 87 | + PolyVec { vec: ntt_inv_vec } |
| 88 | + } |
| 89 | +} |
| 90 | + |
| 91 | +impl<const D: usize> Mul<&Polynomial<Ntt, MlKemField, D>> for &Polynomial<Ntt, MlKemField, D> { |
| 92 | + type Output = Polynomial<Ntt, MlKemField, D>; |
| 93 | + |
| 94 | + fn mul(self, rhs: &Polynomial<Ntt, MlKemField, D>) -> Self::Output { |
| 95 | + let mut res_coeffs = [MlKemField::ZERO; D]; |
79 | 96 |
|
80 | | - for i in 0..128 { |
| 97 | + for i in 0..D >> 1 { |
81 | 98 | let (a0, a1) = (self.coefficients[2 * i], self.coefficients[2 * i + 1]); |
82 | 99 | let (b0, b1) = (rhs.coefficients[2 * i], rhs.coefficients[2 * i + 1]); |
83 | 100 | let (c0, c1) = (a0 * b0 + GAMMA[i] * a1 * b1, a0 * b1 + a1 * b0); |
84 | 101 | res_coeffs[2 * i] = c0; |
85 | 102 | res_coeffs[2 * i + 1] = c1; |
86 | 103 | } |
87 | 104 |
|
88 | | - Polynomial::<Ntt, MlKemField, 256> { coefficients: res_coeffs, basis: Ntt } |
| 105 | + Polynomial::<Ntt, MlKemField, D> { coefficients: res_coeffs, basis: Ntt } |
89 | 106 | } |
90 | 107 | } |
91 | 108 |
|
|
0 commit comments