File size: 5,594 Bytes
4951e76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[
 {"name":"avg_floor","args":["u32","u32"],"ret":"u32","doc":"floor((a+b)/2) without overflow",
  "src":"pub fn avg_floor(a: u32, b: u32) -> u32 {\n    (a & b) + ((a ^ b) >> 1)\n}"},
 {"name":"abs_diff_u32","args":["u32","u32"],"ret":"u32","doc":"|a-b|",
  "src":"pub fn abs_diff_u32(a: u32, b: u32) -> u32 {\n    if a >= b { a - b } else { b - a }\n}"},
 {"name":"gcd","args":["u32","u32"],"ret":"u32","doc":"Euclid gcd, gcd(0,0)=0",
  "src":"pub fn gcd(a: u32, b: u32) -> u32 {\n    let mut x = a;\n    let mut y = b;\n    while y != 0 {\n        let t = x % y;\n        x = y;\n        y = t;\n    }\n    x\n}"},
 {"name":"isqrt","args":["u32"],"ret":"u32","doc":"floor(sqrt(n))",
  "src":"pub fn isqrt(n: u32) -> u32 {\n    let mut lo: u64 = 0;\n    let mut hi: u64 = 65536;\n    let n64 = n as u64;\n    while hi - lo > 1 {\n        let mid = (lo + hi) / 2;\n        if mid * mid <= n64 { lo = mid; } else { hi = mid; }\n    }\n    lo as u32\n}"},
 {"name":"clamp_add","args":["u8","u8","u8"],"ret":"u8","doc":"min(a+b, cap) without overflow",
  "src":"pub fn clamp_add(a: u8, b: u8, cap: u8) -> u8 {\n    let s = (a as u16) + (b as u16);\n    if s > cap as u16 { cap } else { s as u8 }\n}"},
 {"name":"round_up_div","args":["u32","u32"],"ret":"Option<u32>","doc":"ceil(a/b), None if b==0",
  "src":"pub fn round_up_div(a: u32, b: u32) -> Option<u32> {\n    if b == 0 {\n        None\n    } else {\n        Some(a / b + if a % b != 0 { 1 } else { 0 })\n    }\n}"},
 {"name":"next_multiple","args":["u32","u32"],"ret":"Option<u32>","doc":"smallest multiple of m that is >= a; None on m==0 or overflow",
  "src":"pub fn next_multiple(a: u32, m: u32) -> Option<u32> {\n    if m == 0 {\n        return None;\n    }\n    let r = a % m;\n    if r == 0 {\n        Some(a)\n    } else {\n        a.checked_add(m - r)\n    }\n}"},
 {"name":"digit_sum","args":["u32"],"ret":"u32","doc":"sum of decimal digits",
  "src":"pub fn digit_sum(n: u32) -> u32 {\n    let mut s = 0;\n    let mut x = n;\n    while x > 0 {\n        s += x % 10;\n        x /= 10;\n    }\n    s\n}"},
 {"name":"is_pow2","args":["u32"],"ret":"bool","doc":"n is a positive power of two",
  "src":"pub fn is_pow2(n: u32) -> bool {\n    n != 0 && (n & (n - 1)) == 0\n}"},
 {"name":"popcount","args":["u32"],"ret":"u32","doc":"number of set bits",
  "src":"pub fn popcount(n: u32) -> u32 {\n    let mut c = 0;\n    let mut x = n;\n    while x != 0 {\n        c += x & 1;\n        x >>= 1;\n    }\n    c\n}"},
 {"name":"ilog2_floor","args":["u32"],"ret":"Option<u32>","doc":"floor(log2 n), None for 0",
  "src":"pub fn ilog2_floor(n: u32) -> Option<u32> {\n    if n == 0 {\n        return None;\n    }\n    let mut k = 0;\n    let mut x = n;\n    while x > 1 {\n        x >>= 1;\n        k += 1;\n    }\n    Some(k)\n}"},
 {"name":"triangular","args":["u32"],"ret":"u64","doc":"n(n+1)/2 in u64",
  "src":"pub fn triangular(n: u32) -> u64 {\n    let m = n as u64;\n    m * (m + 1) / 2\n}"},
 {"name":"collatz_steps","args":["u16"],"ret":"u32","doc":"steps to reach 1 (0 for n<=1)",
  "src":"pub fn collatz_steps(n: u16) -> u32 {\n    let mut x = n as u64;\n    let mut s = 0;\n    while x > 1 {\n        x = if x % 2 == 0 { x / 2 } else { 3 * x + 1 };\n        s += 1;\n    }\n    s\n}"},
 {"name":"sat_sub_i32","args":["i32","i32"],"ret":"i32","doc":"saturating subtraction",
  "src":"pub fn sat_sub_i32(a: i32, b: i32) -> i32 {\n    let d = (a as i64) - (b as i64);\n    if d > i32::MAX as i64 {\n        i32::MAX\n    } else if d < i32::MIN as i64 {\n        i32::MIN\n    } else {\n        d as i32\n    }\n}"},
 {"name":"sign3","args":["i32"],"ret":"i32","doc":"-1,0,1",
  "src":"pub fn sign3(x: i32) -> i32 {\n    if x > 0 {\n        1\n    } else if x < 0 {\n        -1\n    } else {\n        0\n    }\n}"},
 {"name":"pow_mod","args":["u32","u32","u32"],"ret":"u32","doc":"b^e mod m, m>0 (m==0 -> 0)",
  "src":"pub fn pow_mod(b: u32, e: u32, m: u32) -> u32 {\n    if m == 0 {\n        return 0;\n    }\n    let mm = m as u64;\n    let mut base = (b as u64) % mm;\n    let mut exp = e;\n    let mut acc: u64 = 1 % mm;\n    while exp > 0 {\n        if exp & 1 == 1 {\n            acc = (acc * base) % mm;\n        }\n        base = (base * base) % mm;\n        exp >>= 1;\n    }\n    acc as u32\n}"},
 {"name":"varint_len","args":["u64"],"ret":"u32","doc":"LEB128 byte length of n",
  "src":"pub fn varint_len(n: u64) -> u32 {\n    let mut len = 1;\n    let mut x = n;\n    while x >= 128 {\n        x >>= 7;\n        len += 1;\n    }\n    len\n}"},
 {"name":"zigzag_enc","args":["i32"],"ret":"u32","doc":"protobuf zigzag encode",
  "src":"pub fn zigzag_enc(n: i32) -> u32 {\n    ((n << 1) ^ (n >> 31)) as u32\n}"},
 {"name":"bit_reverse8","args":["u8"],"ret":"u8","doc":"reverse bits of a byte",
  "src":"pub fn bit_reverse8(b: u8) -> u8 {\n    let mut r = 0u8;\n    let mut x = b;\n    let mut i = 0;\n    while i < 8 {\n        r = (r << 1) | (x & 1);\n        x >>= 1;\n        i += 1;\n    }\n    r\n}"},
 {"name":"lcm_checked","args":["u32","u32"],"ret":"Option<u32>","doc":"lcm, None on overflow, lcm(_,0)=Some(0)",
  "src":"pub fn lcm_checked(a: u32, b: u32) -> Option<u32> {\n    if a == 0 || b == 0 {\n        return Some(0);\n    }\n    let mut x = a;\n    let mut y = b;\n    while y != 0 {\n        let t = x % y;\n        x = y;\n        y = t;\n    }\n    (a / x).checked_mul(b)\n}"},
 {"name":"midpoint_idx","args":["usize","usize"],"ret":"usize","doc":"lo + (hi-lo)/2 for lo<=hi, else lo",
  "src":"pub fn midpoint_idx(lo: usize, hi: usize) -> usize {\n    if hi <= lo { lo } else { lo + (hi - lo) / 2 }\n}"}
]