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}