int factor_trial_division(const Ptr<RCP<const Integer>> &f, const Integer &n) { int ret_val; mpz_class factor; ret_val =_factor_trial_division_sieve(factor, n.as_mpz()); if (ret_val == 1) *f = integer(factor); return ret_val; }
// Factorization int factor(const Ptr<RCP<const Integer>> &f, const Integer &n, double B1) { int ret_val = 0; integer_class _n, _f; _n = n.as_integer_class(); #ifdef HAVE_SYMENGINE_ECM if (mp_perfect_power_p(_n)) { unsigned long int i = 1; integer_class m, rem; rem = 1; // Any non zero number m = 2; // set `m` to 2**i, i = 1 at the begining // calculate log2n, this can be improved for (; m < _n; ++i) m = m * 2; // eventually `rem` = 0 zero as `n` is a perfect power. `f_t` will // be set to a factor of `n` when that happens while (i > 1 and rem != 0) { mp_rootrem(_f, rem, _n, i); --i; } ret_val = 1; } else { if (mp_probab_prime_p(_n, 25) > 0) { // most probably, n is a prime ret_val = 0; _f = _n; } else { for (int i = 0; i < 10 and not ret_val; ++i) ret_val = ecm_factor(get_mpz_t(_f), get_mpz_t(_n), B1, nullptr); mp_demote(_f); if (not ret_val) throw SymEngineException( "ECM failed to factor the given number"); } } #else // B1 is discarded if gmp-ecm is not installed ret_val = _factor_trial_division_sieve(_f, _n); #endif // HAVE_SYMENGINE_ECM *f = integer(std::move(_f)); return ret_val; }
// Factorization int factor(const Ptr<RCP<const Integer>> &f, const Integer &n, double B1) { int ret_val = 0; mpz_class _n, _f; _n = n.as_mpz(); #ifdef HAVE_CSYMPY_ECM if (mpz_perfect_power_p(_n.get_mpz_t())) { unsigned long int i = 1; mpz_class m, rem; rem = 1; // Any non zero number m = 2; // set `m` to 2**i, i = 1 at the begining // calculate log2n, this can be improved for (; m < _n; i++) m = m * 2; // eventually `rem` = 0 zero as `n` is a perfect power. `f_t` will // be set to a factor of `n` when that happens while (i > 1 && rem != 0) { mpz_rootrem(_f.get_mpz_t(), rem.get_mpz_t(), _n.get_mpz_t(), i); i--; } ret_val = 1; } else { if (mpz_probab_prime_p(_n.get_mpz_t(), 25) > 0) { // most probably, n is a prime ret_val = 0; _f = _n; } else { for (int i = 0; i < 10 && !ret_val; i++) ret_val = ecm_factor(_f.get_mpz_t(), _n.get_mpz_t(), B1, NULL); if (!ret_val) throw std::runtime_error("ECM failed to factor the given number"); } } #else // B1 is discarded if gmp-ecm is not installed ret_val = _factor_trial_division_sieve(_f, _n); #endif // HAVE_CSYMPY_ECM *f = integer(_f); return ret_val; }