moire.rs

2.8 kB · rust · 88 lines

1use mrlylab::moire::pairs::{correlation, sampled, witness};2use mrlynum::factor::gcd;3use mrlynum::prime::is_prime;45const SAMPLED: [(usize, usize); 7] = [(3, 5), (3, 9), (5, 15), (9, 15), (5, 7), (7, 21), (9, 21)];67// CORRELATION LAW89pub fn the_moire_correlation_law_for_odd() -> Result<(), String> {10    let (mut worst, mut at) = (0.0f64, (0, 0));11    for m in (3..=99).step_by(2) {12        for n in (m + 2..=99).step_by(2) {13            let exact = correlation(m, n);14            if exact != correlation(n, m) {15                return Err(format!("the law is not symmetric at {m} and {n}"));16            }17            if (exact == 0.0) != (gcd(m, n) == 1) {18                return Err(format!(19                    "the zero set is not the coprime set at {m} and {n}"20                ));21            }22            let gap = (exact - closed(m, n)).abs();23            if gap > worst {24                (worst, at) = (gap, (m, n));25            }26        }27    }28    if worst > 5.6e-17 {29        return Err(format!(30            "the closed form parts from the integration by {worst} at {} and {}",31            at.0, at.132        ));33    }34    for (m, n) in SAMPLED {35        let gap = (correlation(m, n) - sampled(m, n)).abs();36        if gap > 1e-12 {37            return Err(format!(38                "the sampled layers part from the law by {gap} at {m} and {n}"39            ));40        }41    }42    Ok(())43}4445fn closed(m: usize, n: usize) -> f64 {46    let factor = gcd(m, n) as i128;47    let (m, n) = (m as i128, n as i128);48    let apart = (m - 1) * (n - 1);49    let echo = factor * factor - 1;50    let spread = |side: i128| 4 * side * side - (side - 1) * (side - 1);51    (echo * (2 * apart + echo)) as f64 / (apart as f64 * ((spread(m) * spread(n)) as f64).sqrt())52}5354// PRIME DETECTOR5556pub fn the_stack_is_an_exact_prime() -> Result<(), String> {57    let (mut primes, mut composites) = (0, 0);58    let (mut least, mut at) = (1.0f64, 0);59    for n in (3..=199).step_by(2) {60        let trial = witness(n).map_err(|_| format!("the stack cannot try {n}"))?;61        if trial.prime != is_prime(n) {62            return Err(format!("the detector misreads {n}"));63        }64        if trial.prime {65            primes += 1;66            continue;67        }68        composites += 1;69        if trial.max <= 0.0 {70            return Err(format!("the composite {n} sits at {}", trial.max));71        }72        if trial.max < least {73            (least, at) = (trial.max, n);74        }75    }76    if (primes, composites) != (45, 54) {77        return Err(format!(78            "the stack reads {primes} primes and {composites} composites"79        ));80    }81    if at != 169 {82        return Err(format!("the least composite correlation sits at {at}"));83    }84    if (least - 0.0517383).abs() >= 1e-7 {85        return Err(format!("the least composite correlation reads {least}"));86    }87    Ok(())88}