static int test_anr(UV a, mpz_t n, UV r, mpz_t* px, mpz_t* py) { int retval = 1; UV i, n_mod_r; mpz_t t; for (i = 0; i < r; i++) mpz_set_ui(px[i], 0); mpz_set_ui(px[0], a); mpz_set_ui(px[1], 1); poly_mod_pow(py, px, n, r, n); mpz_init(t); n_mod_r = mpz_fdiv_ui(n, r); mpz_sub_ui(t, py[n_mod_r], 1); mpz_mod(py[n_mod_r], t, n); mpz_sub_ui(t, py[0], a); mpz_mod(py[0], t, n); mpz_clear(t); for (i = 0; i < r; i++) if (mpz_sgn(py[i])) retval = 0; return retval; }
static int test_anr(UV a, UV n, UV r) { UV* pn; UV* res; UV i; int retval = 1; Newz(0, pn, r, UV); if (pn == 0) croak("Couldn't allocate space for polynomial of degree %lu\n", (unsigned long) r); a %= r; pn[0] = a; pn[1] = 1; res = poly_mod_pow(pn, n, r, n); res[n % r] = addmod(res[n % r], n - 1, n); res[0] = addmod(res[0], n - a, n); for (i = 0; i < r; i++) if (res[i] != 0) retval = 0; Safefree(res); Safefree(pn); return retval; }