use std::time::Instant;
use puremp::Int;
fn factorial(n: u64) -> Int {
let mut acc = Int::one();
for k in 2..=n {
acc = acc.mul(&Int::from_i64(k as i64));
}
acc
}
fn bench<F, R>(label: &str, f: F) -> R
where
F: FnOnce() -> R,
{
let start = Instant::now();
let out = f();
println!("{label:<28} {:?}", start.elapsed());
out
}
fn main() {
let f2000 = bench("factorial(2000)", || factorial(2000));
println!(" digits: {}", f2000.to_string().len());
let big = bench("factorial(20000)", || factorial(20000));
println!(" digits: {}", big.to_string().len());
bench("2^1000000", || Int::from_i64(2).pow(1_000_000));
let a = factorial(5000);
let b = factorial(5001);
bench("mul(5000!, 5001!)", || a.mul(&b));
}