private static Task PrintPrimes(bool all = false) { var t = new Task(() => { List <int> batch; do { lock (printLock) { batch = PrimeFinder.Primes(lastPrinted, 100); lastPrinted = lastPrinted + batch.Count; } int lineCounter = lastPrinted - batch.Count(); foreach (var p in batch) { lineCounter++; Console.Write(p); if (lineCounter % 10 == 0) { Console.WriteLine(); } else { Console.Write("\t"); } } }while (all && (PrimeFinder.MaxFound() > batch.Last())); }); t.Start(); return(t); }
private static void factorNumber(int Number) { try { // even number done if (Number % 2 == 0) { return; } int next = 2; int test; do { while (PrimeFinder.MaxFound() * 2 < Number) { Thread.Sleep(1000); } var tests = PrimeFinder.Primes(next); while (!tests.Any()) { Thread.Sleep(500); tests = PrimeFinder.Primes(next); } test = tests.First(); next = next + tests.Count(); for (int i = 0; i < tests.Count(); i++) { test = tests[i]; // a divisor was found if (Number % test == 0) { return; } } } // only need to test the first half of the primes while (test * 2 <= Number); // no divisor found for num // add it to the list PrimeFinder.AddPrime(Number); } catch (Exception e) { Console.WriteLine((e.Message)); } }
public static void Find(int Max = int.MaxValue) { int start = PrimeFinder.MaxFound() + 1; int count = Max - start; var range = Enumerable.Range(start, count); // single thread the first 100 to prevent errors foreach (var num in range) { if (num % 2 != 0 && !_primes.AsReadOnly().Skip(2).Any(p => (num % p) == 0)) { PrimeFinder.AddPrime(num); } } }
private static void Main() { var primeFinder = new PrimeFinder(); var primes = primeFinder.GetPrimes(); var sum = 0; var below = 10u; var stopwatch = new Stopwatch(); stopwatch.Start(); while (below <= 10000000) { sum += primes.TakeWhile(p => p < below).Count(); Console.WriteLine($"There are {sum:N0} primes below {below:N0}"); below *= 10; } stopwatch.Stop(); Console.WriteLine($"And it took me {stopwatch.Elapsed:g} to calculate it"); Console.ReadLine(); }
static void Main(string[] args) { int findCount = 500; if (args.Length > 0) { if (args[0].ToLower() == "all") { findCount = int.MaxValue; } else { int.TryParse(args[0], out findCount); } } Console.CancelKeyPress += delegate { Console.WriteLine("## stopped ##"); Console.WriteLine($"Found: {PrimeFinder.Count()}"); }; Timer timer = new Timer(500); timer.Elapsed += async(sender, e) => await PrintPrimes(); timer.Start(); var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); PrimeFinder.Find(findCount); stopWatch.Stop(); timer.Stop(); var t = PrintPrimes(true); while (!t.IsCompleted) { System.Threading.Thread.Sleep((500)); } Console.WriteLine(); Console.WriteLine($"Time: {stopWatch.Elapsed}"); Console.WriteLine($"Found: {PrimeFinder.Count()}"); Console.WriteLine(); Console.WriteLine("checking "); var pt = new PrimeTest().Primes(); var primes = PrimeFinder.Primes(1, pt.Count()); for (int i = 0; i < Math.Min(primes.Count(), pt.Count()); i++) { if (pt[i] != primes[i]) { Console.WriteLine($"{pt[i]} <> {primes[i]} ** "); } } Console.WriteLine(); Console.WriteLine(); }