gadget.rs 821 B

123456789101112131415161718192021222324252627282930
  1. use crate::{poly::*, params::*};
  2. pub fn get_bits_per(params: &Params, dim: usize) -> usize{
  3. let modulus_log2 = params.modulus_log2;
  4. if dim as u64 == modulus_log2 { return 1; }
  5. ((modulus_log2 as f64) / (dim as f64)).floor() as usize + 1
  6. }
  7. pub fn build_gadget(params: &Params, rows: usize, cols: usize) -> PolyMatrixRaw {
  8. let mut g = PolyMatrixRaw::zero(params, rows, cols);
  9. let nx = g.rows;
  10. let m = g.cols;
  11. assert_eq!(m % nx, 0);
  12. let num_elems = m / nx;
  13. let params = g.params;
  14. let bits_per = get_bits_per(params, num_elems);
  15. for i in 0..nx {
  16. for j in 0..num_elems {
  17. if bits_per * j >= 64 {
  18. continue;
  19. }
  20. let poly = g.get_poly_mut(i, i + j * nx);
  21. poly[0] = 1u64 << (bits_per * j);
  22. }
  23. }
  24. g
  25. }