void sample_ZmodF_sqr_threeway(unsigned long n, void* arg, unsigned long count) { ZmodF_mul_info_t info; ZmodF_mul_info_init_threeway(info, n, 1); sample_ZmodF_sqr_helper(info, n, count); ZmodF_mul_info_clear(info); }
int test_ZmodF_mul_info_mul_threeway() { int success = 1; mp_limb_t in1[2000]; mp_limb_t in2[2000]; mp_limb_t out_plain[2000]; mp_limb_t out_threeway[2000]; mpz_t x; mpz_init(x); for (unsigned long n = 3; n < 100 && success; n += 3) { #if DEBUG printf("n = %d\n", n); #endif ZmodF_mul_info_t info_plain, info_threeway; ZmodF_mul_info_init_threeway(info_threeway, n, 0); ZmodF_mul_info_init_plain(info_plain, n, 0); for (unsigned long trial = 0; trial < 50000 && success; trial++) { if (random_ulong(4) == 0) { // put in -1 mod p every now and then ZmodF_zero(in1, n); in1[n] = 1; } else { random_limbs(in1, n); in1[n] = 0; } if (random_ulong(4) == 0) { // put in -1 mod p every now and then ZmodF_zero(in2, n); in2[n] = 1; } else { random_limbs(in2, n); in2[n] = 0; } // test multiplication ZmodF_mul_info_mul(info_plain, out_plain, in1, in2); ZmodF_mul_info_mul(info_threeway, out_threeway, in1, in2); ZmodF_normalise(out_plain, n); ZmodF_normalise(out_threeway, n); if (mpn_cmp(out_plain, out_threeway, n+1)) success = 0; // test squaring ZmodF_mul_info_mul(info_plain, out_plain, in1, in1); ZmodF_mul_info_mul(info_threeway, out_threeway, in1, in1); ZmodF_normalise(out_plain, n); ZmodF_normalise(out_threeway, n); if (mpn_cmp(out_plain, out_threeway, n+1)) success = 0; } ZmodF_mul_info_clear(info_plain); ZmodF_mul_info_clear(info_threeway); } mpz_clear(x); return success; }