From ebfdc7d8b8c9f10545175bc6646ed67dfe7ad48b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Thu, 9 Oct 2025 22:09:05 +0200 Subject: [PATCH] Assign contiguous by-divisor ranges per worker --- .../MersenneNumberDivisorByDivisorTester.cs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs index 3be9f82..a1b0477 100644 --- a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs +++ b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs @@ -290,7 +290,32 @@ public static class MersenneNumberDivisorByDivisorTester MaxDegreeOfParallelism = workerCount }; - Parallel.ForEach(filteredPrimes, options, ProcessPrime); + primeCount = filteredPrimes.Count; // Reusing primeCount to track the filtered count. + int primesPerWorker = (primeCount + workerCount - 1) / workerCount; + + Parallel.For( + 0, + workerCount, + options, + workerIndex => + { + int start = workerIndex * primesPerWorker; + if (start >= primeCount) + { + return; + } + + int end = start + primesPerWorker; + if (end > primeCount) + { + end = primeCount; + } + + for (int i = start; i < end; i++) + { + ProcessPrime(filteredPrimes[i]); + } + }); } } }