public ECPoint Double() { if (this.IsInifinity()) { return(this); } if (_x2 == null) { _x2 = _field.Multiply(_x, _x); } if (_z2 == null) { _z2 = _field.Multiply(_z, _z); } if (_y2 == null) { _y2 = _field.Multiply(_y, _y); } if (_y4 == null) { _y4 = _field.Multiply(_y2, _y2); } Number l1; if (_group.IsA_Minus3) { l1 = _field.Multiply(_field.Subtract(_x, _z2), _field.Add(_x, _z2)); l1 = _field.Add(_field.Add(l1, l1), l1); } else { if (_z4 == null) { _z4 = _field.Multiply(_z2, _z2); } l1 = _field.Add(_field.Add(_field.Add(_x2, _x2), _x2), _field.Multiply(_group.A, _z4)); } Number Z = _field.Multiply(_y, _z); Z = _field.Add(Z, Z); Number l2 = _field.Multiply(_x, _y2); l2 = _field.Add(l2, l2); l2 = _field.Add(l2, l2); Number X = _field.Subtract(_field.Multiply(l1, l1), _field.Add(l2, l2)); Number l3 = _field.Add(_y4, _y4); l3 = _field.Add(l3, l3); l3 = _field.Add(l3, l3); Number Y = _field.Subtract(_field.Multiply(l1, _field.Subtract(l2, X)), l3); return(new ECPoint(_group, X, Y, Z)); }