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}