Esempio n. 1
0
        static BigInteger EcmSandbox(BigInteger n, ulong bound, ulong curveCount)
        {
            Console.WriteLine(string.Format("n={0} ({1} digits)", n, n.ToString().Length));

            CurveGenerator g     = new CurveGenerator();
            BigInteger     gcd   = 1;
            var            timer = new Stopwatch();
            ulong          b1    = bound;
            ulong          b2    = b1 * 100;
            ulong          b3    = b2 + b1 * 100;

            timer.Start();
            var        curves = new Curve[curveCount];
            BigInteger factor = 1;

            curves = curves.Select(x =>
            {
                var c = g.GenerateMontgomeryCurve(n, out gcd);
                if (gcd > 1)
                {
                    factor = gcd;
                }
                return(c);
            }).ToArray();
            if (factor > 1)
            {
                Console.WriteLine("Factor found!");
                Console.WriteLine(factor);
                timer.Stop();
                Console.WriteLine(timer.Elapsed);
                return(factor);
            }
            else
            {
                var count = 0;
                Console.Write("\r{0}/{1} curves   ", count++, curveCount);
                foreach (var curve in curves)
                {
                    var ecm = new Ecm();
                    factor = ecm.Calculate(curve, b1, b2, b3);



                    if (n % factor != 0)
                    {
                        Console.WriteLine("ERROR!");
                    }
                    else if (factor > 1)
                    {
                        Console.WriteLine();
                        Console.WriteLine("Factor found!");
                        Console.WriteLine(factor);
                        timer.Stop();
                        Console.WriteLine(timer.Elapsed);
                        break;
                    }
                    else
                    {
                        Console.Write("\r{0}/{1} curves   ", count++, curveCount);
                    }
                }
            }
            return(factor);
        }