Exemple #1
0
        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));
        }