use crate::primes;
use std::collections::HashSet;
#[derive(Debug)]
pub struct GoldbachProjector {
prime_set: HashSet<u64>,
}
impl GoldbachProjector {
pub fn new(limit: u64) -> Self {
let prime_set = (2..=limit).filter(|&n| primes::is_prime(n)).collect();
Self { prime_set }
}
pub fn project(&self, n: u64) -> Vec<(u64, u64)> {
if n <= 2 || n % 2 != 0 {
return Vec::new();
}
self.prime_set
.iter()
.filter(|&&p1| p1 <= n / 2) .filter_map(|&p1| {
let p2 = n - p1;
if self.prime_set.contains(&p2) {
Some((p1, p2))
} else {
None
}
})
.collect()
}
}