fbase.h 788 B

12345678910111213141516171819202122232425262728293031323334
  1. #pragma once
  2. #include <gmp.h>
  3. #include <stdint.h>
  4. #include "group.h"
  5. #define FB_FRAMES 8
  6. typedef mpz_t fbase_unit[256];
  7. typedef fbase_unit fbase_t[FB_FRAMES];
  8. typedef fbase_unit *fbase_ptr;
  9. static inline void __attribute__((optimize("unroll-loops")))
  10. fb_powmp_ui(mpz_t rop, fbase_t pb, const uint64_t exp)
  11. {
  12. const uint8_t *e = (uint8_t *) &exp;
  13. mpz_mul_modp(rop, pb[0][e[0]], pb[1][e[1]]);
  14. for (size_t j = 2; j < FB_FRAMES; j++) {
  15. const size_t exp = e[j];
  16. if (exp != 0) {
  17. mpz_mul_modp(rop, rop, pb[j][exp]);
  18. }
  19. }
  20. }
  21. fbase_ptr fb_init();
  22. void fb_set(fbase_t pb, const mpz_t n);
  23. void fb_set_small(fbase_t pb, const mpz_t n);
  24. void fb_clear(fbase_t pb);
  25. void fb_copy(fbase_t source, fbase_t dst);
  26. #define fb_init_set(pb, base) fb_init(pb); fb_set(pb, base)