multiversx_sdk/crypto/edwards25519/
projective_group_element.rs1use super::{completed_group_element::CompletedGroupElement, field_element::FieldElement};
2
3#[derive(Default)]
4pub struct ProjectiveGroupElement {
5    pub x: FieldElement,
6    pub y: FieldElement,
7    pub z: FieldElement,
8}
9
10impl ProjectiveGroupElement {
11    pub fn double(&self, r: &mut CompletedGroupElement) {
12        let mut t0 = FieldElement::default();
13
14        r.x.fe_square(&self.x);
15        r.z.fe_square(&self.y);
16        r.t.fe_square_2(&self.z);
17        r.y.fe_add(&self.x, &self.y);
18        t0.fe_square(&r.y);
19        r.y.fe_add(&r.z, &r.x);
20        r.z.fe_sub(&r.z.clone(), &r.x);
21        r.x.fe_sub(&t0, &r.y);
22        r.t.fe_sub(&r.t.clone(), &r.z.clone());
23    }
24}