1- use super :: MlKemField ;
1+ use super :: { MlKemField , PolyVec } ;
22use crate :: {
33 algebra:: Finite ,
44 polynomial:: { Monomial , Polynomial } ,
@@ -7,57 +7,69 @@ use crate::{
77/// Compresses a number x to a number in the range [0, 2^d) using the formula round((2^d / q) * x)
88/// mod 2^d.
99/// round(a / b) = floor((a + b/2) / b)
10- pub fn compress_fieldelement < const D : usize > ( x : & MlKemField ) -> MlKemField {
10+ pub fn compress_fieldelement < const d : usize > ( x : & MlKemField ) -> MlKemField {
1111 // TODO: Implement using barrett reduction
1212 let q_half = ( MlKemField :: ORDER + 1 ) >> 1 ;
13- MlKemField :: new ( ( ( ( x. value << D ) + q_half) / MlKemField :: ORDER ) % ( 1 << D ) )
13+ MlKemField :: new ( ( ( ( x. value << d ) + q_half) / MlKemField :: ORDER ) % ( 1 << d ) )
1414}
1515
1616/// Decompresses a number y to a number in the range [0, q) using the formula round((q / 2^d)) * y.
17- pub fn decompress_fieldelement < const D : usize > ( y : & MlKemField ) -> MlKemField {
18- let d_pow_half = 1 << ( D - 1 ) ;
17+ pub fn decompress_fieldelement < const d : usize > ( y : & MlKemField ) -> MlKemField {
18+ let d_pow_half = 1 << ( d - 1 ) ;
1919 let quotient = MlKemField :: ORDER * y. value + d_pow_half;
20- MlKemField :: new ( quotient >> D )
20+ MlKemField :: new ( quotient >> d )
2121}
2222
23- pub fn poly_compress < const D : usize > (
23+ pub fn poly_compress < const D : usize , const d : usize > (
2424 poly : & Polynomial < Monomial , MlKemField , D > ,
25- ) -> [ MlKemField ; D ] {
25+ ) -> Polynomial < Monomial , MlKemField , D > {
2626 // TODO: remove unwrap
27- poly
27+ let coeffs = poly
2828 . coefficients
2929 . iter ( )
30- . map ( compress_fieldelement :: < 8 > )
30+ . map ( compress_fieldelement :: < d > )
3131 . collect :: < Vec < MlKemField > > ( )
3232 . try_into ( )
33- . unwrap ( )
33+ . unwrap ( ) ;
34+
35+ Polynomial :: < Monomial , MlKemField , D > :: new ( coeffs)
3436}
3537
36- pub fn poly_decompress < const D : usize > (
38+ pub fn poly_decompress < const D : usize , const d : usize > (
3739 poly : & [ MlKemField ; D ] ,
3840) -> Polynomial < Monomial , MlKemField , D > {
3941 let mut coefficients = [ MlKemField :: default ( ) ; D ] ;
4042 for ( i, x) in poly. iter ( ) . enumerate ( ) {
41- coefficients[ i] = decompress_fieldelement :: < 8 > ( x) ;
43+ coefficients[ i] = decompress_fieldelement :: < d > ( x) ;
4244 }
4345 Polynomial :: < Monomial , MlKemField , D > :: new ( coefficients)
4446}
4547
46- // pub fn polyvec_compress<const D: usize, const K: usize>(
47- // poly_vec: &PolyVec<Monomial, D, K>,
48- // ) -> [[MlKemField; D]; K] {
49- // let mut res = [[MlKemField::default(); D]; K] ;
48+ pub fn polyvec_compress < const D : usize , const d : usize , const K : usize > (
49+ poly_vec : & PolyVec < Monomial , D , K > ,
50+ ) -> PolyVec < Monomial , D , K > {
51+ let mut res = Vec :: with_capacity ( K ) ;
5052
51- // for (i, poly) in poly_vec.vec.iter().enumerate () {
52- // res[i] = poly_compress(poly);
53- // }
53+ for poly in poly_vec. vec . iter ( ) {
54+ res. push ( poly_compress :: < D , d > ( poly) ) ;
55+ }
5456
55- // res
56- // }
57+ let res = res. try_into ( ) . unwrap ( ) ;
58+ PolyVec :: new ( res)
59+ }
5760
58- // pub fn polyvec_decompress<const D: usize, const K: usize>(
61+ pub fn polyvec_decompress < const D : usize , const d: usize , const K : usize > (
62+ poly_vec : & PolyVec < Monomial , D , K > ,
63+ ) -> PolyVec < Monomial , D , K > {
64+ let mut res = Vec :: with_capacity ( K ) ;
5965
60- // )
66+ for poly in poly_vec. vec . iter ( ) {
67+ res. push ( poly_decompress :: < D , d > ( & poly. coefficients ) ) ;
68+ }
69+
70+ let res = res. try_into ( ) . unwrap ( ) ;
71+ PolyVec :: new ( res)
72+ }
6173
6274#[ test]
6375fn test_compress_decompress ( ) {
0 commit comments