예제 #1
0
        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);
        }
예제 #2
0
        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));
            }
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
        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();
        }
예제 #5
0
        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();
        }