foo.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #define _GNU_SOURCE
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include <stdint.h>
  5. #include <unistd.h>
  6. #include <linux/random.h>
  7. #include <sys/syscall.h>
  8. #include <sys/time.h>
  9. #include <gmp.h>
  10. #define START_TIMEIT() \
  11. struct timeval __start, __end; gettimeofday(&__start, NULL)
  12. #define END_TIMEIT() \
  13. gettimeofday(&__end, NULL); \
  14. double __sdiff = (__end.tv_sec - __start.tv_sec), __udiff = (__end.tv_usec - __start.tv_usec)
  15. #define GET_TIMEIT() \
  16. __sdiff + __udiff * 1e-6
  17. #define TIMEIT_FORMAT "%lf"
  18. const static char *p_str =
  19. "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  20. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  21. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  22. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  23. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  24. "505CAF";
  25. static inline ssize_t
  26. getrandom(void *buffer, size_t length, unsigned int flags)
  27. {
  28. return syscall(SYS_getrandom, buffer, length, flags);
  29. }
  30. mpz_t p, t;
  31. uint32_t convert(mpz_t n)
  32. {
  33. uint32_t i;
  34. for (i = 0; mpz_cmp(n, t) > -1; i++) {
  35. mpz_mul_2exp(n, n, 1);
  36. mpz_mod(n, n, p);
  37. }
  38. return i;
  39. }
  40. int main()
  41. {
  42. // mpz_t p;
  43. mpz_init_set_str(p, p_str, 0);
  44. gmp_randstate_t _rstate;
  45. unsigned long int _rseed;
  46. gmp_randinit_default(_rstate);
  47. getrandom(&_rseed, sizeof(unsigned long int), GRND_RANDOM);
  48. gmp_randseed_ui(_rstate, _rseed);
  49. // mpz_t t;
  50. mpz_init_set_str(t, "1", 0);
  51. mpz_mul_2exp(t, t, 1536-8);
  52. mpz_t n;
  53. mpz_init(n);
  54. START_TIMEIT();
  55. for (int i=0; i < 5e3; i++) {
  56. mpz_urandomm(n, _rstate, p);
  57. convert(n);
  58. }
  59. END_TIMEIT();
  60. printf(TIMEIT_FORMAT "\n", GET_TIMEIT());
  61. return 0;
  62. }