gadget.rs 835 B

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