65 lines
1.7 KiB
C#
65 lines
1.7 KiB
C#
using FluentAssertions;
|
|
using Xunit;
|
|
using PerfectNumbers.Core.Gpu.Kernels;
|
|
|
|
namespace PerfectNumbers.Core.Tests.Gpu;
|
|
|
|
public class ULongExtensionsGpuTests
|
|
{
|
|
[Theory]
|
|
[Trait("Category", "Fast")]
|
|
[InlineData(1UL, 3UL)]
|
|
[InlineData(2UL, 5UL)]
|
|
[InlineData(3UL, 7UL)]
|
|
[InlineData(63UL, 97UL)]
|
|
[InlineData(512UL, 12289UL)]
|
|
[InlineData(1024UL, 196613UL)]
|
|
[InlineData(4096UL, 999983UL)]
|
|
[InlineData(65535UL, 2147483647UL)]
|
|
public void Pow2ModWindowedGpu_matches_montgomery_cpu_for_known_values(ulong exponent, ulong modulus)
|
|
{
|
|
MontgomeryDivisorData divisor = MontgomeryDivisorData.FromModulus(modulus);
|
|
ulong expected = exponent.Pow2MontgomeryModWindowedConvertToStandardCpu(divisor);
|
|
|
|
exponent.Pow2ModWindowedGpu(modulus).Should().Be(expected);
|
|
}
|
|
|
|
[Fact]
|
|
[Trait("Category", "Fast")]
|
|
public void Pow2ModWindowedGpu_matches_cpu_for_sampled_inputs()
|
|
{
|
|
ulong[] moduli =
|
|
{
|
|
3UL,
|
|
5UL,
|
|
97UL,
|
|
12289UL,
|
|
196613UL,
|
|
4294967291UL,
|
|
9223372036854775783UL,
|
|
};
|
|
|
|
ulong[] exponents =
|
|
{
|
|
1UL,
|
|
2UL,
|
|
7UL,
|
|
32UL,
|
|
63UL,
|
|
2048UL,
|
|
65535UL,
|
|
};
|
|
|
|
foreach (ulong modulus in moduli)
|
|
{
|
|
MontgomeryDivisorData divisor = MontgomeryDivisorData.FromModulus(modulus);
|
|
foreach (ulong exponent in exponents)
|
|
{
|
|
ulong expected = exponent.Pow2MontgomeryModWindowedConvertToStandardCpu(divisor);
|
|
exponent.Pow2ModWindowedGpu(modulus).Should().Be(expected);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|