pub fn find_next_prime(mut n: f64) -> f64 {
n = n.round();
if n <= 2.0 {
return 2.0;
} else if n <= 3.0 {
return 3.0;
}
let remainder = n % 6.0;
if remainder != 0.0 {
n = n + 6.0 - remainder;
let candidate = n - 1.0;
if is_prime(candidate) {
return candidate;
}
}
loop {
let candidate = n + 1.0;
if is_prime(candidate) {
return candidate;
}
let candidate = n + 5.0;
if is_prime(candidate) {
return candidate;
}
n += 6.0;
}
}
pub fn find_next_prime_with_load_factor(n: f64, load_factor: f64) -> f64 {
let minimum = n / load_factor;
find_next_prime(minimum)
}
pub fn is_prime(n: f64) -> bool {
if n <= 1.0 {
return false;
}
if n <= 3.0 {
return true;
}
if n % 2.0 == 0.0 || n % 3.0 == 0.0 {
return false;
}
let mut i = 5.0;
while i * i <= n {
if n % i == 0.0 || n % (i + 2.0) == 0.0 {
return false;
}
i += 6.0;
}
true
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_find_next_prime() {
assert_eq!(find_next_prime(0.0), 2.0);
assert_eq!(find_next_prime(2.0), 2.0);
assert_eq!(find_next_prime(3.0), 3.0);
assert_eq!(find_next_prime(4.0), 5.0);
assert_eq!(find_next_prime(10.0), 11.0);
assert_eq!(find_next_prime(28.0), 29.0);
assert_eq!(find_next_prime(102.0), 103.0);
assert_eq!(find_next_prime(105.0), 107.0);
assert_eq!(find_next_prime(100.0), 101.0);
assert_eq!(find_next_prime(1000.0), 1009.0);
assert_eq!(find_next_prime(4800.0), 4801.0);
assert_eq!(find_next_prime(5000.0), 5003.0);
assert_eq!(find_next_prime(6000.0), 6007.0);
assert_eq!(find_next_prime(6850.0), 6857.0);
assert_eq!(find_next_prime(7900.0), 7901.0);
assert_eq!(find_next_prime(7907.0), 7907.0);
}
#[test]
fn test_find_next_prime_with_load_factor() {
assert_eq!(find_next_prime_with_load_factor(4800.0, 0.5), 9601.0);
assert_eq!(find_next_prime_with_load_factor(4800.0, 0.7), 6857.0);
}
#[test]
fn test_is_prime() {
assert_eq!(is_prime(1.0), false);
assert_eq!(is_prime(2.0), true);
assert_eq!(is_prime(3.0), true);
assert_eq!(is_prime(4.0), false);
}
}