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}