Exemple #1
0
        public BigIntegerPoint SummarizePoints(BigIntegerPoint first, BigIntegerPoint second)
        {
            if (first.X == 0 && first.Y == 0)
            {
                return(second);
            }

            if (first.X == 0 && second.Y == 0)
            {
                return(first);
            }

            if (first.X == second.X && (first.X == 0 || first.Y != second.Y))
            {
                return(new BigIntegerPoint(0, 0));
            }

            BigInteger numerator;
            BigInteger denominator;

            if (first.X != second.X)
            {
                numerator   = second.Y ^ first.Y;
                denominator = second.X ^ first.X;
            }
            else
            {
                numerator = PolynominalService.MultiplyPolynominal(first.X, first.X) ^
                            PolynominalService.MultiplyPolynominal(A, first.Y);
                denominator = PolynominalService.MultiplyPolynominal(first.X, A);
            }

            denominator = PolynominalService.InversePolynominal(denominator, Polynome);
            var k = PolynominalService.MultiplyPolynominal(numerator, denominator);

            k = PolynominalService.ModPolynominal(k, Polynome);

            var x = PolynominalService.MultiplyPolynominal(k, k);

            x ^= PolynominalService.MultiplyPolynominal(A, k);
            x ^= B;
            if (first.X != second.X)
            {
                x ^= first.X;
                x ^= second.X;
            }
            x = PolynominalService.ModPolynominal(x, Polynome);

            var y = x ^ first.X;

            y  = PolynominalService.MultiplyPolynominal(y, k);
            y ^= first.Y;
            y ^= PolynominalService.MultiplyPolynominal(A, x);
            y  = PolynominalService.ModPolynominal(y, Polynome);

            return(new BigIntegerPoint(x, y));
        }
        public BigIntegerPoint SummarizePoints(BigIntegerPoint first, BigIntegerPoint second)
        {
            if (first.X == second.X && first.Y == second.Y)
            {
                return(new BigIntegerPoint(0, 0));
            }

            BigInteger numerator;
            BigInteger denominator;

            if (first.X != second.X)
            {
                numerator   = second.Y ^ first.Y;
                denominator = second.X ^ first.X;
            }
            else
            {
                numerator   = PolynominalService.MultiplyPolynominal(first.X, second.X);
                numerator  ^= B;
                denominator = A;
            }

            denominator = PolynominalService.InversePolynominal(denominator, Polynome);
            var k = PolynominalService.MultiplyPolynominal(numerator, denominator);

            k = PolynominalService.ModPolynominal(k, Polynome);

            var x = PolynominalService.MultiplyPolynominal(k, k);

            if (first.X != second.X)
            {
                x ^= first.X;
                x ^= second.X;
            }
            x = PolynominalService.ModPolynominal(x, Polynome);

            var y = first.X ^ x;

            y  = PolynominalService.MultiplyPolynominal(y, k);
            y ^= first.Y;
            y ^= A;
            y  = PolynominalService.ModPolynominal(y, Polynome);

            return(new BigIntegerPoint(x, y));
        }