cupcake/integer_arith/
util.rs1pub fn mul_high_word(a: u64, b:u64) -> u64{
8 ((a as u128 * b as u128) >> 64) as u64
9}
10
11pub fn compute_harvey_ratio(w: u64, q: u64) -> u64{
13 (((w as u128) << 64 )/ q as u128) as u64
14}
15
16pub fn mul_low_word(a: u64, b: u64) -> u64 {
17 let res = (a as u128) * (b as u128);
18 (res >> 64) as u64
19}
20
21#[cfg(test)]
22mod tests {
23 use super::*;
24
25 #[test]
26 fn test_mul_high_word(){
27 assert_eq!(mul_high_word(1,1), 0);
28 assert_eq!(mul_high_word(1u64 << 63,0), 0);
29 assert_eq!(mul_high_word(1u64 << 63,2), 1);
30 assert_eq!(mul_high_word(1u64 << 63,1u64 << 63), 1u64 << 62);
31 }
32
33 #[test]
34 fn test_compute_harvey_ratio(){
35 assert_eq!(compute_harvey_ratio(0,100), 0);
36 assert_eq!(compute_harvey_ratio(1,100), 184467440737095516);
37 }
38}