use crate::primes;
pub trait OriginStrategy {
fn calculate_origin(&self, p: u64) -> u64;
}
pub struct MomaRing<S: OriginStrategy> {
pub modulus: u64,
strategy: S,
}
impl<S: OriginStrategy> MomaRing<S> {
pub fn new(modulus: u64, strategy: S) -> Self {
Self { modulus, strategy }
}
pub fn residue(&self, value: u64, prime_context: u64) -> u64 {
if self.modulus == 0 {
return value;
}
let origin = self.strategy.calculate_origin(prime_context);
(value.wrapping_add(origin)) % self.modulus
}
pub fn signature(&self, p: u64) -> u64 {
if p < 3 { return 0; } let input = p.wrapping_add(primes::prev_prime(p));
self.residue(input, p)
}
}