X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fpolynomial%2Fmod_gcd.cpp;h=82d5f427f397abd6b8e6cce68ac84eb6c03a72e5;hp=8aa84808c1f64a5975086eaa743d78c93f4e4455;hb=d625a28c3def007a9d2d5108141a6f6a4889bf9d;hpb=546bababce8ef2b3c5ed3011cb7e49bd78016844 diff --git a/ginac/polynomial/mod_gcd.cpp b/ginac/polynomial/mod_gcd.cpp index 8aa84808..82d5f427 100644 --- a/ginac/polynomial/mod_gcd.cpp +++ b/ginac/polynomial/mod_gcd.cpp @@ -104,8 +104,18 @@ void mod_gcd(upoly& result, upoly A, upoly B) ring_t q(0); upoly H; - ring_t p(2); + int count = 0; + const ring_t p_threshold = ring_t(1) << (8*sizeof(void *)); + ring_t p = isqrt(std::min(max_coeff(A), max_coeff(B))); while (true) { + if (count >= 8) { + count = 0; + if (p < p_threshold) + p <<= 1; + else + p = p + (p >> 4); + } else + ++count; find_next_prime(p, g); // Map the polynomials onto Z/p[x]