haar_lib/math/
enumerate_quotients.rs1#[derive(Copy, Debug, Eq, PartialEq, Clone, Hash)]
5pub struct Quotient {
6 pub q: u64,
8 pub from: u64,
10 pub to: u64,
12}
13
14pub fn enumerate_quotients(n: u64) -> Vec<Quotient> {
18 let mut ret = vec![];
19
20 let mut k = 1;
21
22 while k * k <= n {
23 let q = n / k;
24 ret.push(Quotient { q, from: k, to: k });
25
26 k += 1;
27 }
28
29 while k <= n {
30 let q = n / k;
31 let u = n / q;
32 ret.push(Quotient { q, from: k, to: u });
33
34 k = u + 1;
35 }
36
37 ret.reverse();
38
39 ret
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test() {
48 for n in 1..200 {
49 let ans = enumerate_quotients(n);
50 for Quotient { q, from, to } in ans {
51 assert_eq!(q, n / from);
52 assert_eq!(q, n / to);
53 assert_ne!(q, n / (to + 1));
54 }
55 }
56 }
57}