Python-ELMO is a Python library which offers an encapsulation of the binary tool ELMO, in order to manipulate it easily in Python and SageMath script.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <stdint.h>
  2. #include "params.h"
  3. #include "ntt.h"
  4. #include "reduce.h"
  5. int16_t zetas[128] = {
  6. 2285, 2571, 2970, 1812, 1493, 1422, 287, 202, 3158, 622, 1577, 182, 962, 2127, 1855, 1468,
  7. 573, 2004, 264, 383, 2500, 1458, 1727, 3199, 2648, 1017, 732, 608, 1787, 411, 3124, 1758,
  8. 1223, 652, 2777, 1015, 2036, 1491, 3047, 1785, 516, 3321, 3009, 2663, 1711, 2167, 126, 1469,
  9. 2476, 3239, 3058, 830, 107, 1908, 3082, 2378, 2931, 961, 1821, 2604, 448, 2264, 677, 2054,
  10. 2226, 430, 555, 843, 2078, 871, 1550, 105, 422, 587, 177, 3094, 3038, 2869, 1574, 1653,
  11. 3083, 778, 1159, 3182, 2552, 1483, 2727, 1119, 1739, 644, 2457, 349, 418, 329, 3173, 3254,
  12. 817, 1097, 603, 610, 1322, 2044, 1864, 384, 2114, 3193, 1218, 1994, 2455, 220, 2142, 1670,
  13. 2144, 1799, 2051, 794, 1819, 2475, 2459, 478, 3221, 3021, 996, 991, 958, 1869, 1522, 1628};
  14. /*************************************************
  15. * Name: fqmul
  16. *
  17. * Description: Multiplication followed by Montgomery reduction
  18. *
  19. * Arguments: - int16_t a: first factor
  20. * - int16_t b: second factor
  21. *
  22. * Returns 16-bit integer congruent to a*b*R^{-1} mod q
  23. **************************************************/
  24. static int16_t fqmul(int16_t a, int16_t b) {
  25. return montgomery_reduce((int32_t)a*b);
  26. }
  27. /*************************************************
  28. * Name: ntt
  29. *
  30. * Description: Inplace number-theoretic transform (NTT) in Rq
  31. * input is in standard order, output is in bitreversed order
  32. *
  33. * Arguments: - int16_t r[256]: pointer to input/output vector of elements of Zq
  34. **************************************************/
  35. void ntt(int16_t r[256]) {
  36. unsigned int len, start, j, k;
  37. int16_t t, zeta;
  38. k = 1;
  39. for(len = 128; len >= 2; len >>= 1) {
  40. for(start = 0; start < 256; start = j + len) {
  41. zeta = zetas[k++];
  42. for(j = start; j < start + len; ++j) {
  43. t = fqmul(zeta, r[j + len]);
  44. r[j + len] = r[j] - t;
  45. r[j] = r[j] + t;
  46. }
  47. }
  48. }
  49. }