wiki-farey-sequence.rs

1.0 kB · rust · 34 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlynum::factor::gcd;45const ORDER: usize = 8;67fn main() -> Result<()> {8    let mut board = Board::square();9    let frame = board.frame(0.08);10    let step = frame.h / ORDER as f64;11    let radius = step * 0.06;12    let mut total = 0usize;13    let mut fresh = 0usize;14    for q in 1..=ORDER {15        let y = frame.y + (q as f64 - 0.5) * step;16        board.segment((frame.x, y), (frame.x + frame.w, y), 1.5, ink::line());17        for b in 1..=q {18            for a in 0..=b {19                if gcd(a, b) != 1 {20                    continue;21                }22                let x = frame.x + frame.w * a as f64 / b as f64;23                let new = b == q;24                board.disc(x, y, radius, if new { ink::yellow() } else { ink::blue() });25                total += 1;26                fresh += new as usize;27            }28        }29    }30    assert_eq!(total, 83);31    assert_eq!(fresh, 23);32    save("wiki-farey-sequence", &board)?;33    Ok(())34}