int main(int argc, char **argv) { uint64_t a, b, c; uint64_t *r1, *r2; int i; gf_t gf; if (argc != 1) usage(NULL); /* Get two random numbers in a and b */ MOA_Seed(time(0)); a = MOA_Random_64(); b = MOA_Random_64(); /* Create the proper instance of the gf_t object using defaults: */ gf_init_easy(&gf, 64); /* And multiply a and b using the galois field: */ c = gf.multiply.w64(&gf, a, b); printf("%llx * %llx = %llx\n", (long long unsigned int) a, (long long unsigned int) b, (long long unsigned int) c); /* Divide the product by a and b */ printf("%llx / %llx = %llx\n", (long long unsigned int) c, (long long unsigned int) a, (long long unsigned int) gf.divide.w64(&gf, c, a)); printf("%llx / %llx = %llx\n", (long long unsigned int) c, (long long unsigned int) b, (long long unsigned int) gf.divide.w64(&gf, c, b)); r1 = (uint64_t *) malloc(32); r2 = (uint64_t *) malloc(32); r1[0] = b; for (i = 1; i < 4; i++) r1[i] = MOA_Random_64(); gf.multiply_region.w64(&gf, r1, r2, a, 32, 0); printf("\nmultiply_region by %llx\n\n", (long long unsigned int) a); printf("R1 (the source): "); for (i = 0; i < 4; i++) printf(" %016llx", (long long unsigned int) r1[i]); printf("\nR2 (the product): "); for (i = 0; i < 4; i++) printf(" %016llx", (long long unsigned int) r2[i]); printf("\n"); exit(0); }
void gf_general_set_random(gf_general_t *v, int w, int zero_ok) { if (w <= 32) { v->w32 = MOA_Random_W(w, zero_ok); } else if (w <= 64) { while (1) { v->w64 = MOA_Random_64(); if (v->w64 != 0 || zero_ok) return; } } else { while (1) { MOA_Random_128(v->w128); if (v->w128[0] != 0 || v->w128[1] != 0 || zero_ok) return; } } }
void MOA_Random_128(uint64_t *x) { x[0] = MOA_Random_64(); x[1] = MOA_Random_64(); return; }