//! This module contains implementations for different mathematical groups, each of which satisfies
//! our `UnknownOrderGroup` trait. They can be used with the accumulator and vector commitment
//! structures, or standalone if you have a custom application.
//!
use Integer;
use Debug;
use Hash;
use Sized;
pub use ClassElem;
use ClassCtx;
pub use create_discriminant;
pub use CLASS_GROUP_DISCRIMINANT;
pub use ClassGroup;
// pub fn multi_exp<G: Group>(alphas: &[G::Elem], x: &[Integer]) -> G::Elem {
// if alphas.len() == 1 {
// return alphas[0].clone();
// }
// let n_half = alphas.len() / 2;
// let alpha_l = &alphas[..n_half];
// let alpha_r = &alphas[n_half..];
// let x_l = &x[..n_half];
// let x_r = &x[n_half..];
// let x_star_l = x_l.iter().product();
// let x_star_r = x_r.iter().product();
// let l = multi_exp::<G>(alpha_l, x_l);
// let r = multi_exp::<G>(alpha_r, x_r);
// G::op(&G::exp(&l, &x_star_r), &G::exp(&r, &x_star_l))
// }