Files
even-perfect-numbers-scanner/EvenPerfectBitScanner/Candidates/Transforms/CandidateAddTransform.cs

31 lines
815 B
C#

using System.Runtime.CompilerServices;
using System.Threading;
using EvenPerfectBitScanner.Candidates;
namespace EvenPerfectBitScanner.Candidates.Transforms;
internal static class CandidateAddTransform
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static ulong Transform(ulong value, ref ulong remainder, ref bool limitReached)
{
ulong next = value;
ulong diff = remainder.GetNextAddDiff();
if (next > ulong.MaxValue - diff)
{
Volatile.Write(ref limitReached, true);
return next;
}
remainder += diff;
// Retain direct modulo because the Mod6 helper underperforms on 64-bit operands.
while (remainder >= 6UL)
{
remainder -= 6UL;
}
return next + diff;
}
}