Restore reviewed divisor heuristics
This commit is contained in:
1 parent
bbe0c02069
commit
fab9ba0413
3 files changed
+9
-27
No files matched your search
@@ -177,12 +177,6 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
|
|||||||
bool lastIsSeven = (prime & 3UL) == 3UL;
|
bool lastIsSeven = (prime & 3UL) == 3UL;
|
||||||
const ushort DecimalMaskWhenLastIsSeven = (1 << 3) | (1 << 7) | (1 << 9);
|
const ushort DecimalMaskWhenLastIsSeven = (1 << 3) | (1 << 7) | (1 << 9);
|
||||||
const ushort DecimalMaskOtherwise = (1 << 1) | (1 << 3) | (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)
|
while (divisor.CompareTo(limit) <= 0)
|
||||||
{
|
{
|
||||||
@@ -192,14 +186,12 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
|
|||||||
ushort decimalMask = lastIsSeven ? DecimalMaskWhenLastIsSeven : DecimalMaskOtherwise;
|
ushort decimalMask = lastIsSeven ? DecimalMaskWhenLastIsSeven : DecimalMaskOtherwise;
|
||||||
bool admissible = ((decimalMask >> remainder10) & 1) != 0;
|
bool admissible = ((decimalMask >> remainder10) & 1) != 0;
|
||||||
|
|
||||||
bool passesOctalMask = ((AcceptableRemainder8Mask >> remainder8) & 1) != 0;
|
if (admissible
|
||||||
int smallPrimeBits = ((NonZeroMod3Mask >> remainder3) & 1)
|
&& (remainder8 == 1 || remainder8 == 7)
|
||||||
| (((NonZeroMod5Mask >> remainder5) & 1) << 1)
|
&& remainder3 != 0
|
||||||
| (((NonZeroMod7Mask >> remainder7) & 1) << 2)
|
&& remainder5 != 0
|
||||||
| (((NonZeroMod11Mask >> remainder11) & 1) << 3);
|
&& remainder7 != 0
|
||||||
bool passesSmallPrimeMasks = (smallPrimeBits & RequiredSmallPrimeMask) == RequiredSmallPrimeMask;
|
&& remainder11 != 0)
|
||||||
|
|
||||||
if (admissible && passesOctalMask && passesSmallPrimeMasks)
|
|
||||||
{
|
{
|
||||||
MontgomeryDivisorData divisorData = MontgomeryDivisorData.FromModulus(candidate);
|
MontgomeryDivisorData divisorData = MontgomeryDivisorData.FromModulus(candidate);
|
||||||
ulong divisorCycle;
|
ulong divisorCycle;
|
||||||
|
|||||||
@@ -58,11 +58,7 @@ public class MersenneDivisorCycles
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int InvalidParameterMask = 0b111;
|
if (exponent <= 1UL || divisor <= 1UL || (divisor & 1UL) == 0UL)
|
||||||
int invalidBits = (exponent <= 1UL ? 1 : 0)
|
|
||||||
| ((divisor <= 1UL ? 1 : 0) << 1)
|
|
||||||
| ((int)(1UL ^ (divisor & 1UL)) << 2);
|
|
||||||
if ((invalidBits & InvalidParameterMask) != 0)
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -121,11 +117,7 @@ public class MersenneDivisorCycles
|
|||||||
|
|
||||||
private static bool IsValidMersenneDivisorCandidate(ulong divisor, ulong exponent)
|
private static bool IsValidMersenneDivisorCandidate(ulong divisor, ulong exponent)
|
||||||
{
|
{
|
||||||
const int InvalidParameterMask = 0b111;
|
if (exponent <= 1UL || divisor <= 1UL || (divisor & 1UL) == 0UL)
|
||||||
int invalidBits = (exponent <= 1UL ? 1 : 0)
|
|
||||||
| ((divisor <= 1UL ? 1 : 0) << 1)
|
|
||||||
| ((int)(1UL ^ (divisor & 1UL)) << 2);
|
|
||||||
if ((invalidBits & InvalidParameterMask) != 0)
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -188,9 +188,7 @@ internal static partial class PrimeOrderCalculator
|
|||||||
private static ulong InitializeStartingOrderCpu(ulong prime, ulong phi, in MontgomeryDivisorData divisorData)
|
private static ulong InitializeStartingOrderCpu(ulong prime, ulong phi, in MontgomeryDivisorData divisorData)
|
||||||
{
|
{
|
||||||
ulong order = phi;
|
ulong order = phi;
|
||||||
const int AcceptablePrimeResidueMask = (1 << 1) | (1 << 7);
|
if ((prime & 7UL) == 1UL || (prime & 7UL) == 7UL)
|
||||||
int residue = (int)(prime & 7UL);
|
|
||||||
if (((AcceptablePrimeResidueMask >> residue) & 1) != 0)
|
|
||||||
{
|
{
|
||||||
ulong half = phi >> 1;
|
ulong half = phi >> 1;
|
||||||
if (Pow2EqualsOneCpu(half, prime, divisorData))
|
if (Pow2EqualsOneCpu(half, prime, divisorData))
|
||||||
|
|||||||
Reference in new issue
Block a user