diff --git a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs index ec96d17..2eba0ce 100644 --- a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs +++ b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs @@ -80,9 +80,9 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv return true; } - ulong processedCount; - ulong lastProcessed; - bool processedAll; + ulong processedCount = 0UL; + ulong lastProcessed = 0UL; + bool processedAll = false; bool composite = CheckDivisors( prime, @@ -95,7 +95,7 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv { lock (_sync) { - UpdateStatusUnsafe(processedCount); + UpdateStatusUnsafe(lastProcessed, processedCount); } } @@ -238,20 +238,19 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv } } - if (divisorCycle != 0 && divisorCycle == prime) - { - processedAll = true; - return true; - } - else if (divisorCycle == 0) - { - Console.WriteLine($"Divisor cycle wasn't calculated for ${prime}"); - } - // if (divisorCycle != 0UL && CheckDivisor(prime, divisorCycle, divisorData) != 0) - // { - // processedAll = true; - // return true; - // } + if (divisorCycle == prime) + { + // A cycle equal to the tested exponent (which is prime in this path) + // guarantees that the candidate divides the corresponding Mersenne + // number because the order of 2 modulo the divisor is exactly p. + processedAll = true; + return true; + } + + if (divisorCycle == 0UL) + { + Console.WriteLine($"Divisor cycle was not calculated for {prime}"); + } } divisor += step; @@ -284,7 +283,7 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv return (byte)sum; } - private void UpdateStatusUnsafe(ulong processedCount) + private void UpdateStatusUnsafe(ulong lastProcessed, ulong processedCount) { if (processedCount == 0UL) {