Exemple #1
0
    public static void Main()
    {
        Console.WriteLine("Prime numbers: ".Length);
        var len    = 1000000;
        var primes = Primes.AddPrimes(len);

        Console.Write(primes);
    }
        private void ConsolidatePrimes(List <Primes> morePrimes)
        {
            var threads = morePrimes.Count;
            var tasks   = new Task[threads];
            var count   = primes.Count;

            primes.Count = count + morePrimes.Sum(item => item.Count);
            for (var thread = 0; thread < threads; thread++)
            {
                var taskPrimes = morePrimes[thread];
                var start      = count;
                tasks[thread] = Task.Factory.StartNew(() =>
                                                      primes.AddPrimes(taskPrimes, start));
                count += taskPrimes.Count;
            }
            Task.WaitAll(tasks);
        }
        private void ProcessRange(Primes primes, bool[] block, long kstart, long kend, int blockSize)
        {
            var offsets = new int[numberOfDivisors];

            var cycleOffset = cycleSize - (int)(kstart % cycleSize);

            cycleOffset = (cycleOffset + (((cycleOffset & 1) - 1) & cycleSize)) >> 1;
            offsets[0]  = cycleOffset;

            for (var i = 1; i < numberOfDivisors; i++)
            {
                var d      = divisors[i];
                var offset = d - (uint)(kstart % d);
                offset     = (offset + (((offset & 1) - 1) & d)) >> 1;
                offsets[i] = (int)offset;
            }

            for (var k = kstart; k < kend; k += blockSize)
            {
                var length = (int)Math.Min(blockSize, kend - k);
                SieveBlock((uint)k, length, block, offsets);
                primes.AddPrimes((uint)k, length, block);
            }
        }