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); }