wiki-eulers-totient.rs

1.2 kB · rust · 41 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, plot, save, Board};3use mrlynum::lattice::totients;4use mrlynum::prime::is_prime;56const TOP: usize = 60;78fn main() -> Result<()> {9    let mut board = Board::square();10    let frame = board.frame(0.08);11    let phi = totients(TOP);12    assert_eq!(phi[59], 58);13    let ceiling = (TOP - 1) as f64;14    let slot = frame.w / TOP as f64;15    let pad = slot * 0.14;16    let mut touching = 0usize;17    for n in 1..=TOP {18        let hit = n > 1 && phi[n] as usize == n - 1;19        assert_eq!(hit, is_prime(n));20        touching += hit as usize;21        let height = frame.h * phi[n] as f64 / ceiling;22        board.rect(23            frame.x + (n - 1) as f64 * slot + pad,24            frame.y + frame.h - height,25            slot - 2.0 * pad,26            height,27            if hit { ink::yellow() } else { ink::blue() },28        );29    }30    assert_eq!(touching, 17);31    let rise = |n: usize| {32        (33            frame.x + (n as f64 - 0.5) * slot,34            frame.y + frame.h * (1.0 - (n - 1) as f64 / ceiling),35        )36    };37    board.segment(rise(1), rise(TOP), 2.0, ink::line());38    plot::baseline(&mut board, frame, ink::line());39    save("wiki-eulers-totient", &board)?;40    Ok(())41}