diff --git a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs index 1e021a1..5ba86d0 100644 --- a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs +++ b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs @@ -177,12 +177,6 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv bool lastIsSeven = (prime & 3UL) == 3UL; const ushort DecimalMaskWhenLastIsSeven = (1 << 3) | (1 << 7) | (1 << 9); const ushort DecimalMaskOtherwise = (1 << 1) | (1 << 3) | (1 << 9); - const byte AcceptableRemainder8Mask = 0b10000010; - const int NonZeroMod3Mask = 0b00000110; - const int NonZeroMod5Mask = 0b00011110; - const int NonZeroMod7Mask = 0b01111110; - const int NonZeroMod11Mask = 0b11111111110; - const int RequiredSmallPrimeMask = 0b1111; while (divisor.CompareTo(limit) <= 0) { @@ -192,14 +186,12 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv ushort decimalMask = lastIsSeven ? DecimalMaskWhenLastIsSeven : DecimalMaskOtherwise; bool admissible = ((decimalMask >> remainder10) & 1) != 0; - bool passesOctalMask = ((AcceptableRemainder8Mask >> remainder8) & 1) != 0; - int smallPrimeBits = ((NonZeroMod3Mask >> remainder3) & 1) - | (((NonZeroMod5Mask >> remainder5) & 1) << 1) - | (((NonZeroMod7Mask >> remainder7) & 1) << 2) - | (((NonZeroMod11Mask >> remainder11) & 1) << 3); - bool passesSmallPrimeMasks = (smallPrimeBits & RequiredSmallPrimeMask) == RequiredSmallPrimeMask; - - if (admissible && passesOctalMask && passesSmallPrimeMasks) + if (admissible + && (remainder8 == 1 || remainder8 == 7) + && remainder3 != 0 + && remainder5 != 0 + && remainder7 != 0 + && remainder11 != 0) { MontgomeryDivisorData divisorData = MontgomeryDivisorData.FromModulus(candidate); ulong divisorCycle; diff --git a/PerfectNumbers.Core/MersenneDivisorCycles.cs b/PerfectNumbers.Core/MersenneDivisorCycles.cs index a349020..772fab8 100644 --- a/PerfectNumbers.Core/MersenneDivisorCycles.cs +++ b/PerfectNumbers.Core/MersenneDivisorCycles.cs @@ -58,11 +58,7 @@ public class MersenneDivisorCycles return true; } - const int InvalidParameterMask = 0b111; - int invalidBits = (exponent <= 1UL ? 1 : 0) - | ((divisor <= 1UL ? 1 : 0) << 1) - | ((int)(1UL ^ (divisor & 1UL)) << 2); - if ((invalidBits & InvalidParameterMask) != 0) + if (exponent <= 1UL || divisor <= 1UL || (divisor & 1UL) == 0UL) { return false; } @@ -121,11 +117,7 @@ public class MersenneDivisorCycles private static bool IsValidMersenneDivisorCandidate(ulong divisor, ulong exponent) { - const int InvalidParameterMask = 0b111; - int invalidBits = (exponent <= 1UL ? 1 : 0) - | ((divisor <= 1UL ? 1 : 0) << 1) - | ((int)(1UL ^ (divisor & 1UL)) << 2); - if ((invalidBits & InvalidParameterMask) != 0) + if (exponent <= 1UL || divisor <= 1UL || (divisor & 1UL) == 0UL) { return false; } diff --git a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs index 188af6d..ac93691 100644 --- a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs +++ b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs @@ -188,9 +188,7 @@ internal static partial class PrimeOrderCalculator private static ulong InitializeStartingOrderCpu(ulong prime, ulong phi, in MontgomeryDivisorData divisorData) { ulong order = phi; - const int AcceptablePrimeResidueMask = (1 << 1) | (1 << 7); - int residue = (int)(prime & 7UL); - if (((AcceptablePrimeResidueMask >> residue) & 1) != 0) + if ((prime & 7UL) == 1UL || (prime & 7UL) == 7UL) { ulong half = phi >> 1; if (Pow2EqualsOneCpu(half, prime, divisorData))