wiki-riemann-zeta-function.rs
1.5 kB · rust · 44 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlynum::lattice::zeta_whole;45const TERMS: usize = 40;6const POWERS: [u32; 3] = [2, 3, 4];7const FLOOR: f64 = 0.94;8const ROOF: f64 = 1.72;910fn main() -> Result<()> {11 let mut board = Board::square();12 let frame = board.frame(0.09);13 let place = |n: usize, value: f64| {14 (15 frame.x + frame.w * (n - 1) as f64 / (TERMS - 1) as f64,16 frame.y + frame.h * (1.0 - (value - FLOOR) / (ROOF - FLOOR)),17 )18 };19 let limits: Vec<f64> = POWERS.iter().map(|&s| zeta_whole(s)).collect();20 for limit in &limits {21 let (_, y) = place(1, *limit);22 board.segment((frame.x, y), (frame.x + frame.w, y), 1.5, ink::line());23 }24 let inks = [ink::blue(), ink::orange(), ink::green()];25 let mut ends = Vec::new();26 for (k, &s) in POWERS.iter().enumerate() {27 let mut running = 0.0f64;28 let mut path = Vec::with_capacity(TERMS);29 for n in 1..=TERMS {30 running += 1.0 / (n as f64).powi(s as i32);31 path.push(place(n, running));32 }33 assert_eq!(path.len(), TERMS);34 board.polyline(&path, 4.0, inks[k]);35 board.disc(path[TERMS - 1].0, path[TERMS - 1].1, 9.0, inks[k]);36 ends.push(running);37 }38 assert_eq!(ends.len(), 3);39 assert!((ends[0] - limits[0]).abs() < 0.026);40 assert!((ends[1] - limits[1]).abs() < 0.0004);41 assert!((ends[2] - limits[2]).abs() < 0.00002);42 save("wiki-riemann-zeta-function", &board)?;43 Ok(())44}