コード例 #1
0
        public static void GetAllPoints()
        {
            BigInteger fieldOrder = BigInteger.Parse("113") * BigInteger.Parse("19");
            BigInteger x, y, d;
            var        random = new Random();

            do
            {
                x = BigIntegerExtensions.GetNextRandom(random, fieldOrder);
                y = BigIntegerExtensions.GetNextRandom(random, fieldOrder);
                d = ((x * x + y * y - 1) * (x * x * y * y).Inverse(fieldOrder)).Mod(fieldOrder);
            } while (d == 1 || d == 0);

            //     d = 1;
            Console.WriteLine($"x = {x}");
            Console.WriteLine($"y = {y}");

            var edwardsCurve = new AffineEdwardsCurve(d, fieldOrder);

            Console.WriteLine(edwardsCurve);

            var pointsFactory = new PointsFactory(edwardsCurve);

            var points = new List <AffineEdwardsCurvePoint>();

            for (var x1 = 0; x1 < fieldOrder; x1++)
            {
                for (var y1 = 0; y1 < fieldOrder; y1++)
                {
                    if (!pointsFactory.SoftCheckPointOnCurve(x1, y1))
                    {
                        continue;
                    }

                    points.Add(pointsFactory.CreatePoint(x1, y1));
                }
            }

            Console.WriteLine("Edwards curve has " + points.Count + " points");

            var calculator = new AffineEdwardsCurvePointCalculator();
            var pairs      = points.Join(points, p1 => 1, p2 => 1, (p1, p2) => new { p1, p2 }).ToArray();

            try
            {
                var sumPoints = pairs.AsParallel().Select(pair => calculator.Sum(pair.p1, pair.p2));
                Console.WriteLine("Sums were calculated without any exception. Sums count:" + sumPoints.Count());
            }
            catch (AggregateException e)
            {
                var gcdFoundException = e.InnerExceptions.First() as GcdFoundException;
                if (gcdFoundException == null)
                {
                    throw;
                }

                Console.WriteLine(gcdFoundException.Message);
                Console.WriteLine(gcdFoundException.GreatestCommonDivisor);
            }
        }
コード例 #2
0
        public static void GetAllPointsSpecial()
        {
            BigInteger fieldOrder = BigInteger.Parse("113") * BigInteger.Parse("19");
            BigInteger x = 705, y = 232, d = 1577;
            var        edwardsCurve = new AffineEdwardsCurve(d, fieldOrder);

            var pointsFactory = new PointsFactory(edwardsCurve);
            var points        = new List <AffineEdwardsCurvePoint>();

            for (var x1 = 0; x1 < fieldOrder; x1++)
            {
                for (var y1 = 0; y1 < fieldOrder; y1++)
                {
                    if (!pointsFactory.SoftCheckPointOnCurve(x1, y1))
                    {
                        continue;
                    }

                    points.Add(pointsFactory.CreatePoint(x1, y1));
                }
            }

            Console.WriteLine("Edwards curve has " + points.Count + " points");

            var calculator = new AffineEdwardsCurvePointCalculator();
            var pairs      = points.Join(points, p1 => 1, p2 => 1, (p1, p2) => new { p1, p2 }).ToArray();


            try
            {
                var sumPoints = pairs.AsParallel().Select(pair => calculator.Sum(pair.p1, pair.p2));
                Console.WriteLine("Sums were calculated without any exception. Sums count:" + sumPoints.Count());
            }
            catch (AggregateException e)
            {
                var gcdFoundException = e.InnerExceptions.First() as GcdFoundException;
                if (gcdFoundException == null)
                {
                    throw;
                }

                Console.WriteLine(gcdFoundException.Message);
                Console.WriteLine(gcdFoundException.GreatestCommonDivisor);
            }
        }
コード例 #3
0
        public static void CheckSum()
        {
            BigInteger fieldOrder    = 11;
            BigInteger d             = 2;
            var        edwardsCurve  = new AffineEdwardsCurve(d, fieldOrder);
            var        pointsFactory = new PointsFactory(edwardsCurve);

            var points = new[]
            {
                CreatePoint(0, 1, pointsFactory),
                CreatePoint(0, 10, pointsFactory),
                CreatePoint(1, 0, pointsFactory),
                CreatePoint(3, 4, pointsFactory),
                CreatePoint(3, 7, pointsFactory),
                CreatePoint(4, 3, pointsFactory),
                CreatePoint(4, 8, pointsFactory),
                CreatePoint(7, 3, pointsFactory),
                CreatePoint(7, 8, pointsFactory),
                CreatePoint(8, 4, pointsFactory),
                CreatePoint(8, 7, pointsFactory),
                CreatePoint(10, 0, pointsFactory)
            };

            for (int i = 0; i < points.Length; i++)
            {
                for (int j = 0; j < points.Length; j++)
                {
                    TestSum(points[i], points[j]);
                }
            }

//            return;
//            var sum = CreatePoint(7, 3, pointsFactory);
//
//            var calculator = new AffineEdwardsCurvePointCalculator();
//            var p3 = calculator.Sum(point1, point2);
//            CheckEquality(p3.ParameterX, p3.ParameterY, d, fieldOrder);
//
//            Console.WriteLine(point1);
//            Console.WriteLine(point2);
//            Console.WriteLine(p3);
        }
コード例 #4
0
        public LenstraFactorizationResult GetDividerWithCancel(BigInteger n, Random random, CancellationToken token)
        {
            var startTime = DateTime.Now;

            BigInteger x, y, d;

            do
            {
                x = BigIntegerExtensions.GetNextRandom(random, n);
                y = BigIntegerExtensions.GetNextRandom(random, n);
                d = ((x * x + y * y - 1) * (x * x * y * y).Inverse(n)).Mod(n);
            } while (d == 1 || d == 0);

            var edwardsCurve  = new AffineEdwardsCurve(d, n);
            var pointsFactory = new PointsFactory(edwardsCurve);

            var calculator = new AffineEdwardsCurvePointCalculator();
            var point1     = pointsFactory.CreatePoint(x, y);

            BigInteger p = 2;

            try
            {
                while (p < B1 && !token.IsCancellationRequested)
                {
                    var pr = p;
                    while (pr < B1 && !token.IsCancellationRequested)
                    {
                        point1 = calculator.Mult(p, point1);
                        var gcd = BigInteger.GreatestCommonDivisor(point1.ParameterX, n);
                        if (gcd != BigInteger.One)
                        {
                            throw new GcdFoundException(gcd);
                        }

                        pr *= p;
                    }

                    p = BigIntegerExtensions.NextPrimaryMillerRabin(p);
                }
            }
            catch (GcdFoundException exc)
            {
                return(new LenstraFactorizationResult
                {
                    EllepticCurve = edwardsCurve,
                    TargetNumber = n,
                    Divider = exc.GreatestCommonDivisor,
                    WastedTime = DateTime.Now - startTime,
                    EndType = EEndType.RunToComplete
                });
            }

            return(new LenstraFactorizationResult
            {
                EllepticCurve = edwardsCurve,
                TargetNumber = n,
                WastedTime = DateTime.Now - startTime,
                EndType = token.IsCancellationRequested ? EEndType.Cancelled : EEndType.RunToComplete
            });
        }