123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #include <stdint.h>
- #include <stdlib.h>
- #include <gmp.h>
- #include "fbase.h"
- #include "group.h"
- fbase_ptr fb_init()
- {
- fbase_ptr pb = (fbase_ptr) calloc(FB_FRAMES, sizeof(fbase_unit));
- for (size_t j = 0; j < FB_FRAMES; j++) {
- for (size_t i = 0; i <= 0xFF; i++) {
- mpz_init(pb[j][i]);
- }
- }
- return pb;
- }
- void fb_set_small(fbase_t pb, const mpz_t n)
- {
- mpz_t e;
- mpz_init(e);
- for (size_t j = 0; j < FB_FRAMES/2; j++) {
- for (size_t i = 0; i <= 0xFF; i++) {
- uint64_t e = (0x01 << 8*j) * i;
- powmp_ui(pb[j][i], n, e);
- _mpz_realloc(pb[j][i], 24);
- SIZ(pb[j][i]) = 24;
- }
- }
- mpz_clear(e);
- }
- void fb_copy(fbase_t dst, fbase_t source)
- {
- for (size_t j = 0; j < FB_FRAMES; j++) {
- for (size_t i = 0; i <= 0xFF; i++) {
- mpz_set(dst[j][i], source[j][i]);
- _mpz_realloc(dst[j][i], 24);
- SIZ(dst[j][i]) = 24;
- }
- }
- }
- void fb_set(fbase_t pb, const mpz_t n)
- {
- mpz_t e;
- mpz_init(e);
- for (size_t j = 0; j < FB_FRAMES; j++) {
- for (size_t i = 0; i <= 0xFF; i++) {
- mpz_set_ui(e, 1);
- mpz_mul_2exp(e, e, 8*j);
- mpz_mul_ui(e, e, i);
- mpz_powm(pb[j][i], n, e, p);
- }
- }
- mpz_clear(e);
- }
- void fb_clear(fbase_t pb)
- {
- for (size_t j = 0; j < FB_FRAMES; j++) {
- for (size_t i = 0; i <= 0xFF; i++) {
- mpz_clear(pb[j][i]);
- }
- }
- free(pb);
- }
- void __attribute__((optimize("unroll-loops")))
- fb_powmp_ui(mpz_t rop, fbase_t pb, const uint64_t exp)
- {
- const uint8_t *e = (uint8_t *) &exp;
- mpz_mul_modp(rop, pb[0][e[0]], pb[1][e[1]]);
- for (size_t j = 2; j < FB_FRAMES; j++) {
- const size_t exp = e[j];
- if (exp != 0) {
- mpz_mul_modp(rop, rop, pb[j][exp]);
- }
- }
- }
|