/* Copyright (C) 2009 William Hart Copyright (C) 2014, 2015 Dana Jacobsen 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" int n_is_prime(mp_limb_t n) { /* flint's "BPSW" checked against Feitsma and Galway's database [1, 2] up to 2^64 by Dana Jacobsen. [1] http://www.janfeitsma.nl/math/psp2/database [2] http://www.cecm.sfu.ca/Pseudoprimes/index-2-to-64.html */ if (n < 11) { if (n == 2 || n == 3 || n == 5 || n == 7) return 1; else return 0; } if (!(n%2) || !(n%3) || !(n%5) || !(n%7)) return 0; if (n < 121) /* 11*11 */ return 1; if (!(n%11) || !(n%13) || !(n%17) || !(n%19) || !(n%23) || !(n%29) || !(n%31) || !(n%37) || !(n%41) || !(n%43) || !(n%47) || !(n%53)) return 0; if (n < 3481) /* 59*59 */ return 1; if (n > 1000000 && (!(n% 59) || !(n% 61) || !(n% 67) || !(n% 71) || !(n% 73) || !(n% 79) || !(n% 83) || !(n% 89) || !(n% 97) || !(n%101) || !(n%103) || !(n%107) || !(n%109) || !(n%113) || !(n%127) || !(n%131) || !(n%137) || !(n%139) || !(n%149))) return 0; return n_is_probabprime(n); }