Try "gentler" test case

I verified that we hit GCC 10's constexpr limit with
`wheel_factorizer<1>`, but pass with `wheel_factorizer<4>`.  I hope this
number is enough smaller than the square root of the previous value that
the other compilers will be able to handle it.  If not: we'll go lower.
This commit is contained in:
Chip Hogg
2022-03-19 16:58:43 +00:00
parent c339383873
commit 0f80c10104

View File

@@ -156,15 +156,18 @@ TEST_CASE("make_ratio performs prime factorization correctly")
as_magnitude<ratio(16'605'390'666'050, 10'000'000'000'000)>();
}
SECTION ("Can handle prime number which would exceed GCC iteration limit") {
SECTION("Can handle prime number which would exceed GCC iteration limit")
{
// GCC 10 has a constexpr loop iteration limit of 262144. A naive algorithm, which performs trial division on 2 and
// all odd numbers up to sqrt(N), will exceed this limit for the following prime. Thus, for this test to pass, we
// need to be using a more efficient algorithm. (We could increase the limit, but we don't want users to have to
// mess with compiler flags just to compile the code.)
as_magnitude<334'524'384'739>();
constexpr std::intmax_t big_prime = 414'131;
as_magnitude<big_prime * big_prime>();
}
SECTION ("Can bypass computing primes by providing known_first_factor<N>") {
SECTION("Can bypass computing primes by providing known_first_factor<N>")
{
// Sometimes, even wheel factorization isn't enough to handle the compilers' limits on constexpr steps and/or
// iterations. To work around these cases, we can explicitly provide the correct answer directly to the compiler.
//
@@ -383,7 +386,7 @@ TEST_CASE("int_power computes integer powers")
TEST_CASE("Prime helper functions")
{
SECTION ("multiplicity")
SECTION("multiplicity")
{
CHECK(multiplicity(2, 8) == 3);
CHECK(multiplicity(2, 1024) == 10);