2022-05-19 15:45:26 +00:00
|
|
|
package nu.marginalia.util;
|
|
|
|
|
2023-03-11 12:48:40 +00:00
|
|
|
public class NextPrimeUtil {
|
2022-05-19 15:45:26 +00:00
|
|
|
|
2023-03-05 12:03:55 +00:00
|
|
|
/** Returns the next prime value starting at start. If start is prime, return start.
|
|
|
|
*/
|
|
|
|
public static long nextPrime(long start, long direction) {
|
|
|
|
if (isCoprime(start, 2)) {
|
|
|
|
start = start + direction;
|
2022-05-19 15:45:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
long val;
|
2023-03-05 12:03:55 +00:00
|
|
|
for (val = start; !isPrime(val); val += 2*direction) {}
|
2022-05-19 15:45:26 +00:00
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean isPrime(long v) {
|
|
|
|
if (v <= 2) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if ((v & 1) == 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
for (long t = 3; t <= v/3; t++) {
|
|
|
|
if ((v % t) == 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2023-03-05 12:03:55 +00:00
|
|
|
public static boolean isCoprime(long a, long b) {
|
2022-05-19 15:45:26 +00:00
|
|
|
if (a == 0 || b == 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a > b) {
|
|
|
|
return (a % b) == 0;
|
|
|
|
}
|
|
|
|
return (b % a) == 0;
|
|
|
|
}
|
|
|
|
}
|