ring-algorithm 0.6.0

algorithms on ring (Abstruct Algebra)
Documentation
use criterion::{
    black_box, criterion_group, criterion_main, AxisScale, BenchmarkId, Criterion,
    PlotConfiguration,
};
use is_prime_for_primitive_int::IsPrime;
use ring_algorithm::*;
type Z = rug::Integer;

fn make_input(len: usize) -> (Vec<Z>, Vec<Z>) {
    let mut u = Vec::with_capacity(len);
    let mut m = Vec::with_capacity(len);
    for i in 3.. {
        if i.is_prime() {
            let a = rand::random::<u64>() % i;
            u.push(Z::from(a));
            m.push(Z::from(i));
            if m.len() >= len {
                break;
            }
        }
    }
    (u, m)
}

pub fn bench(c: &mut Criterion) {
    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
    let mut group = c.benchmark_group("crt");
    group.plot_config(plot_config);
    for i in 5..=15 {
        let size = 1 << i;
        let (u, m) = make_input(size);
        if i <= 11 {
            group.bench_with_input(BenchmarkId::new("crt", size), &size, |b, &_| {
                b.iter(|| chinese_remainder_theorem(black_box(&u), black_box(&m)))
            });
        }
        group.bench_with_input(BenchmarkId::new("fcrt", size), &size, |b, &_| {
            b.iter(|| fast_chinese_remainder_theorem(black_box(&u), black_box(&m)))
        });
    }
    group.finish();
}

criterion_group! {
    name = benches;
    config = Criterion::default().sample_size(10);
    targets = bench
}
criterion_main!(benches);