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}