|
@@ -0,0 +1,83 @@
|
|
|
+#define _GNU_SOURCE
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdint.h>
|
|
|
+#include <unistd.h>
|
|
|
+#include <linux/random.h>
|
|
|
+#include <sys/syscall.h>
|
|
|
+#include <sys/time.h>
|
|
|
+
|
|
|
+#include <gmp.h>
|
|
|
+
|
|
|
+
|
|
|
+#define START_TIMEIT() \
|
|
|
+ struct timeval __start, __end; gettimeofday(&__start, NULL)
|
|
|
+
|
|
|
+#define END_TIMEIT() \
|
|
|
+ gettimeofday(&__end, NULL); \
|
|
|
+ double __sdiff = (__end.tv_sec - __start.tv_sec), __udiff = (__end.tv_usec - __start.tv_usec)
|
|
|
+
|
|
|
+
|
|
|
+#define GET_TIMEIT() \
|
|
|
+ __sdiff + __udiff * 1e-6
|
|
|
+
|
|
|
+#define TIMEIT_FORMAT "%lf"
|
|
|
+
|
|
|
+const static char *p_str =
|
|
|
+ "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
|
|
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
|
|
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
|
|
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
|
|
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
|
|
+ "505CAF";
|
|
|
+
|
|
|
+static inline ssize_t
|
|
|
+getrandom(void *buffer, size_t length, unsigned int flags)
|
|
|
+{
|
|
|
+ return syscall(SYS_getrandom, buffer, length, flags);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+mpz_t p, t;
|
|
|
+
|
|
|
+uint32_t convert(mpz_t n)
|
|
|
+{
|
|
|
+ uint32_t i;
|
|
|
+
|
|
|
+ for (i = 0; mpz_cmp(n, t) > -1; i++) {
|
|
|
+ mpz_mul_2exp(n, n, 1);
|
|
|
+ mpz_mod(n, n, p);
|
|
|
+ }
|
|
|
+ return i;
|
|
|
+}
|
|
|
+
|
|
|
+int main()
|
|
|
+{
|
|
|
+ // mpz_t p;
|
|
|
+ mpz_init_set_str(p, p_str, 0);
|
|
|
+
|
|
|
+ gmp_randstate_t _rstate;
|
|
|
+ unsigned long int _rseed;
|
|
|
+
|
|
|
+ gmp_randinit_default(_rstate);
|
|
|
+ getrandom(&_rseed, sizeof(unsigned long int), GRND_RANDOM);
|
|
|
+ gmp_randseed_ui(_rstate, _rseed);
|
|
|
+
|
|
|
+ // mpz_t t;
|
|
|
+ mpz_init_set_str(t, "1", 0);
|
|
|
+ mpz_mul_2exp(t, t, 1536-8);
|
|
|
+
|
|
|
+ mpz_t n;
|
|
|
+ mpz_init(n);
|
|
|
+
|
|
|
+ START_TIMEIT();
|
|
|
+ for (int i=0; i < 5e3; i++) {
|
|
|
+ mpz_urandomm(n, _rstate, p);
|
|
|
+ convert(n);
|
|
|
+ }
|
|
|
+ END_TIMEIT();
|
|
|
+ printf(TIMEIT_FORMAT "\n", GET_TIMEIT());
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+}
|