int64_t S2_hard(int64_t x, int64_t y, int64_t z, int64_t c, int64_t s2_hard_approx, int threads) { #ifdef HAVE_MPI if (mpi_num_procs() > 1) return S2_hard_mpi(x, y, z, c, s2_hard_approx, threads); #endif print(""); print("=== S2_hard(x, y) ==="); print("Computation of the hard special leaves"); print(x, y, c, threads); double time = get_wtime(); FactorTable<uint16_t> factors(y, threads); int64_t max_prime = z / isqrt(y); vector<int32_t> primes = generate_primes(max_prime); int64_t s2_hard = S2_hard_OpenMP_master((intfast64_t) x, y, z, c, (intfast64_t) s2_hard_approx, primes, factors, threads); print("S2_hard", s2_hard, time); return s2_hard; }
int128_t S2_hard(int128_t x, int64_t y, int64_t z, int64_t c, int128_t s2_hard_approx, int threads) { #ifdef HAVE_MPI if (mpi_num_procs() > 1) return S2_hard_mpi(x, y, z, c, s2_hard_approx, threads); #endif print(""); print("=== S2_hard(x, y) ==="); print("Computation of the hard special leaves"); print(x, y, c, threads); double time = get_time(); int128_t s2_hard; // uses less memory if (y <= FactorTable<uint16_t>::max()) { FactorTable<uint16_t> factor(y, threads); int64_t max_prime = min(y, z / isqrt(y)); auto primes = generate_primes<uint32_t>(max_prime); s2_hard = S2_hard_OpenMP((intfast128_t) x, y, z, c, (intfast128_t) s2_hard_approx, primes, factor, threads); } else { FactorTable<uint32_t> factor(y, threads); int64_t max_prime = min(y, z / isqrt(y)); auto primes = generate_primes<int64_t>(max_prime); s2_hard = S2_hard_OpenMP((intfast128_t) x, y, z, c, (intfast128_t) s2_hard_approx, primes, factor, threads); } print("S2_hard", s2_hard, time); return s2_hard; }