params.rs 905 B

12345678910111213141516171819202122232425262728293031323334
  1. use crate::{arith::*, ntt::*};
  2. pub struct Params {
  3. pub poly_len: usize,
  4. pub poly_len_log2: usize,
  5. pub ntt_tables: Vec<Vec<Vec<u64>>>,
  6. pub crt_count: usize,
  7. pub moduli: Vec<u64>,
  8. }
  9. impl Params {
  10. pub fn num_words(&self) -> usize {
  11. self.poly_len * self.crt_count
  12. }
  13. pub fn get_ntt_forward_table(&self, i: usize) -> &[u64] {
  14. self.ntt_tables[i][0].as_slice()
  15. }
  16. pub fn get_ntt_forward_prime_table(&self, i: usize) -> &[u64] {
  17. self.ntt_tables[i][1].as_slice()
  18. }
  19. pub fn init(poly_len: usize, moduli: Vec<u64>) -> Self {
  20. let poly_len_log2 = log2(poly_len as u64) as usize;
  21. let crt_count = moduli.len();
  22. let ntt_tables = build_ntt_tables(poly_len, moduli.as_slice());
  23. Self {
  24. poly_len,
  25. poly_len_log2,
  26. ntt_tables,
  27. crt_count,
  28. moduli,
  29. }
  30. }
  31. }