Skip to main content

pack_frac

Function pack_frac 

Source
fn pack_frac(a: u16, b: u16) -> u32
Examples found in repository?
crates/competitive/src/math/fast_prime_mod.rs (line 328)
317fn build_frac<const P: u32>() -> Box<[u32]> {
318    let mut frac = vec![0; FRAC_LEN].into_boxed_slice();
319    let mut stack = vec![(0u16, 1u16, 1u16, 1u16)];
320    while let Some((a, b, c, d)) = stack.pop() {
321        let nb = b + d;
322        if nb < FRAC_DEN_LIMIT {
323            stack.push((a + c, nb, c, d));
324            stack.push((a, b, a + c, nb));
325        } else {
326            let s = (a as u64 * P as u64 / ((1u64 << FRAC_SHIFT) * b as u64)) as usize;
327            let t = (c as u64 * P as u64 / ((1u64 << FRAC_SHIFT) * d as u64)) as usize;
328            frac[s] = pack_frac(a, b);
329            frac[t] = pack_frac(c, d);
330            let a = a.min(c);
331            let b = b.min(d);
332            if s + 1 < t {
333                for x in &mut frac[s + 1..t] {
334                    *x = pack_frac(a, b);
335                }
336            }
337        }
338    }
339    frac
340}