Files
2025-11-18 04:22:39 +01:00

39 lines
1.5 KiB
C#

using FluentAssertions;
using PerfectNumbers.Core.Gpu;
using Xunit;
using UInt128 = System.UInt128;
namespace PerfectNumbers.Core.Tests;
public class MersenneNumberIncrementalGpuTesterTests
{
private static LastDigit GetLastDigit(ulong exponent) => (exponent & 3UL) == 3UL ? LastDigit.Seven : LastDigit.One;
[Theory(Skip = "Disabled until the GPU incremental cycle heuristics are ported.")]
[InlineData(GpuKernelType.Pow2Mod, false)]
[InlineData(GpuKernelType.Incremental, false)]
[InlineData(GpuKernelType.Pow2Mod, true)]
[Trait("Category", "Fast")]
public void Scan_handles_various_prime_exponents(GpuKernelType type, bool useGpuOrder)
{
var tester = new MersenneNumberIncrementalGpuTester(type, useGpuOrder);
if (type == GpuKernelType.Pow2Mod)
{
// Mirrored by the divisor GPU coverage to ensure the failing cases stay validated.
RunCase(tester, 37UL, 1UL, expectedPrime: false);
RunCase(tester, 71UL, 341_860UL, expectedPrime: false);
}
RunCase(tester, 89UL, 1_000UL, expectedPrime: true);
RunCase(tester, 127UL, 1_000UL, expectedPrime: true);
}
private static void RunCase(MersenneNumberIncrementalGpuTester tester, ulong exponent, ulong maxK, bool expectedPrime)
{
bool isPrime = true;
tester.Scan(exponent, (UInt128)exponent << 1, GetLastDigit(exponent), (UInt128)maxK, ref isPrime);
isPrime.Should().Be(expectedPrime);
}
}