/* Copyright (C) 2012 William Hart Copyright (C) 2020 Fredrik Johansson This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include "flint.h" #include "ulong_extras.h" #include "fmpz.h" #include "mpn_extras.h" int fmpz_is_probabprime(const fmpz_t n) { if (!COEFF_IS_MPZ(*n)) { slong v = *n; if (v <= 1) return 0; return n_is_probabprime(v); } else { __mpz_struct * z; mp_ptr d; slong size, bits, trial_primes; z = COEFF_TO_PTR(*n); size = z->_mp_size; d = z->_mp_d; if (size < 0) return 0; if (size == 1) return n_is_probabprime(d[0]); if (d[0] % 2 == 0) return 0; bits = size * FLINT_BITS + FLINT_BIT_COUNT(d[size-1]); trial_primes = bits; if (flint_mpn_factor_trial(d, size, 1, trial_primes)) return 0; if (fmpz_is_square(n)) return 0; return fmpz_is_probabprime_BPSW(n); } }