use crypto_bigint::{const_prime_monty_params, Uint};
use ec::curve_edwards::EdwardsCurve;
use ec::curve_jacobi_intersection::JacobiIntersectionCurve;
use ec::curve_jacobi_quartic::JacobiQuarticCurve;
use ec::curve_montgomery::MontgomeryCurve;
use ec::curve_ops::Curve;
use ec::curve_weierstrass::WeierstrassCurve;
use fp::fp_element::FpElement;
use rand::rngs::ThreadRng;
const_prime_monty_params!(Fp19Mod, Uint<1>, "0000000000000013", 2);
type F19 = FpElement<Fp19Mod, 1>;
fn fp(x: u64) -> F19 {
F19::from_u64(x)
}
fn show_curve<C>(name: &str, curve: &C, rng: &mut ThreadRng)
where
C: Curve + core::fmt::Display,
C::Point: core::fmt::Display,
{
println!("============================================================");
println!("{name}");
println!("------------------------------------------------------------");
println!("curve compact : {}", curve);
println!("curve pretty :\n{:#}", curve);
let p = curve.random_point(rng);
println!("point compact : {}", p);
println!("point pretty :\n{:#}", p);
println!("on curve? : {}", curve.is_on_curve(&p));
println!();
}
fn main() {
let mut rng = rand::rng();
let w = WeierstrassCurve::new_short(fp(2), fp(3));
show_curve("Weierstrass", &w, &mut rng);
let m = MontgomeryCurve::new(fp(3), fp(1));
show_curve("Montgomery", &m, &mut rng);
let e = EdwardsCurve::new(fp(2));
show_curve("Edwards", &e, &mut rng);
let jq = JacobiQuarticCurve::new(fp(3), fp(5));
show_curve("Jacobi quartic", &jq, &mut rng);
let ji = JacobiIntersectionCurve::new(fp(2));
show_curve("Jacobi intersection", &ji, &mut rng);
}