Align divisor pooling with review feedback
This commit is contained in:
1 parent
e44662413a
commit
c8f8132db7
3 files changed
+20
-48
No files matched your search
@@ -112,7 +112,7 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
|
|||||||
Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry>? current = cache;
|
Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry>? current = cache;
|
||||||
if (current is null)
|
if (current is null)
|
||||||
{
|
{
|
||||||
current = ThreadStaticPools.TakeMersenneFactorCacheDictionary();
|
current = ThreadStaticPools.RentMersenneFactorCacheDictionary();
|
||||||
cache = current;
|
cache = current;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,11 +149,6 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
UInt128 step = (UInt128)prime << 1;
|
UInt128 step = (UInt128)prime << 1;
|
||||||
if (step == UInt128.Zero)
|
|
||||||
{
|
|
||||||
processedAll = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt128 limit = allowedMax;
|
UInt128 limit = allowedMax;
|
||||||
UInt128 divisor = step + UInt128.One;
|
UInt128 divisor = step + UInt128.One;
|
||||||
|
|||||||
@@ -23,26 +23,6 @@ public class MersenneDivisorCycles
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Dictionary<ulong, int> RentFactorCountDictionary()
|
|
||||||
{
|
|
||||||
return ThreadStaticPools.TakeFactorCountDictionary();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ReturnFactorCountDictionary(Dictionary<ulong, int> dictionary)
|
|
||||||
{
|
|
||||||
ThreadStaticPools.ReturnFactorCountDictionary(dictionary);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Dictionary<ulong, int> RentFactorScratchDictionary()
|
|
||||||
{
|
|
||||||
return ThreadStaticPools.TakeFactorScratchDictionary();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ReturnFactorScratchDictionary(Dictionary<ulong, int> dictionary)
|
|
||||||
{
|
|
||||||
ThreadStaticPools.ReturnFactorScratchDictionary(dictionary);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadFrom(string path)
|
public void LoadFrom(string path)
|
||||||
{
|
{
|
||||||
EnsureSmallBuffer();
|
EnsureSmallBuffer();
|
||||||
@@ -317,10 +297,6 @@ public class MersenneDivisorCycles
|
|||||||
}
|
}
|
||||||
|
|
||||||
ulong phi = divisor - 1UL;
|
ulong phi = divisor - 1UL;
|
||||||
if (phi == 0UL)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int twoCount = BitOperations.TrailingZeroCount(phi);
|
int twoCount = BitOperations.TrailingZeroCount(phi);
|
||||||
ulong reducedPhi = phi >> twoCount;
|
ulong reducedPhi = phi >> twoCount;
|
||||||
@@ -330,12 +306,8 @@ public class MersenneDivisorCycles
|
|||||||
}
|
}
|
||||||
|
|
||||||
ulong k = reducedPhi / exponent;
|
ulong k = reducedPhi / exponent;
|
||||||
if (k == 0UL)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Dictionary<ulong, int> factorCounts = RentFactorCountDictionary();
|
Dictionary<ulong, int> factorCounts = ThreadStaticPools.RentFactorCountDictionary();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -354,7 +326,7 @@ public class MersenneDivisorCycles
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
ReturnFactorCountDictionary(factorCounts);
|
ThreadStaticPools.ReturnFactorCountDictionary(factorCounts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,7 +369,7 @@ public class MersenneDivisorCycles
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary<ulong, int> scratch = RentFactorScratchDictionary();
|
Dictionary<ulong, int> scratch = ThreadStaticPools.RentFactorScratchDictionary();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -430,18 +402,12 @@ public class MersenneDivisorCycles
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
ReturnFactorScratchDictionary(scratch);
|
ThreadStaticPools.ReturnFactorScratchDictionary(scratch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool TryFactorIntoCountsInternal(ulong value, Dictionary<ulong, int> counts)
|
private static bool TryFactorIntoCountsInternal(ulong value, Dictionary<ulong, int> counts)
|
||||||
{
|
{
|
||||||
// This guard terminates the recursion once Pollard-Rho factorization has reduced the input to 1.
|
|
||||||
if (value <= 1UL)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong remaining = value;
|
ulong remaining = value;
|
||||||
uint[] smallPrimes = PrimesGenerator.SmallPrimes;
|
uint[] smallPrimes = PrimesGenerator.SmallPrimes;
|
||||||
ulong[] smallPrimesSquared = PrimesGenerator.SmallPrimesPow2;
|
ulong[] smallPrimesSquared = PrimesGenerator.SmallPrimesPow2;
|
||||||
@@ -480,7 +446,18 @@ public class MersenneDivisorCycles
|
|||||||
}
|
}
|
||||||
|
|
||||||
ulong quotient = remaining / factor;
|
ulong quotient = remaining / factor;
|
||||||
return TryFactorIntoCountsInternal(factor, counts) && TryFactorIntoCountsInternal(quotient, counts);
|
if (factor > 1UL && !TryFactorIntoCountsInternal(factor, counts))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Guard the recursive calls to terminate once Pollard-Rho reduces either branch to 1.
|
||||||
|
if (quotient > 1UL && !TryFactorIntoCountsInternal(quotient, counts))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void AddFactor(Dictionary<ulong, int> counts, ulong factor)
|
private static void AddFactor(Dictionary<ulong, int> counts, ulong factor)
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace PerfectNumbers.Core
|
|||||||
private static Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry>? _mersenneFactorCacheDictionary;
|
private static Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry>? _mersenneFactorCacheDictionary;
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public static Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry> TakeMersenneFactorCacheDictionary()
|
public static Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry> RentMersenneFactorCacheDictionary()
|
||||||
{
|
{
|
||||||
Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry>? cache = _mersenneFactorCacheDictionary;
|
Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry>? cache = _mersenneFactorCacheDictionary;
|
||||||
if (cache is null)
|
if (cache is null)
|
||||||
@@ -71,7 +71,7 @@ namespace PerfectNumbers.Core
|
|||||||
private static Dictionary<ulong, int>? _factorCountDictionary;
|
private static Dictionary<ulong, int>? _factorCountDictionary;
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public static Dictionary<ulong, int> TakeFactorCountDictionary()
|
public static Dictionary<ulong, int> RentFactorCountDictionary()
|
||||||
{
|
{
|
||||||
Dictionary<ulong, int>? dictionary = _factorCountDictionary;
|
Dictionary<ulong, int>? dictionary = _factorCountDictionary;
|
||||||
if (dictionary is null)
|
if (dictionary is null)
|
||||||
@@ -95,7 +95,7 @@ namespace PerfectNumbers.Core
|
|||||||
private static Dictionary<ulong, int>? _factorScratchDictionary;
|
private static Dictionary<ulong, int>? _factorScratchDictionary;
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public static Dictionary<ulong, int> TakeFactorScratchDictionary()
|
public static Dictionary<ulong, int> RentFactorScratchDictionary()
|
||||||
{
|
{
|
||||||
Dictionary<ulong, int>? dictionary = _factorScratchDictionary;
|
Dictionary<ulong, int>? dictionary = _factorScratchDictionary;
|
||||||
if (dictionary is null)
|
if (dictionary is null)
|
||||||
|
|||||||
Reference in new issue
Block a user