static int find_roots(long D, int poly_index, mpz_t N, mpz_t** roots, int maxroots) { mpz_t* T; UV degree; long dT, i, nroots; int poly_type; if (D == -3 || D == -4) { *roots = 0; return 1; } degree = poly_class_poly_num(poly_index, NULL, &T, &poly_type); if (degree == 0 || (poly_type != 1 && poly_type != 2 && poly_type != 3)) return 0; dT = degree; polyz_mod(T, T, &dT, N); polyz_roots_modp(roots, &nroots, maxroots, T, dT, N); if (nroots == 0) { gmp_printf("N = %Zd\n", N); croak("Failed to find roots for D = %ld\n", D); } for (i = 0; i <= dT; i++) mpz_clear(T[i]); Safefree(T); #if 0 if (nroots != dT && get_verbose_level()) printf(" found %ld roots of the %ld degree poly\n", nroots, dT); #endif /* Convert Weber and Ramanujan roots to Hilbert roots */ if (poly_type == 2) for (i = 0; i < nroots; i++) weber_root_to_hilbert_root((*roots)[i], N, D); if (poly_type == 3) for (i = 0; i < nroots; i++) ramanujan_root_to_hilbert_root((*roots)[i], N, D); return nroots; }
static int find_roots(long D, mpz_t N, mpz_t** roots) { mpz_t* T; UV degree; long dT, i, nroots; int poly_type; gmp_randstate_t* p_randstate = get_randstate(); if (D == -3 || D == -4) { *roots = 0; return 1; } degree = poly_class_poly(D, &T, &poly_type); if (degree == 0 || (poly_type != 1 && poly_type != 2)) return 0; dT = degree; polyz_mod(T, T, &dT, N); /* Don't bother getting more than 4 roots */ polyz_roots_modp(roots, &nroots, 4, T, dT, N, p_randstate); if (nroots == 0) { gmp_printf("N = %Zd\n", N); croak("Failed to find roots for D = %ld\n", D); } for (i = 0; i <= dT; i++) mpz_clear(T[i]); Safefree(T); #if 0 if (nroots != dT && get_verbose_level()) printf(" found %ld roots of the %ld degree poly\n", nroots, dT); #endif /* Convert Weber roots to Hilbert roots */ if (poly_type == 2) for (i = 0; i < nroots; i++) weber_root_to_hilbert_root((*roots)[i], N, D); return nroots; }