From 9a81f5f6858d9599bf2b717b68b322682b3ebbe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Wed, 8 Oct 2025 22:45:53 +0200 Subject: [PATCH] Enable parallel by-divisor scanning threads --- EvenPerfectBitScanner/Program.cs | 1 - .../MersenneNumberDivisorByDivisorTester.cs | 28 +++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/EvenPerfectBitScanner/Program.cs b/EvenPerfectBitScanner/Program.cs index 7da6016..229f5dd 100644 --- a/EvenPerfectBitScanner/Program.cs +++ b/EvenPerfectBitScanner/Program.cs @@ -458,7 +458,6 @@ internal static class Program if (useByDivisor) { - threadCount = 1; blockSize = 1; } diff --git a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs index a332008..a5fbe57 100644 --- a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs +++ b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs @@ -2,6 +2,7 @@ using System; using System.Buffers; using System.Collections.Generic; using System.Globalization; +using System.Threading.Tasks; using Open.Numeric.Primes; namespace PerfectNumbers.Core; @@ -158,7 +159,13 @@ public static class MersenneNumberDivisorByDivisorTester return; } - foreach (ulong prime in filteredPrimes) + int workerCount = threadCount <= 0 ? Environment.ProcessorCount : threadCount; + if (workerCount < 1) + { + workerCount = 1; + } + + void ProcessPrime(ulong prime) { bool isPrime = tester.IsPrime(prime, out bool divisorsExhausted); @@ -166,11 +173,28 @@ public static class MersenneNumberDivisorByDivisorTester { markComposite(); printResult(prime, true, true, false); - continue; + return; } clearComposite(); printResult(prime, true, divisorsExhausted, true); } + + if (workerCount == 1) + { + foreach (ulong prime in filteredPrimes) + { + ProcessPrime(prime); + } + } + else + { + ParallelOptions options = new() + { + MaxDegreeOfParallelism = workerCount + }; + + Parallel.ForEach(filteredPrimes, options, ProcessPrime); + } } }