using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.ComponentModel; namespace mapReplaceSkeleton { class Range { public long m_start; public long m_end; public long m_candidate; } class Program { static Queue m_divisors = new Queue(); static long m_numberOfConcurrentThreads = 0; static void Main(string[] args) { DateTime start = DateTime.Now; int numberOfThreads = 2500; //long primeCandidate = 2452436365; //random number long primeCandidate = 2147483647; //Mersenne prime, in binary = 1111111111111111111111111111111 //long primeCandidate = 2305843009213693951; //Mersenne prime, in binary = 1111111111111111111111111111111111111111111111111111111111111 int rangeForSingleThread = 12301; long low = 2; long high = low + rangeForSingleThread; bool isLast = false; long counter = 0; while (true) { Range range = new Range(); range.m_start = low; range.m_end = high; range.m_candidate = primeCandidate; workerThreadStart(range); if (isLast) break; low = high + 1; high = low + rangeForSingleThread; if (high >= primeCandidate) { high = primeCandidate - 1; isLast = true; } if (++counter % 1000 == 0) { Console.Write("{0}\r", high); } while (m_numberOfConcurrentThreads >= numberOfThreads) { Thread.Sleep(50); } } Console.WriteLine(); Console.WriteLine(); if (m_divisors.Count > 0) { Console.WriteLine("Candidate {0} and divisors:", primeCandidate); while (m_divisors.Count > 0) { Console.WriteLine(m_divisors.Dequeue()); } } else { Console.WriteLine("The candidate {0} is a prime:", primeCandidate); } DateTime end = DateTime.Now; TimeSpan duration = end - start; double time = duration.Hours * 60 * 60 + duration.Minutes * 60.0 + duration.Seconds + duration.Milliseconds / 1000.0; Console.WriteLine("Processing time {0:####.00} seconds", time); } static void workerThreadStart(Range range) { Interlocked.Increment(ref m_numberOfConcurrentThreads); var backgroundworker = new BackgroundWorker(); backgroundworker.DoWork += new DoWorkEventHandler(workerThreadBody); backgroundworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerThreadCompleted); backgroundworker.RunWorkerAsync(range); } static void workerThreadBody(object sender, DoWorkEventArgs e) { Range range = (Range)e.Argument; if (range.GetType() != typeof(Range)) { e.Result = null; return; } for (long k = range.m_start; k <= range.m_end; ++k) { long res = range.m_candidate / k; if (res * k == range.m_candidate) { e.Result = res; return; } } e.Result = null; } static void workerThreadCompleted(object sender, RunWorkerCompletedEventArgs e) { Interlocked.Decrement(ref m_numberOfConcurrentThreads); long? result = (long?)e.Result; if (result != null) { lock (m_divisors) { m_divisors.Enqueue((long)result); } } } } }