use crate::elliptic_curve::traits::IsEllipticCurve;
use crate::field::element::FieldElement;
use core::fmt::Debug;
pub trait IsMontgomery: IsEllipticCurve + Clone + Debug {
fn a() -> FieldElement<Self::BaseField>;
fn b() -> FieldElement<Self::BaseField>;
fn defining_equation(
x: &FieldElement<Self::BaseField>,
y: &FieldElement<Self::BaseField>,
) -> FieldElement<Self::BaseField> {
(Self::b() * y.square()) - (x.pow(3_u16) + Self::a() * x.square() + x)
}
fn defining_equation_projective(
x: &FieldElement<Self::BaseField>,
y: &FieldElement<Self::BaseField>,
z: &FieldElement<Self::BaseField>,
) -> FieldElement<Self::BaseField> {
z * Self::b() * y.square() - x.pow(3_u16) - z * Self::a() * x.square() - z.square() * x
}
}