use mcl::{init, bn::*, traits::*, common::Base};
fn main() {
let a_str = "123";
let b_str = "456";
init::init_curve(init::Curve::Bls12_381);
let a = Fr::from_str(a_str, Base::Dec);
let b = Fr::from_str(b_str, Base::Dec);
let ab = a * b;
println!("{} x {} = {}", a_str, b_str, ab.get_str(Base::Dec));
let P = G1::hash_and_map(b"this").unwrap();
let Q = G2::hash_and_map(b"that").unwrap();
println!("{}", P.get_str(Base::Hex));
println!("{}", Q.get_str(Base::Hex));
let aP = &P * a;
let bQ = &Q * b;
let e = GT::from_pairing(&P, &Q);
println!("{}", e.get_str(Base::Hex));
let e1 = e.pow(&a);
let e2 = GT::from_pairing(&aP, &Q);
assert_eq!(e1, e2);
let e1 = e.pow(&b);
let e2 = GT::from_pairing(&P, &bQ);
assert_eq!(e1, e2);
}