group.c 941 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "group.h"
  2. const char* p_str =
  3. "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  4. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  5. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  6. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  7. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  8. "505CAF";
  9. mpz_t p, q;
  10. const uint64_t gg = 11510609;
  11. void group_init()
  12. {
  13. mpz_init_set_str(p, p_str, 0);
  14. mpz_init(q);
  15. mpz_sub_ui(q, p, 1);
  16. mpz_divexact_ui(q, q, 2);
  17. }
  18. void group_clear()
  19. {
  20. mpz_clears(p, q, NULL);
  21. }
  22. void powmp_ui(mpz_t x, const mpz_t base, uint64_t exp)
  23. {
  24. mpz_t y;
  25. mpz_init_set_ui(y, 1);
  26. mpz_set(x, base);
  27. while (exp > 1) {
  28. if (exp & 1) mpz_mul_modp(y, x, y);
  29. mpz_mul_modp(x, x, x);
  30. exp >>= 1;
  31. }
  32. mpz_mul_modp(x, x, y);
  33. mpz_clear(y);
  34. }