Example #1
0
 /// <summary>
 /// this will be the first thread such that its parent = null
 /// </summary>
 public void Run_First()
 {
     Thread = new System.Threading.Thread(() =>
     {
         long NextNumber = LastPrime + 1;
         while (NextNumber >= 0)
         {
             PrimeNumberBlock newSet = new PrimeNumberBlock();
             newSet.Primes           = new List <long>(ProcBlockSize);
             for (int i = 1; i <= ProcBlockSize; i++)
             {
                 newSet.Primes.Add(i + NextNumber);
             }
             NextNumber += ProcBlockSize;
             newSet.FirstNonAbsolutePrimeIndex = 0;
             bool tooFast = true;
             for (int i = 0; i < FirstMillionPrimes.Length; i++)
             {
                 for (int j = newSet.FirstNonAbsolutePrimeIndex; j < newSet.Primes.Count; j++)
                 {
                     if (newSet.Primes[j] % FirstMillionPrimes[i] == 0)
                     {
                         newSet.Primes.RemoveAt(j);
                         j--;
                     }
                     else if (FirstMillionPrimes[i] * FirstMillionPrimes[i] >= newSet.Primes[j])
                     {
                         newSet.FirstNonAbsolutePrimeIndex++;
                     }
                 }
                 if (Child.IsReadyForNextSet)
                 {
                     newSet.NextPrimeIndex = i + 1;
                     Child.Input           = newSet;
                     while (Child.IsReadyForNextSet)
                     {
                         System.Threading.Thread.Sleep(1);
                     }
                     tooFast = false;
                     break;
                 }
             }
             if (tooFast)
             {
                 while (!Child.IsReadyForNextSet)
                 {
                     System.Threading.Thread.Sleep(1);
                 }
                 newSet.NextPrimeIndex = newSet.Primes.Count;
                 Child.Input           = newSet;
                 while (Child.IsReadyForNextSet)
                 {
                     System.Threading.Thread.Sleep(1);
                 }
             }
         }
     });
     Thread.Start();
 }
Example #2
0
        public void Run()
        {
            Thread = new System.Threading.Thread(() =>
            {
                IsReadyForNextSet = true;
                while (Input == null)
                {
                    System.Threading.Thread.Sleep(1);
                }

                while (true)
                {
                    PrimeNumberBlock newSet = new PrimeNumberBlock();
                    for (int i = 0; i < Input.Primes.Count; i++)
                    {
                        newSet.Primes.Add(Input.Primes[i]);
                    }
                    newSet.FirstNonAbsolutePrimeIndex = Input.FirstNonAbsolutePrimeIndex;

                    for (int i = newSet.NextPrimeIndex; i < 1000000; i++)
                    {
                        for (int j = newSet.FirstNonAbsolutePrimeIndex; j < newSet.Primes.Count; j++)
                        {
                            if (newSet.Primes[j] % FirstMillionPrimes[i] == 0)
                            {
                                newSet.Primes.RemoveAt(j);
                            }
                            else if (FirstMillionPrimes[i] * FirstMillionPrimes[i] >= newSet.Primes[j])
                            {
                                newSet.Primes.Add(Input.Primes[j]);
                                newSet.FirstNonAbsolutePrimeIndex++;
                            }
                        }
                        if (Child.IsReadyForNextSet)
                        {
                            newSet.NextPrimeIndex = i + 1;
                            Child.Input           = newSet;
                            Input = null;
                            Child.IsReadyForNextSet = false;
                            IsReadyForNextSet       = true;
                            while (Input == null)
                            {
                                System.Threading.Thread.Sleep(1);
                            }
                            break;
                        }
                    }
                }
            });
            Thread.Start();
        }
Example #3
0
        /// <summary>
        /// this will be the last thread such that Child = null
        /// </summary>
        public void Run_Last()
        {
            Thread = new System.Threading.Thread(() =>
            {
                PrimeNumberBlock newSet = new PrimeNumberBlock();
                while (true)
                {
                    IsReadyForNextSet = true;
                    while (Input == null)
                    {
                        System.Threading.Thread.Sleep(1);
                    }
                    int oldLength = newSet.Primes.Count;
                    for (int i = 0; i < Input.Primes.Count; i++)
                    {
                        newSet.Primes.Add(Input.Primes[i]);
                    }
                    newSet.FirstNonAbsolutePrimeIndex = oldLength + Input.FirstNonAbsolutePrimeIndex;
                    newSet.NextPrimeIndex             = Input.NextPrimeIndex;
                    Input             = null;
                    IsReadyForNextSet = false;

                    for (int i = newSet.FirstNonAbsolutePrimeIndex; i < newSet.Primes.Count; i++)
                    {
                        for (int j = newSet.NextPrimeIndex; j < FirstMillionPrimes.Length; j++)
                        {
                            if (FirstMillionPrimes[j] * FirstMillionPrimes[j] > newSet.Primes[i])
                            {
                                break;
                            }
                            if (newSet.Primes[i] % FirstMillionPrimes[j] == 0)
                            {
                                newSet.Primes.RemoveAt(i);
                                i--;
                                break;
                            }
                        }
                    }
                    if (newSet.Primes.Count >= SaveBlockSize)
                    {
                        Save(newSet.Primes.GetRange(0, SaveBlockSize), Next * SaveBlockSize, Next);
                        Next++;
                        newSet.Primes.RemoveRange(0, SaveBlockSize);
                    }
                }
            });
            Thread.Start();
        }