antic 0.1.0

bindings for the antic C library for algebraic number theory
Documentation
use antic::safe::*;
use rand::Rng;
use std::time::Instant;

fn main() {
    let n: i64 = 100;
    let num_tests: usize = 1000;

    eprintln!("n = {}", n);
    eprintln!("num_tests = {}", num_tests);

    let num_per_test: usize = 6;
    let max_num_terms: usize = 5;

    let mut cyclotomic_polynomial_n = RationalPolynomial::cyclotomic(n as u64);
    let mut cyclotomic_field_n = NumberField::new(&mut cyclotomic_polynomial_n);
    let mut nums: Vec<Vec<NumberFieldElement>> = vec![];
    let mut rng = rand::thread_rng();

    eprintln!("generating test data");
    for i in 0..num_tests {
        nums.push(vec![]);
        for _ in 0..num_per_test {
            let mut num = NumberFieldElement::new(&mut cyclotomic_field_n);
            let num_terms = rng.gen_range(1, max_num_terms);
            for _ in 0..num_terms {
                let mut term = NumberFieldElement::new(&mut cyclotomic_field_n);
                let mut pol = RationalPolynomial::new();
                let exp: i64 = rng.gen_range(1, n);
                let numerator = rng.gen_range(1, 11);
                let denominator = rng.gen_range(1, 11);
                let mut coeff = Rational::new(numerator, denominator);
                pol.set_coeff(exp, &mut coeff);
                term.set_to_poly(&mut pol, &mut cyclotomic_field_n);
                let mut sum = NumberFieldElement::new(&mut cyclotomic_field_n);
                sum.set_to_sum_of(&mut num, &mut term, &mut cyclotomic_field_n);
                num.set(&mut sum, &mut cyclotomic_field_n);
            }
            nums[i].push(num);
        }
    }

    eprintln!("starting benchmark");

    let start = Instant::now();

    for i in 0..num_tests {
        let chunk = &mut nums[i];
        let mut prod1 = NumberFieldElement::new(&mut cyclotomic_field_n);
        prod1.set_to_mul_of(
            &mut chunk[0].clone(),
            &mut chunk[1].clone(),
            &mut cyclotomic_field_n,
        );

        let mut prod2 = NumberFieldElement::new(&mut cyclotomic_field_n);
        prod2.set_to_mul_of(
            &mut chunk[2].clone(),
            &mut chunk[3].clone(),
            &mut cyclotomic_field_n,
        );

        let mut prod3 = NumberFieldElement::new(&mut cyclotomic_field_n);
        prod3.set_to_mul_of(
            &mut chunk[4].clone(),
            &mut chunk[5].clone(),
            &mut cyclotomic_field_n,
        );

        let mut sum1 = NumberFieldElement::new(&mut cyclotomic_field_n);
        sum1.set_to_sum_of(&mut prod1, &mut prod2, &mut cyclotomic_field_n);

        let mut sum2 = NumberFieldElement::new(&mut cyclotomic_field_n);
        sum2.set_to_sum_of(&mut sum1, &mut prod3, &mut cyclotomic_field_n);
    }

    eprintln!("time elapsed (ms):");
    println!("{}", start.elapsed().as_millis());
}