use crate::core::OriginStrategy;
use crate::primes;
#[derive(Debug, Clone, Copy)]
pub struct Fixed(pub u64);
impl OriginStrategy for Fixed {
fn calculate_origin(&self, _p: u64) -> u64 {
self.0
}
}
#[derive(Debug, Clone, Copy)]
pub struct PrimeGap;
impl OriginStrategy for PrimeGap {
fn calculate_origin(&self, p: u64) -> u64 {
if p < 3 { return 0; }
p - primes::prev_prime(p)
}
}
#[derive(Debug, Clone, Copy)]
pub struct CompositeMass;
impl OriginStrategy for CompositeMass {
fn calculate_origin(&self, p: u64) -> u64 {
let p_next = primes::next_prime(p);
(p + 1..p_next)
.filter(|&n| !primes::is_prime(n))
.map(primes::prime_factor_mass)
.sum()
}
}