Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/semigroups/libsemigroups/tests/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 18.5.2025 mit Größe 209 kB image not shown  

Quelle  test-schreier-sims.cpp

  Sprache: C
 

// libsemigroups - C++ library for semigroups and monoids
// Copyright (C) 2019 James D. Mitchell
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//

// These tests are derived from:
//
//   https://github.com/james-d-mitchell/libsemigroups/pull/39
//
// by Alex Levine and Luke Elliott. Many examples here taken from
//
//   http://brauer.maths.qmul.ac.uk/Atlas/

#include <cstddef>  // for size_t
#include <cstdint>  // for uint64_t

#include "catch.hpp"                        // for LIBSEMIGROUPS_TEST_CASE
#include "libsemigroups/config.hpp"         // for LIBSEMIGROUPS_HPCOMBI_ENABLED
#include "libsemigroups/report.hpp"         // for ReportGuard
#include "libsemigroups/schreier-sims.hpp"  // for SchreierSims, SchreierSims<>::ele...
#include "libsemigroups/transf.hpp"         // for Perm
#include "test-main.hpp"                    // for LIBSEMIGROUPS_TEST_CASE

namespace libsemigroups {
  struct LibsemigroupsException;

  constexpr bool REPORT = false;

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "001",
                          "trivial perm. group (degree 1)",
                          "[quick][schreier-sims]") {
    auto            rg = ReportGuard(REPORT);
    SchreierSims<1> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({0}));
    REQUIRE(S.size() == 1);
    REQUIRE(S.contains(Perm({0})));
    // REQUIRE(!S.contains(Perm({1, 0})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "002",
                          "trivial perm. group (degree 2)",
                          "[quick][schreier-sims]") {
    auto            rg = ReportGuard(REPORT);
    SchreierSims<2> S;
    using Perm = SchreierSims<2>::element_type;
    S.add_generator(Perm({0, 1}));
    REQUIRE(S.size() == 1);
    REQUIRE(S.sift(Perm({1, 0})) == Perm({1, 0}));
    REQUIRE(!S.contains(Perm({1, 0})));
    REQUIRE(S.contains(Perm({0, 1})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "003",
                          "trivial perm. group (degree 500)",
                          "[quick][schreier-sims]") {
    auto rg            = ReportGuard(REPORT);
    size_t constexpr N = 100;
    // We allocate using "new" to avoid allocation on the stack,
    // since 100 is too large, and causes this test to seg fault.
    auto S     = new SchreierSims<N>();
    using Perm = std::remove_pointer<decltype(S)>::type::element_type;

    auto p = Perm::identity(N);

    S->add_generator(p);

    REQUIRE(S->size() == 1);
    REQUIRE(S->contains(p));

    std::swap(p[30], p[31]);
    REQUIRE(!S->contains(p));
    std::swap(p[73], p[32]);
    REQUIRE(!S->contains(p));
    std::swap(p[73], p[32]);
    std::swap(p[30], p[31]);
    std::swap(p[0], p[99]);
    REQUIRE(!S->contains(p));
    delete S;
  }

  // The next tests fail (04 to 09, inclusive), with default template
  // parameters, due to HPCombi 0.0.3 currently composing functions from
  // right to left.
  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "004",
                          "symmetric perm. group (degree 5)",
                          "[quick][schreier-sims]") {
    auto            rg = ReportGuard(REPORT);
    SchreierSims<5> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({1, 0, 2, 3, 4}));
    S.add_generator(Perm({1, 2, 3, 4, 0}));
    REQUIRE(S.size() == 120);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "005",
                          "symmetric perm. group (degree 8)",
                          "[quick][schreier-sims]") {
    auto            rg = ReportGuard(REPORT);
    SchreierSims<8> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({0, 6, 2, 3, 4, 5, 1, 7}));
    S.add_generator(Perm({1, 2, 3, 4, 5, 6, 7, 0}));
    REQUIRE(S.size() == 40320);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "006",
                          "symmetric perm. group (degree 9)",
                          "[quick][schreier-sims]") {
    auto            rg = ReportGuard(REPORT);
    SchreierSims<9> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({1, 0, 2, 3, 4, 5, 6, 7, 8}));
    S.add_generator(Perm({1, 2, 3, 4, 5, 6, 7, 8, 0}));
    REQUIRE(S.size() == 362880);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "007",
                          "alternating perm. group (degree 12)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<12> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11}));
    S.add_generator(Perm({0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1}));

    REQUIRE(!S.contains(Perm({11, 10, 0, 6, 8, 2, 3, 5, 4, 7, 9, 1})));
    REQUIRE(S.contains(Perm({7, 11, 2, 3, 0, 6, 9, 10, 8, 5, 4, 1})));
    // REQUIRE(!S.contains(Perm({11, 10, 0, 6, 8, 2, 3, 5, 4, 7, 9, 1, 12})));
    REQUIRE(S.size() == 239500800);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "008",
                          "symmetric perm. group (degree 16)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<16> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(
        Perm({1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}));
    S.add_generator(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0}));
    REQUIRE(S.size() == static_cast<uint64_t>(20922789888000));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "009",
                          "alternating perm. group (degree 15)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<15> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}));
    S.add_generator(Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0}));
    REQUIRE(S.size() == static_cast<uint64_t>(653837184000));

    REQUIRE(
        S.contains(Perm({0, 1, 7, 8, 9, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6})));
    REQUIRE(
        S.contains(Perm({1, 12, 0, 13, 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11})));
    REQUIRE(
        S.contains(Perm({12, 0, 1, 13, 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11})));
    REQUIRE(
        !S.contains(Perm({12, 0, 1, 13, 14, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11})));
    REQUIRE(
        !S.contains(Perm({1, 12, 0, 14, 13, 3, 2, 5, 4, 6, 7, 8, 9, 10, 11})));
    REQUIRE(
        !S.contains(Perm({0, 1, 7, 9, 8, 11, 10, 12, 13, 14, 2, 3, 6, 5, 4})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "010",
                          "alternating perm. group (degree 16)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<16> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(
        Perm({1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}));
    S.add_generator(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 15}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 13}));
    REQUIRE(S.size() == static_cast<uint64_t>(10461394944000));
    REQUIRE(S.contains(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 13})));
    REQUIRE(!S.contains(
        Perm({1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 13})));
    REQUIRE(S.contains(
        Perm({1, 0, 3, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 13})));

    REQUIRE(S.contains(
        Perm({1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15})));
    REQUIRE(S.contains(S.generator(0)));
    REQUIRE(S.contains(S.generator(1)));
    REQUIRE(S.contains(S.generator(2)));
    REQUIRE(S.contains(
        Perm({0, 1, 7, 8, 9, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6, 15})));
    REQUIRE(S.contains(
        Perm({1, 12, 0, 13, 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15})));
    REQUIRE(S.contains(
        Perm({12, 0, 1, 13, 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15})));
    REQUIRE(!S.contains(
        Perm({12, 0, 1, 13, 14, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11, 15})));
    REQUIRE(!S.contains(
        Perm({1, 12, 0, 14, 13, 3, 2, 5, 4, 6, 7, 8, 9, 10, 11, 15})));
    REQUIRE(!S.contains(
        Perm({0, 1, 7, 9, 8, 11, 10, 12, 13, 14, 2, 3, 6, 5, 4, 15})));

    REQUIRE(!S.contains(
        Perm({1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 13})));
    S.add_generator(
        Perm({1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 13}));
    REQUIRE(S.contains(
        Perm({1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 13})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "011",
                          "dihedral perm. group (order 10)",
                          "[quick][schreier-sims]") {
    auto            rg = ReportGuard(REPORT);
    SchreierSims<5> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({0, 4, 3, 2, 1}));
    S.add_generator(Perm({1, 2, 3, 4, 0}));

    REQUIRE(S.size() == 10);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "012",
                          "dihedral perm. group (order 200)",
                          "[quick][schreier-sims]") {
    auto rg = ReportGuard(REPORT);
    // At N = 4000 or so, this starts to take an appreciable amount of time.
    constexpr size_t N = 200;
    auto             S = new SchreierSims<N>();
    using Perm         = std::remove_pointer<decltype(S)>::type::element_type;

    Perm::container_type cntnr;
    std::fill(cntnr.begin(), cntnr.end(), 0);
    std::iota(cntnr.begin(), cntnr.end() - 1, 1);
    S->add_generator(Perm(cntnr));
    std::iota(cntnr.rbegin(), cntnr.rend() - 1, 1);
    cntnr[0] = 0;
    S->add_generator(Perm(cntnr));
    REQUIRE(S->size() == 2 * N);

    REQUIRE(S->contains(S->generator(0)));
    REQUIRE(S->contains(S->generator(1)));
    REQUIRE(S->contains(S->generator(1) * S->generator(0)));

    std::iota(cntnr.begin(), cntnr.end(), 0);
    for (auto it = cntnr.begin(); it < cntnr.end(); it += 2) {
      std::swap(*it, *(it + 1));
    }
    REQUIRE(!S->contains(Perm(cntnr)));
    std::swap(*cntnr.begin(), *(cntnr.begin() + 1));
    REQUIRE(!S->contains(Perm(cntnr)));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "013",
                          "perm. group T (order 12)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<12> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({1, 2, 3, 4, 5, 0, 7, 8, 9, 10, 11, 6}));
    S.add_generator(Perm({6, 11, 10, 9, 8, 7, 3, 2, 1, 0, 5, 4}));
    REQUIRE(S.size() == 12);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "014",
                          "quaternion perm. group (order 8)",
                          "[quick][schreier-sims]") {
    auto            rg = ReportGuard(REPORT);
    SchreierSims<9> S;
    using Perm = decltype(S)::element_type;
    S.add_generator(Perm({0, 2, 4, 6, 7, 3, 8, 1, 5}));
    S.add_generator(Perm({0, 3, 5, 4, 8, 7, 2, 6, 1}));
    REQUIRE(S.generator(0) == Perm({0, 2, 4, 6, 7, 3, 8, 1, 5}));

    REQUIRE(S.size() == 8);
    REQUIRE(S.sift(S.generator(0)) == S.identity());
    REQUIRE(S.contains(S.generator(0)));
    REQUIRE(S.contains(S.generator(1)));
    REQUIRE(S.contains(Perm({0, 6, 3, 7, 5, 1, 4, 8, 2})));
    REQUIRE(S.contains(Perm({0, 8, 6, 1, 3, 2, 7, 5, 4})));
    REQUIRE(!S.contains(Perm({0, 1, 5, 4, 8, 7, 2, 6, 3})));
    REQUIRE(!S.contains(Perm({3, 5, 4, 6, 1, 8, 2, 7, 0})));
    REQUIRE(!S.contains(Perm({1, 3, 2, 5, 7, 8, 6, 4, 0})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "015",
                          "perm. group (order 84129611558952960)",
                          "[quick][schreier-sims][no-valgrind]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 729;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,
         14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
         28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,
         42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,
         56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
         70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
         84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
         98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
         112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
         126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
         140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153,
         154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
         168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181,
         182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195,
         196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
         210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
         224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237,
         238, 239, 240, 241, 242, 486, 487, 488, 489, 490, 491, 492, 493, 494,
         495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508,
         509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522,
         523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536,
         537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550,
         551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564,
         565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578,
         579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592,
         593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606,
         607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620,
         621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634,
         635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648,
         649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662,
         663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676,
         677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690,
         691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704,
         705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718,
         719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 243, 244, 245, 246,
         247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
         261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
         275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
         289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
         303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316,
         317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330,
         331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344,
         345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358,
         359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
         373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386,
         387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400,
         401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414,
         415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428,
         429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442,
         443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456,
         457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470,
         471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484,
         485}));
    S->add_generator(Perm(
        {0,   6,   3,   18,  24,  21,  9,   15,  12,  54,  60,  57,  72,  78,
         75,  63,  69,  66,  27,  33,  30,  45,  51,  48,  36,  42,  39,  162,
         168, 165, 180, 186, 183, 171, 177, 174, 216, 222, 219, 234, 240, 237,
         225, 231, 228, 189, 195, 192, 207, 213, 210, 198, 204, 201, 81,  87,
         84,  99,  105, 102, 90,  96,  93,  135, 141, 138, 153, 159, 156, 144,
         150, 147, 108, 114, 111, 126, 132, 129, 117, 123, 120, 486, 492, 489,
         504, 510, 507, 495, 501, 498, 540, 546, 543, 558, 564, 561, 549, 555,
         552, 513, 519, 516, 531, 537, 534, 522, 528, 525, 648, 654, 651, 666,
         672, 669, 657, 663, 660, 702, 708, 705, 720, 726, 723, 711, 717, 714,
         675, 681, 678, 693, 699, 696, 684, 690, 687, 567, 573, 570, 585, 591,
         588, 576, 582, 579, 621, 627, 624, 639, 645, 642, 630, 636, 633, 594,
         600, 597, 612, 618, 615, 603, 609, 606, 243, 249, 246, 261, 267, 264,
         252, 258, 255, 297, 303, 300, 315, 321, 318, 306, 312, 309, 270, 276,
         273, 288, 294, 291, 279, 285, 282, 405, 411, 408, 423, 429, 426, 414,
         420, 417, 459, 465, 462, 477, 483, 480, 468, 474, 471, 432, 438, 435,
         450, 456, 453, 441, 447, 444, 324, 330, 327, 342, 348, 345, 333, 339,
         336, 378, 384, 381, 396, 402, 399, 387, 393, 390, 351, 357, 354, 369,
         375, 372, 360, 366, 363, 487, 493, 490, 505, 511, 508, 496, 502, 499,
         541, 547, 544, 559, 565, 562, 550, 556, 553, 514, 520, 517, 532, 538,
         535, 523, 529, 526, 649, 655, 652, 667, 673, 670, 658, 664, 661, 703,
         709, 706, 721, 727, 724, 712, 718, 715, 676, 682, 679, 694, 700, 697,
         685, 691, 688, 568, 574, 571, 586, 592, 589, 577, 583, 580, 622, 628,
         625, 640, 646, 643, 631, 637, 634, 595, 601, 598, 613, 619, 616, 604,
         610, 607, 244, 250, 247, 262, 268, 265, 253, 259, 256, 298, 304, 301,
         316, 322, 319, 307, 313, 310, 271, 277, 274, 289, 295, 292, 280, 286,
         283, 406, 412, 409, 424, 430, 427, 415, 421, 418, 460, 466, 463, 478,
         484, 481, 469, 475, 472, 433, 439, 436, 451, 457, 454, 442, 448, 445,
         325, 331, 328, 343, 349, 346, 334, 340, 337, 379, 385, 382, 397, 403,
         400, 388, 394, 391, 352, 358, 355, 370, 376, 373, 361, 367, 364, 1,
         7,   4,   19,  25,  22,  10,  16,  13,  55,  61,  58,  73,  79,  76,
         64,  70,  67,  28,  34,  31,  46,  52,  49,  37,  43,  40,  163, 169,
         166, 181, 187, 184, 172, 178, 175, 217, 223, 220, 235, 241, 238, 226,
         232, 229, 190, 196, 193, 208, 214, 211, 199, 205, 202, 82,  88,  85,
         100, 106, 103, 91,  97,  94,  136, 142, 139, 154, 160, 157, 145, 151,
         148, 109, 115, 112, 127, 133, 130, 118, 124, 121, 245, 251, 248, 263,
         269, 266, 254, 260, 257, 299, 305, 302, 317, 323, 320, 308, 314, 311,
         272, 278, 275, 290, 296, 293, 281, 287, 284, 407, 413, 410, 425, 431,
         428, 416, 422, 419, 461, 467, 464, 479, 485, 482, 470, 476, 473, 434,
         440, 437, 452, 458, 455, 443, 449, 446, 326, 332, 329, 344, 350, 347,
         335, 341, 338, 380, 386, 383, 398, 404, 401, 389, 395, 392, 353, 359,
         356, 371, 377, 374, 362, 368, 365, 2,   8,   5,   20,  26,  23,  11,
         17,  14,  56,  62,  59,  74,  80,  77,  65,  71,  68,  29,  35,  32,
         47,  53,  50,  38,  44,  41,  164, 170, 167, 182, 188, 185, 173, 179,
         176, 218, 224, 221, 236, 242, 239, 227, 233, 230, 191, 197, 194, 209,
         215, 212, 200, 206, 203, 83,  89,  86,  101, 107, 104, 92,  98,  95,
         137, 143, 140, 155, 161, 158, 146, 152, 149, 110, 116, 113, 128, 134,
         131, 119, 125, 122, 488, 494, 491, 506, 512, 509, 497, 503, 500, 542,
         548, 545, 560, 566, 563, 551, 557, 554, 515, 521, 518, 533, 539, 536,
         524, 530, 527, 650, 656, 653, 668, 674, 671, 659, 665, 662, 704, 710,
         707, 722, 728, 725, 713, 719, 716, 677, 683, 680, 695, 701, 698, 686,
         692, 689, 569, 575, 572, 587, 593, 590, 578, 584, 581, 623, 629, 626,
         641, 647, 644, 632, 638, 635, 596, 602, 599, 614, 620, 617, 605, 611,
         608}));

    REQUIRE(S->size() == static_cast<uint64_t>(84129611558952960));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "016",
                          "perm. group SL(3, 5) (order 372000)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 126;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(
        Perm({0,  1,  76,  101, 26, 51, 6,  81, 106, 31, 56, 11, 86, 111, 36,
              61, 16, 91,  116, 41, 66, 21, 96, 121, 46, 71, 2,  77, 102, 27,
              52, 7,  82,  107, 32, 57, 12, 87, 112, 37, 62, 17, 92, 117, 42,
              67, 22, 97,  122, 47, 72, 3,  78, 103, 28, 53, 8,  83, 108, 33,
              58, 13, 88,  113, 38, 63, 18, 93, 118, 43, 68, 23, 98, 123, 48,
              73, 4,  79,  104, 29, 54, 9,  84, 109, 34, 59, 14, 89, 114, 39,
              64, 19, 94,  119, 44, 69, 24, 99, 124, 49, 74, 5,  80, 105, 30,
              55, 10, 85,  110, 35, 60, 15, 90, 115, 40, 65, 20, 95, 120, 45,
              70, 25, 100, 125, 50, 75}));
    S->add_generator(
        Perm({0,  1,  77, 103, 29, 55, 6,  82, 108, 34, 60, 11, 87,  113, 39,
              65, 16, 92, 118, 44, 70, 21, 97, 123, 49, 75, 2,  78,  105, 26,
              54, 7,  83, 110, 31, 59, 12, 88, 115, 36, 64, 17, 93,  120, 41,
              69, 22, 98, 125, 46, 74, 3,  80, 104, 27, 51, 8,  85,  109, 32,
              56, 13, 90, 114, 37, 61, 18, 95, 119, 42, 66, 23, 100, 124, 47,
              71, 4,  76, 102, 30, 53, 9,  81, 107, 35, 58, 14, 86,  112, 40,
              63, 19, 91, 117, 45, 68, 24, 96, 122, 50, 73, 5,  79,  101, 28,
              52, 10, 84, 106, 33, 57, 15, 89, 111, 38, 62, 20, 94,  116, 43,
              67, 25, 99, 121, 48, 72}));
    S->add_generator(
        Perm({0,  1,  81, 111, 41, 71, 6,  86,  121, 26, 66, 11, 96, 116, 31,
              51, 16, 76, 106, 46, 61, 21, 91,  101, 36, 56, 2,  82, 112, 42,
              72, 7,  87, 122, 27, 67, 12, 97,  117, 32, 52, 17, 77, 107, 47,
              62, 22, 92, 102, 37, 57, 3,  83,  113, 43, 73, 8,  88, 123, 28,
              68, 13, 98, 118, 33, 53, 18, 78,  108, 48, 63, 23, 93, 103, 38,
              58, 4,  84, 114, 44, 74, 9,  89,  124, 29, 69, 14, 99, 119, 34,
              54, 19, 79, 109, 49, 64, 24, 94,  104, 39, 59, 5,  85, 115, 45,
              75, 10, 90, 125, 30, 70, 15, 100, 120, 35, 55, 20, 80, 110, 50,
              65, 25, 95, 105, 40, 60}));
    S->add_generator(
        Perm({0,  1,  76, 101, 26, 51, 7,  82,  107, 32, 57, 13, 88, 113, 38,
              63, 19, 94, 119, 44, 69, 25, 100, 125, 50, 75, 2,  77, 102, 27,
              52, 8,  83, 108, 33, 58, 15, 90,  115, 40, 65, 16, 91, 116, 41,
              66, 24, 99, 124, 49, 74, 3,  78,  103, 28, 53, 10, 85, 110, 35,
              60, 14, 89, 114, 39, 64, 17, 92,  117, 42, 67, 21, 96, 121, 46,
              71, 4,  79, 104, 29, 54, 6,  81,  106, 31, 56, 12, 87, 112, 37,
              62, 20, 95, 120, 45, 70, 23, 98,  123, 48, 73, 5,  80, 105, 30,
              55, 9,  84, 109, 34, 59, 11, 86,  111, 36, 61, 18, 93, 118, 43,
              68, 22, 97, 122, 47, 72}));

    REQUIRE(S->size() == 372000);

    REQUIRE(S->contains(S->generator(0)));
    REQUIRE(S->contains(S->generator(1)));
    REQUIRE(S->contains(S->generator(2)));
    REQUIRE(S->contains(S->generator(3)));
    REQUIRE(!S->contains(
        Perm({0,  1,  76,  101, 26, 51, 7,  82,  107, 32, 57, 13, 88, 113, 38,
              63, 19, 94,  119, 44, 69, 25, 100, 125, 50, 75, 2,  77, 102, 27,
              52, 8,  83,  108, 33, 58, 15, 90,  115, 40, 65, 16, 91, 116, 41,
              66, 24, 99,  124, 49, 74, 3,  78,  103, 28, 53, 10, 85, 110, 35,
              60, 14, 89,  114, 39, 64, 17, 92,  117, 42, 67, 21, 96, 121, 46,
              71, 4,  79,  104, 29, 54, 6,  81,  106, 31, 56, 12, 87, 112, 37,
              62, 20, 120, 95,  45, 70, 23, 98,  123, 48, 73, 5,  80, 105, 30,
              55, 9,  84,  109, 34, 59, 11, 86,  111, 36, 61, 18, 93, 118, 43,
              68, 22, 97,  122, 47, 72})));

    REQUIRE(!S->contains(
        Perm({1,  77, 103, 109, 55, 6,  82, 108, 34,  60, 11, 87,  113, 39,  65,
              16, 92, 118, 44,  70, 21, 97, 123, 49,  75, 2,  78,  105, 26,  54,
              7,  83, 110, 31,  59, 12, 88, 115, 36,  64, 17, 93,  120, 41,  69,
              22, 98, 125, 46,  74, 3,  80, 104, 27,  51, 8,  85,  29,  32,  56,
              13, 90, 114, 37,  61, 18, 95, 119, 42,  66, 23, 100, 124, 47,  71,
              4,  76, 0,   102, 30, 53, 9,  81,  107, 35, 58, 14,  86,  112, 40,
              63, 19, 91,  117, 45, 68, 24, 96,  122, 50, 73, 5,   79,  101, 28,
              52, 10, 84,  106, 33, 57, 15, 89,  111, 38, 62, 20,  94,  116, 43,
              67, 25, 99,  121, 48, 72})));

    REQUIRE(!S->contains(Perm(
        {0,  1,  80, 77,  103, 109, 55, 6,  82,  108, 34, 60, 11,  87,  113,
         39, 65, 16, 92,  118, 44,  70, 21, 97,  123, 49, 75, 2,   78,  105,
         26, 54, 7,  83,  110, 31,  59, 12, 88,  115, 36, 64, 17,  93,  120,
         41, 69, 22, 98,  125, 46,  74, 3,  104, 27,  51, 8,  85,  29,  32,
         56, 13, 90, 114, 37,  61,  18, 95, 119, 42,  66, 23, 100, 124, 47,
         71, 4,  76, 102, 30,  53,  9,  81, 107, 35,  58, 14, 86,  112, 40,
         63, 19, 91, 117, 45,  68,  24, 96, 122, 50,  73, 5,  79,  101, 28,
         52, 10, 84, 106, 33,  57,  15, 89, 111, 38,  62, 20, 94,  116, 43,
         67, 25, 99, 121, 48,  72})));

    REQUIRE(S->contains(
        Perm({0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,
              13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,
              41,  42,  43,  44,  45,  26,  27,  28,  29,  30,  31,  32,  33,
              34,  35,  46,  47,  48,  49,  50,  36,  37,  38,  39,  40,  71,
              72,  73,  74,  75,  66,  67,  68,  69,  70,  51,  52,  53,  54,
              55,  61,  62,  63,  64,  65,  56,  57,  58,  59,  60,  81,  82,
              83,  84,  85,  86,  87,  88,  89,  90,  96,  97,  98,  99,  100,
              76,  77,  78,  79,  80,  91,  92,  93,  94,  95,  111, 112, 113,
              114, 115, 121, 122, 123, 124, 125, 116, 117, 118, 119, 120, 106,
              107, 108, 109, 110, 101, 102, 103, 104, 105})));

    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "017",
                          "perm. group PSL(4, 8) (order 34558531338240)",
                          "[quick][schreier-sims][no-valgrind]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 585;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {1,   9,   17,  25,  33,  41,  49,  57,  65,  73,  81,  89,  97,  105,
         113, 121, 129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217,
         225, 233, 241, 249, 257, 265, 273, 281, 289, 297, 305, 313, 321, 329,
         337, 345, 353, 361, 369, 377, 385, 393, 401, 409, 417, 425, 433, 441,
         449, 457, 465, 473, 481, 489, 497, 505, 513, 521, 529, 537, 545, 553,
         561, 569, 577, 74,  82,  90,  98,  106, 114, 122, 130, 138, 146, 154,
         162, 170, 178, 186, 194, 202, 210, 218, 226, 234, 242, 250, 258, 266,
         274, 282, 290, 298, 306, 314, 322, 330, 338, 346, 354, 362, 370, 378,
         386, 394, 402, 410, 418, 426, 434, 442, 450, 458, 466, 474, 482, 490,
         498, 506, 514, 522, 530, 538, 546, 554, 562, 570, 578, 0,   2,   8,
         7,   6,   5,   4,   3,   10,  18,  26,  34,  42,  50,  58,  66,  16,
         72,  24,  32,  40,  48,  56,  64,  15,  63,  71,  23,  31,  39,  47,
         55,  14,  54,  62,  70,  22,  30,  38,  46,  13,  45,  53,  61,  69,
         21,  29,  37,  12,  36,  44,  52,  60,  68,  20,  28,  11,  27,  35,
         43,  51,  59,  67,  19,  78,  118, 126, 134, 86,  94,  102, 110, 398,
         438, 446, 454, 406, 414, 422, 430, 462, 502, 510, 518, 470, 478, 486,
         494, 526, 566, 574, 582, 534, 542, 550, 558, 142, 182, 190, 198, 150,
         158, 166, 174, 206, 246, 254, 262, 214, 222, 230, 238, 270, 310, 318,
         326, 278, 286, 294, 302, 334, 374, 382, 390, 342, 350, 358, 366, 75,
         91,  99,  107, 115, 123, 131, 83,  203, 219, 227, 235, 243, 251, 259,
         211, 267, 283, 291, 299, 307, 315, 323, 275, 331, 347, 355, 363, 371,
         379, 387, 339, 395, 411, 419, 427, 435, 443, 451, 403, 459, 475, 483,
         491, 499, 507, 515, 467, 523, 539, 547, 555, 563, 571, 579, 531, 139,
         155, 163, 171, 179, 187, 195, 147, 80,  136, 88,  96,  104, 112, 120,
         128, 528, 584, 536, 544, 552, 560, 568, 576, 144, 200, 152, 160, 168,
         176, 184, 192, 208, 264, 216, 224, 232, 240, 248, 256, 272, 328, 280,
         288, 296, 304, 312, 320, 336, 392, 344, 352, 360, 368, 376, 384, 400,
         456, 408, 416, 424, 432, 440, 448, 464, 520, 472, 480, 488, 496, 504,
         512, 76,  100, 108, 116, 124, 132, 84,  92,  268, 292, 300, 308, 316,
         324, 276, 284, 332, 356, 364, 372, 380, 388, 340, 348, 396, 420, 428,
         436, 444, 452, 404, 412, 460, 484, 492, 500, 508, 516, 468, 476, 524,
         548, 556, 564, 572, 580, 532, 540, 140, 164, 172, 180, 188, 196, 148,
         156, 204, 228, 236, 244, 252, 260, 212, 220, 77,  109, 117, 125, 133,
         85,  93,  101, 333, 365, 373, 381, 389, 341, 349, 357, 397, 429, 437,
         445, 453, 405, 413, 421, 461, 493, 501, 509, 517, 469, 477, 485, 525,
         557, 565, 573, 581, 533, 541, 549, 141, 173, 181, 189, 197, 149, 157,
         165, 205, 237, 245, 253, 261, 213, 221, 229, 269, 301, 309, 317, 325,
         277, 285, 293, 79,  127, 135, 87,  95,  103, 111, 119, 463, 511, 519,
         471, 479, 487, 495, 503, 527, 575, 583, 535, 543, 551, 559, 567, 143,
         191, 199, 151, 159, 167, 175, 183, 207, 255, 263, 215, 223, 231, 239,
         247, 271, 319, 327, 279, 287, 295, 303, 311, 335, 383, 391, 343, 351,
         359, 367, 375, 399, 447, 455, 407, 415, 423, 431, 439}));
    S->add_generator(Perm(
        {0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   11,  12,  13,  14,
         15,  16,  10,  25,  27,  28,  29,  30,  31,  32,  26,  33,  35,  36,
         37,  38,  39,  40,  34,  41,  43,  44,  45,  46,  47,  48,  42,  49,
         51,  52,  53,  54,  55,  56,  50,  57,  59,  60,  61,  62,  63,  64,
         58,  65,  67,  68,  69,  70,  71,  72,  66,  17,  19,  20,  21,  22,
         23,  24,  18,  73,  80,  74,  75,  76,  77,  78,  79,  129, 136, 130,
         131, 132, 133, 134, 135, 81,  88,  82,  83,  84,  85,  86,  87,  89,
         96,  90,  91,  92,  93,  94,  95,  97,  104, 98,  99,  100, 101, 102,
         103, 105, 112, 106, 107, 108, 109, 110, 111, 113, 120, 114, 115, 116,
         117, 118, 119, 121, 128, 122, 123, 124, 125, 126, 127, 457, 464, 458,
         459, 460, 461, 462, 463, 513, 520, 514, 515, 516, 517, 518, 519, 465,
         472, 466, 467, 468, 469, 470, 471, 473, 480, 474, 475, 476, 477, 478,
         479, 481, 488, 482, 483, 484, 485, 486, 487, 489, 496, 490, 491, 492,
         493, 494, 495, 497, 504, 498, 499, 500, 501, 502, 503, 505, 512, 506,
         507, 508, 509, 510, 511, 521, 528, 522, 523, 524, 525, 526, 527, 577,
         584, 578, 579, 580, 581, 582, 583, 529, 536, 530, 531, 532, 533, 534,
         535, 537, 544, 538, 539, 540, 541, 542, 543, 545, 552, 546, 547, 548,
         549, 550, 551, 553, 560, 554, 555, 556, 557, 558, 559, 561, 568, 562,
         563, 564, 565, 566, 567, 569, 576, 570, 571, 572, 573, 574, 575, 137,
         144, 138, 139, 140, 141, 142, 143, 193, 200, 194, 195, 196, 197, 198,
         199, 145, 152, 146, 147, 148, 149, 150, 151, 153, 160, 154, 155, 156,
         157, 158, 159, 161, 168, 162, 163, 164, 165, 166, 167, 169, 176, 170,
         171, 172, 173, 174, 175, 177, 184, 178, 179, 180, 181, 182, 183, 185,
         192, 186, 187, 188, 189, 190, 191, 201, 208, 202, 203, 204, 205, 206,
         207, 257, 264, 258, 259, 260, 261, 262, 263, 209, 216, 210, 211, 212,
         213, 214, 215, 217, 224, 218, 219, 220, 221, 222, 223, 225, 232, 226,
         227, 228, 229, 230, 231, 233, 240, 234, 235, 236, 237, 238, 239, 241,
         248, 242, 243, 244, 245, 246, 247, 249, 256, 250, 251, 252, 253, 254,
         255, 265, 272, 266, 267, 268, 269, 270, 271, 321, 328, 322, 323, 324,
         325, 326, 327, 273, 280, 274, 275, 276, 277, 278, 279, 281, 288, 282,
         283, 284, 285, 286, 287, 289, 296, 290, 291, 292, 293, 294, 295, 297,
         304, 298, 299, 300, 301, 302, 303, 305, 312, 306, 307, 308, 309, 310,
         311, 313, 320, 314, 315, 316, 317, 318, 319, 329, 336, 330, 331, 332,
         333, 334, 335, 385, 392, 386, 387, 388, 389, 390, 391, 337, 344, 338,
         339, 340, 341, 342, 343, 345, 352, 346, 347, 348, 349, 350, 351, 353,
         360, 354, 355, 356, 357, 358, 359, 361, 368, 362, 363, 364, 365, 366,
         367, 369, 376, 370, 371, 372, 373, 374, 375, 377, 384, 378, 379, 380,
         381, 382, 383, 393, 400, 394, 395, 396, 397, 398, 399, 449, 456, 450,
         451, 452, 453, 454, 455, 401, 408, 402, 403, 404, 405, 406, 407, 409,
         416, 410, 411, 412, 413, 414, 415, 417, 424, 418, 419, 420, 421, 422,
         423, 425, 432, 426, 427, 428, 429, 430, 431, 433, 440, 434, 435, 436,
         437, 438, 439, 441, 448, 442, 443, 444, 445, 446, 447}));

    REQUIRE(S->size() == static_cast<uint64_t>(34558531338240));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "018",
                          "perm. Mathieu group M11 (order 7920)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 11;
    using Perm          = Perm<0, size_t>;
    auto S              = SchreierSims<N, size_t, Perm>();

    S.add_generator(Perm({0, 9, 2, 10, 6, 5, 4, 8, 7, 1, 3}));
    S.add_generator(Perm({3, 4, 7, 2, 5, 8, 6, 0, 1, 9, 10}));

    REQUIRE(S.size() == 7920);
    REQUIRE(S.contains(S.generator(0)));
    REQUIRE(S.contains(S.generator(1)));
    REQUIRE(S.contains(Perm({10, 8, 5, 0, 1, 2, 4, 9, 7, 6, 3})));
    REQUIRE(S.contains(Perm({3, 6, 0, 9, 4, 10, 7, 5, 2, 8, 1})));
    REQUIRE(!S.contains(Perm({4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3})));
    REQUIRE(!S.contains(Perm({6, 7, 8, 9, 10, 0, 2, 1, 3, 5, 4})));
    REQUIRE(!S.contains(Perm({9, 10, 1, 2, 3, 4, 0, 5, 6, 7, 8})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "019",
                          "perm. Mathieu group M24 (order 244823040)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 24;
    auto             S  = SchreierSims<N>();
    using Perm          = decltype(S)::element_type;

    S.add_generator(Perm({1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12,
                          13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0,  23}));
    S.add_generator(Perm({0,  1,  16, 12, 3, 5,  8, 17, 2,  6,  11, 22,
                          13, 18, 19, 14, 9, 10, 4, 21, 15, 20, 7,  23}));

    S.add_generator(Perm({23, 22, 11, 15, 17, 9, 19, 13, 20, 5,  16, 2,
                          21, 7,  18, 3,  10, 4, 14, 6,  8,  12, 1,  0}));

    REQUIRE(S.size() == 244823040);
    REQUIRE(S.contains(S.generator(0)));
    REQUIRE(S.contains(S.generator(1)));
    REQUIRE(S.contains(Perm({1,  16, 12, 3, 5,  8, 17, 2,  6,  11, 22, 13,
                             18, 19, 14, 9, 10, 4, 21, 15, 20, 7,  0,  23})));
    REQUIRE(S.contains(Perm({12, 16, 18, 10, 20, 14, 21, 6,  17, 3,  22, 8,
                             19, 4,  11, 5,  15, 7,  9,  13, 2,  23, 0,  1})));
    REQUIRE(S.contains(Perm({19, 9, 21, 13, 10, 22, 6, 16, 7,  8, 11, 17,
                             12, 5, 15, 1,  14, 0,  4, 18, 20, 3, 23, 2})));
    REQUIRE(
        !S.contains(Perm({0,  3,  2,  1,  4,  5,  6,  7,  8,  9,  10, 11,
                          12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23})));
    REQUIRE(
        !S.contains(Perm({0,  1,  3,  4,  2,  5,  6,  7,  8,  9,  10, 11,
                          12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23})));
    REQUIRE(
        !S.contains(Perm({0,  1,  3,  4,  2,  6,  5,  7,  8,  9,  10, 11,
                          12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "020",
                          "perm. Janko Group J1 (order 175560)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 267;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,   262, 107, 21,  213, 191, 22,  133, 234, 232, 151, 139, 176, 202,
         253, 222, 16,  195, 206, 68,  55,  3,   6,   179, 217, 216, 256, 87,
         70,  131, 44,  105, 170, 77,  104, 198, 137, 243, 56,  124, 223, 134,
         42,  174, 30,  45,  51,  128, 94,  250, 264, 46,  183, 231, 115, 20,
         38,  85,  233, 261, 95,  235, 177, 249, 91,  247, 155, 67,  19,  219,
         28,  237, 211, 84,  192, 130, 251, 33,  78,  260, 112, 193, 156, 242,
         73,  57,  238, 27,  143, 168, 148, 64,  119, 212, 48,  60,  150, 199,
         140, 189, 180, 147, 111, 159, 34,  31,  162, 2,   194, 166, 200, 102,
         80,  120, 141, 54,  182, 181, 225, 92,  113, 254, 125, 146, 39,  122,
         208, 221, 47,  210, 75,  29,  255, 7,   41,  135, 175, 36,  207, 11,
         98,  114, 240, 88,  172, 185, 123, 101, 90,  224, 96,  10,  169, 241,
         190, 66,  82,  214, 161, 103, 236, 158, 106, 239, 229, 230, 109, 188,
         89,  152, 32,  258, 144, 186, 43,  136, 12,  62,  245, 23,  100, 117,
         116, 52,  205, 145, 173, 228, 167, 99,  154, 5,   74,  81,  108, 17,
         196, 203, 35,  97,  110, 252, 13,  197, 204, 184, 18,  138, 126, 248,
         129, 72,  93,  4,   157, 259, 25,  24,  246, 69,  227, 127, 15,  40,
         149, 118, 226, 220, 187, 164, 165, 53,  9,   58,  8,   61,  160, 71,
         86,  163, 142, 153, 83,  37,  244, 178, 218, 65,  209, 63,  49,  76,
         201, 14,  121, 132, 26,  263, 171, 215, 79,  59,  1,   257, 50,  266,
         265}));
    S->add_generator(Perm(
        {0,   146, 132, 3,   156, 242, 107, 125, 245, 174, 241, 264, 248, 36,
         116, 47,  178, 170, 197, 233, 121, 1,   228, 48,  201, 15,  136, 212,
         6,   175, 77,  237, 30,  226, 31,  129, 44,  161, 232, 219, 78,  139,
         9,   211, 13,  222, 97,  25,  173, 70,  153, 186, 29,  203, 35,  169,
         140, 260, 91,  199, 108, 208, 206, 11,  55,  103, 65,  95,  73,  151,
         131, 41,  221, 225, 18,  143, 7,   32,  159, 217, 93,  181, 2,   258,
         163, 154, 182, 38,  133, 117, 33,  243, 191, 122, 27,  205, 20,  135,
         98,  229, 138, 61,  194, 66,  104, 149, 62,  28,  164, 123, 17,  137,
         16,  69,  37,  238, 128, 247, 57,  167, 134, 96,  80,  193, 185, 76,
         83,  218, 14,  54,  8,   49,  82,  215, 189, 46,  190, 183, 188, 71,
         230, 231, 239, 202, 224, 158, 21,  119, 214, 184, 250, 113, 72,  200,
         213, 22,  166, 102, 220, 40,  92,  114, 257, 177, 60,  179, 4,   147,
         168, 64,  110, 171, 148, 23,  42,  52,  195, 84,  112, 246, 19,  252,
         196, 111, 105, 265, 209, 24,  100, 120, 26,  160, 39,  109, 157, 266,
         86,  74,  204, 227, 50,  187, 75,  216, 207, 67,  106, 198, 101, 51,
         141, 251, 94,  85,  172, 88,  53,  254, 261, 192, 145, 152, 240, 262,
         249, 68,  90,  59,  155, 263, 56,  210, 87,  180, 12,  115, 142, 34,
         235, 236, 45,  244, 253, 58,  10,  130, 165, 89,  234, 144, 259, 43,
         81,  5,   79,  223, 162, 256, 126, 150, 118, 127, 255, 99,  63,  124,
         176}));

    REQUIRE(S->size() == 175560);
    REQUIRE(S->contains(S->generator(0)));
    REQUIRE(S->contains(S->generator(1)));
    REQUIRE(S->contains(Perm(
        {0,   174, 56,  262, 210, 214, 81,  21,  160, 230, 148, 170, 67,  91,
         126, 238, 25,  85,  260, 32,  16,  29,  181, 66,  248, 143, 167, 39,
         241, 115, 98,  139, 226, 20,  12,  73,  152, 10,  141, 165, 121, 117,
         169, 84,  11,  211, 112, 116, 234, 38,  131, 48,  219, 222, 68,  217,
         9,   265, 188, 176, 74,  173, 69,  255, 163, 40,  77,  45,  264, 147,
         225, 63,  33,  58,  212, 17,  51,  261, 3,   119, 59,  65,  6,   41,
         103, 80,  231, 43,  184, 201, 151, 189, 47,  49,  42,  245, 124, 92,
         206, 71,  123, 61,  259, 239, 105, 178, 113, 183, 96,  104, 111, 195,
         199, 194, 192, 216, 83,  97,  64,  180, 94,  130, 8,   156, 134, 144,
         246, 89,  110, 221, 82,  243, 190, 76,  154, 28,  120, 249, 114, 87,
         23,  102, 150, 218, 34,  202, 57,  235, 127, 26,  253, 257, 258, 108,
         205, 37,  132, 177, 208, 18,  191, 233, 54,  35,  182, 251, 55,  27,
         247, 254, 19,  266, 44,  99,  5,   122, 186, 88,  60,  136, 24,  30,
         242, 166, 50,  263, 75,  256, 118, 52,  187, 158, 53,  1,   237, 209,
         240, 14,  4,   204, 140, 155, 90,  145, 146, 153, 86,  198, 175, 252,
         236, 125, 109, 193, 223, 250, 227, 215, 72,  129, 93,  13,  15,  213,
         7,   168, 172, 224, 128, 203, 244, 22,  200, 133, 161, 142, 171, 135,
         138, 31,  2,   106, 197, 157, 196, 185, 164, 159, 137, 79,  107, 149,
         228, 62,  179, 101, 100, 229, 162, 220, 70,  232, 95,  78,  36,  46,
         207})));

    REQUIRE(S->contains(Perm(
        {0,   56,  118, 229, 217, 125, 79,  100, 1,   259, 190, 122, 60,  260,
         52,  206, 189, 71,  120, 23,  44,  160, 186, 148, 265, 170, 243, 195,
         204, 151, 179, 202, 254, 161, 169, 201, 235, 96,  46,  200, 37,  90,
         121, 54,  3,   212, 130, 248, 156, 143, 141, 246, 106, 146, 43,  234,
         116, 171, 178, 105, 64,  20,  29,  164, 137, 113, 182, 209, 31,  163,
         159, 227, 197, 262, 107, 66,  22,  59,  58,  244, 73,  230, 115, 2,
         165, 152, 6,   240, 158, 167, 4,   264, 36,  255, 191, 101, 261, 192,
         239, 62,  117, 231, 30,  17,  241, 14,  75,  144, 40,  147, 119, 132,
         203, 174, 133, 136, 78,  16,  155, 18,  139, 95,  11,  68,  258, 228,
         13,  8,   5,   177, 193, 124, 238, 50,  112, 70,  157, 218, 61,  224,
         85,  55,  166, 104, 142, 97,  84,  232, 129, 74,  24,  266, 123, 215,
         108, 49,  173, 87,  127, 126, 45,  28,  245, 249, 47,  69,  226, 21,
         138, 196, 63,  57,  72,  91,  53,  111, 140, 48,  88,  149, 199, 187,
         216, 222, 32,  172, 33,  253, 131, 225, 81,  256, 221, 237, 109, 211,
         210, 250, 114, 183, 150, 15,  236, 154, 181, 39,  25,  214, 134, 207,
         175, 220, 251, 145, 180, 233, 77,  7,   94,  80,  162, 213, 247, 67,
         103, 41,  102, 110, 27,  184, 38,  185, 205, 198, 153, 99,  252, 242,
         26,  83,  219, 98,  10,  34,  263, 128, 12,  223, 35,  65,  42,  93,
         176, 76,  168, 257, 51,  89,  135, 92,  188, 208, 82,  86,  19,  194,
         9})));

    REQUIRE(S->contains(Perm(
        {0,   201, 243, 31,  229, 136, 122, 223, 164, 155, 185, 45,  3,   81,
         166, 48,  14,  105, 162, 169, 228, 94,  212, 43,  167, 190, 93,  202,
         224, 55,  56,  29,  118, 116, 194, 161, 184, 39,  134, 22,  181, 66,
         8,   216, 112, 110, 58,  183, 131, 156, 103, 244, 144, 203, 5,   59,
         9,   231, 108, 238, 52,  111, 255, 178, 226, 23,  92,  82,  173, 51,
         145, 26,  146, 138, 196, 143, 163, 37,  249, 246, 53,  191, 117, 245,
         200, 4,   30,  106, 247, 32,  192, 263, 49,  142, 171, 34,  188, 151,
         65,  260, 36,  6,   68,  259, 265, 123, 20,  73,  193, 63,  258, 100,
         2,   41,  16,  7,   124, 132, 230, 86,  135, 113, 83,  17,  149, 33,
         256, 84,  42,  128, 180, 236, 47,  187, 11,  74,  253, 61,  67,  209,
         211, 70,  237, 198, 25,  266, 130, 182, 125, 213, 250, 257, 141, 199,
         147, 13,  175, 102, 91,  27,  205, 75,  222, 242, 153, 206, 76,  88,
         1,   140, 96,  18,  69,  85,  189, 10,  50,  208, 227, 21,  139, 165,
         40,  87,  35,  204, 179, 99,  158, 176, 79,  251, 38,  109, 57,  89,
         221, 90,  24,  219, 252, 214, 159, 157, 239, 262, 129, 121, 160, 232,
         80,  97,  77,  60,  54,  44,  177, 195, 19,  154, 28,  225, 114, 62,
         240, 248, 150, 120, 126, 133, 168, 119, 218, 64,  172, 217, 197, 98,
         170, 78,  174, 15,  186, 101, 220, 115, 254, 137, 46,  207, 261, 95,
         152, 235, 148, 215, 107, 72,  264, 234, 210, 127, 71,  104, 241, 12,
         233})));

    REQUIRE(!S->contains(Perm(
        {0,   250, 199, 41,  146, 23,  54,  53,  254, 33,  40,  80,  184, 78,
         34,  92,  102, 263, 45,  195, 153, 106, 58,  192, 127, 93,  209, 70,
         126, 143, 152, 166, 85,  87,  112, 49,  222, 159, 42,  210, 238, 150,
         191, 239, 52,  179, 174, 55,  75,  51,  142, 165, 1,   81,  56,  9,
         198, 225, 64,  197, 234, 38,  178, 132, 183, 226, 265, 202, 241, 129,
         26,  36,  116, 103, 28,  90,  252, 57,  119, 67,  171, 211, 161, 60,
         94,  18,  180, 134, 236, 136, 131, 176, 201, 66,  167, 182, 124, 137,
         220, 181, 262, 50,  27,  256, 135, 74,  113, 245, 118, 91,  160, 109,
         186, 97,  215, 105, 20,  175, 24,  149, 71,  17,  144, 125, 207, 43,
         59,  224, 242, 235, 82,  189, 84,  13,  227, 156, 120, 7,   208, 139,
         117, 257, 2,   30,  35,  244, 6,   114, 217, 72,  44,  63,  89,  145,
         31,  266, 76,  121, 204, 240, 115, 163, 98,  264, 233, 260, 162, 65,
         219, 253, 194, 151, 111, 123, 5,   39,  46,  212, 99,  108, 16,  22,
         138, 83,  104, 148, 69,  203, 187, 157, 206, 3,   246, 29,  243, 232,
         101, 168, 229, 221, 140, 213, 231, 47,  228, 188, 100, 248, 185, 128,
         200, 88,  155, 122, 14,  107, 95,  73,  77,  110, 169, 79,  193, 32,
         223, 249, 11,  205, 173, 190, 251, 196, 10,  218, 62,  37,  21,  86,
         147, 258, 214, 130, 237, 164, 133, 19,  172, 247, 177, 255, 12,  158,
         48,  261, 259, 170, 216, 154, 230, 96,  15,  141, 4,   61,  25,  68,
         8})));

    REQUIRE(!S->contains(Perm(
        {0,   89,  18,  6,   159, 73,  100, 91,  110, 216, 66,  56,  144, 22,
         62,  15,  23,  146, 188, 11,  245, 148, 86,  96,  156, 114, 221, 103,
         217, 7,   129, 26,  111, 51,  232, 12,  141, 243, 212, 167, 225, 219,
         177, 34,  104, 64,  54,  255, 165, 250, 136, 202, 227, 20,  246, 124,
         134, 65,  84,  61,  77,  97,  162, 259, 247, 263, 215, 139, 150, 48,
         196, 181, 106, 187, 95,  44,  2,   33,  5,   260, 19,  127, 195, 69,
         58,  75,  142, 32,  203, 224, 45,  251, 4,   99,  88,  233, 184, 189,
         173, 85,  163, 249, 16,  43,  93,  27,  264, 140, 208, 166, 101, 39,
         211, 14,  206, 192, 230, 107, 87,  63,  102, 204, 205, 70,  115, 145,
         8,   3,   198, 182, 24,  153, 168, 174, 200, 154, 55,  40,  53,  59,
         125, 30,  112, 38,  265, 236, 223, 242, 262, 76,  190, 133, 28,  194,
         183, 213, 130, 60,  257, 123, 171, 253, 234, 149, 94,  109, 83,  118,
         256, 126, 176, 164, 31,  228, 151, 42,  261, 201, 226, 248, 244, 78,
         258, 220, 120, 178, 239, 71,  90,  67,  119, 197, 50,  199, 143, 175,
         92,  52,  29,  9,   80,  82,  157, 160, 147, 240, 49,  122, 191, 170,
         252, 13,  131, 209, 161, 254, 266, 74,  113, 41,  179, 116, 21,  185,
         1,   137, 17,  108, 214, 193, 172, 238, 105, 152, 218, 47,  117, 25,
         222, 35,  79,  180, 210, 138, 46,  37,  241, 81,  135, 169, 237, 128,
         121, 98,  158, 132, 235, 10,  36,  68,  207, 155, 231, 72,  57,  186,
         229})));

    REQUIRE(!S->contains(Perm(
        {0,   56,  118, 229, 217, 125, 79,  100, 1,   259, 190, 122, 60,  260,
         52,  206, 189, 71,  120, 23,  44,  160, 186, 148, 265, 170, 243, 195,
         204, 151, 179, 202, 254, 161, 169, 201, 235, 96,  46,  200, 37,  90,
         121, 54,  4,   212, 130, 248, 156, 143, 141, 246, 106, 146, 43,  234,
         116, 171, 178, 105, 64,  20,  29,  164, 137, 113, 182, 209, 31,  163,
         159, 227, 197, 262, 107, 66,  22,  59,  58,  244, 73,  230, 115, 3,
         165, 152, 2,   240, 158, 167, 5,   264, 36,  255, 191, 101, 261, 192,
         239, 62,  117, 231, 30,  17,  241, 14,  75,  144, 40,  147, 119, 132,
         203, 174, 133, 136, 78,  16,  155, 18,  139, 95,  11,  68,  258, 228,
         13,  8,   6,   177, 193, 124, 238, 50,  112, 70,  157, 218, 61,  224,
         85,  55,  166, 104, 142, 97,  84,  232, 129, 74,  24,  266, 123, 215,
         108, 49,  173, 87,  127, 126, 45,  28,  245, 249, 47,  69,  226, 21,
         138, 196, 63,  57,  72,  91,  53,  111, 140, 48,  88,  149, 199, 187,
         216, 222, 32,  172, 33,  253, 131, 225, 81,  256, 221, 237, 109, 211,
         210, 250, 114, 183, 150, 15,  236, 154, 181, 39,  25,  214, 134, 207,
         175, 220, 251, 145, 180, 233, 77,  7,   94,  80,  162, 213, 247, 67,
         103, 41,  102, 110, 27,  184, 38,  185, 205, 198, 153, 99,  252, 242,
         26,  83,  219, 98,  10,  34,  263, 128, 12,  223, 35,  65,  42,  93,
         176, 76,  168, 257, 51,  89,  135, 92,  188, 208, 82,  86,  19,  194,
         9})));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "021",
                          "perm. Hall-Janko group (order 604800)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 101;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,  84, 20, 48, 56, 82, 67, 55, 41, 35, 40, 78, 100, 49, 37, 94, 76,
         19, 44, 17, 2,  34, 85, 92, 57, 75, 28, 64, 26, 90,  97, 38, 68, 69,
         21, 9,  53, 14, 31, 61, 10, 8,  73, 91, 18, 86, 81,  89, 3,  13, 93,
         96, 72, 36, 74, 7,  4,  24, 99, 95, 63, 39, 83, 60,  27, 70, 88, 6,
         32, 33, 65, 87, 52, 42, 54, 25, 16, 98, 11, 80, 79,  46, 5,  62, 1,
         22, 45, 71, 66, 47, 29, 43, 23, 50, 15, 59, 51, 30,  77, 58, 12}));
    S->add_generator(Perm(
        {0,  80, 9,  53, 23, 51, 37, 7,  27, 11, 62, 2,   65, 64, 61, 98, 73,
         39, 5,  13, 97, 96, 1,  78, 6,  15, 93, 60, 57,  71, 69, 12, 16, 17,
         86, 28, 36, 24, 59, 33, 43, 41, 68, 91, 42, 30,  85, 10, 76, 92, 66,
         18, 14, 87, 95, 29, 54, 35, 20, 94, 8,  52, 47,  74, 19, 31, 88, 21,
         44, 45, 81, 55, 63, 32, 72, 70, 90, 49, 4,  100, 22, 75, 34, 79, 84,
         89, 82, 3,  50, 46, 48, 40, 77, 99, 38, 56, 67,  58, 25, 26, 83}));

    REQUIRE(S->size() == 604800);
    REQUIRE(S->contains(S->generator(0)));
    REQUIRE(S->contains(S->generator(1)));
    REQUIRE(S->contains(Perm(
        {0,  22, 11, 87, 78, 18, 24, 7,  60, 2,  47, 9,  31, 19, 52, 25,  32,
         33, 51, 64, 58, 67, 80, 4,  37, 98, 99, 8,  35, 55, 45, 65, 73,  39,
         82, 57, 36, 6,  94, 17, 91, 41, 44, 40, 68, 69, 89, 62, 90, 77,  88,
         5,  61, 3,  56, 71, 95, 28, 97, 38, 27, 14, 10, 72, 13, 12, 50,  96,
         42, 30, 75, 29, 74, 16, 63, 81, 48, 92, 23, 83, 1,  70, 86, 100, 84,
         46, 34, 53, 66, 85, 76, 43, 49, 26, 59, 54, 21, 20, 15, 93, 79})));
    REQUIRE(S->contains(Perm(
        {0,  59, 20,  76, 38, 35, 13, 73, 45, 94, 84, 82, 10, 14, 58, 39, 68,
         95, 37, 54,  52, 16, 89, 26, 51, 81, 50, 23, 18, 71, 60, 43, 7,  25,
         9,  88, 48,  97, 2,  96, 46, 92, 53, 62, 32, 66, 80, 40, 5,  28, 57,
         90, 93, 29,  70, 55, 33, 77, 6,  78, 74, 19, 31, 12, 24, 72, 99, 17,
         30, 42, 100, 3,  27, 67, 21, 98, 36, 41, 8,  15, 79, 56, 34, 75, 47,
         91, 86, 44,  69, 49, 87, 65, 85, 4,  22, 64, 63, 11, 83, 61, 1})));
    REQUIRE(S->contains(Perm(
        {0,  74, 78, 68,  70, 20, 98, 18, 21, 75, 85, 44, 43, 67, 50, 37, 42,
         31, 72, 60, 54,  3,  83, 9,  34, 47, 28, 13, 32, 36, 52, 91, 87, 46,
         24, 93, 71, 86,  99, 82, 65, 56, 53, 12, 73, 88, 62, 89, 45, 58, 14,
         7,  66, 16, 100, 55, 97, 94, 51, 35, 4,  69, 15, 80, 26, 39, 30, 27,
         2,  76, 38, 29,  49, 57, 5,  23, 48, 63, 8,  95, 84, 11, 6,  77, 22,
         10, 33, 96, 61,  17, 90, 25, 79, 59, 81, 41, 64, 92, 40, 19, 1})));
    REQUIRE(!S->contains(Perm(
        {0,  2,  1,  4,  3,  5,  6,  8,  9,  10, 7,  11, 12, 13, 14, 15, 16,
         17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
         34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
         51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
         68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
         85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100})));
    REQUIRE(!S->contains(Perm(
        {0,  3,  100, 4,  8,  5,  6,  7,  1,  33, 10, 11, 12, 13, 14, 15, 16,
         17, 18, 19,  20, 21, 22, 23, 24, 25, 89, 27, 28, 29, 30, 31, 32, 2,
         34, 35, 36,  37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
         51, 52, 53,  54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
         68, 69, 70,  71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 93, 83, 84,
         85, 86, 87,  88, 82, 90, 91, 92, 26, 94, 95, 96, 97, 98, 99, 9})));
    REQUIRE(!S->contains(Perm(
        {0,  5,  3,  1,  4,  100, 6,  7,  23, 9,  19, 11, 12, 13, 14, 15, 16,
         17, 18, 8,  20, 21, 22,  45, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
         34, 35, 36, 37, 38, 39,  40, 41, 42, 43, 44, 10, 46, 47, 48, 49, 50,
         51, 52, 53, 54, 55, 56,  57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
         68, 69, 70, 71, 72, 73,  74, 75, 76, 77, 78, 79, 80, 81, 82, 2,  84,
         85, 86, 87, 88, 89, 90,  91, 92, 93, 94, 95, 96, 97, 98, 99, 83})));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "022",
                          "perm. Hall-Janko group (alt.) (order 604800)",
                          "[quick][schreier-sims][no-valgrind]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 841;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,   2,   1,   5,   7,   3,   10,  4,   12,  13,  6,   16,  8,   9,
         20,  21,  11,  24,  25,  27,  14,  15,  31,  32,  17,  18,  36,  19,
         38,  39,  41,  22,  23,  45,  46,  48,  26,  51,  28,  29,  55,  30,
         57,  58,  59,  33,  34,  63,  35,  65,  66,  37,  67,  68,  70,  40,
         73,  42,  43,  44,  77,  78,  80,  47,  83,  49,  50,  52,  53,  89,
         54,  91,  72,  56,  92,  93,  95,  60,  61,  99,  62,  101, 102, 64,
         103, 104, 106, 108, 110, 69,  113, 71,  74,  75,  118, 76,  120, 121,
         123, 79,  126, 81,  82,  84,  85,  132, 86,  134, 87,  136, 88,  138,
         139, 90,  140, 141, 142, 144, 94,  147, 96,  97,  151, 98,  153, 154,
         100, 155, 156, 158, 160, 162, 105, 165, 107, 168, 109, 171, 111, 112,
         114, 115, 116, 177, 117, 179, 180, 119, 181, 182, 184, 122, 187, 124,
         125, 127, 128, 193, 129, 195, 130, 197, 131, 199, 200, 133, 201, 202,
         135, 205, 206, 137, 207, 208, 210, 212, 214, 143, 217, 145, 146, 148,
         149, 223, 150, 224, 186, 152, 225, 226, 228, 230, 192, 157, 234, 159,
         237, 161, 240, 163, 164, 166, 167, 204, 203, 169, 170, 172, 173, 251,
         174, 253, 175, 255, 176, 257, 258, 178, 259, 260, 262, 264, 266, 183,
         185, 188, 189, 272, 190, 274, 191, 276, 277, 278, 194, 279, 280, 196,
         283, 284, 198, 285, 286, 288, 290, 292, 294, 295, 297, 250, 249, 209,
         302, 211, 305, 213, 308, 215, 216, 218, 219, 314, 220, 316, 221, 318,
         222, 320, 321, 322, 323, 325, 227, 328, 229, 331, 231, 232, 233, 235,
         236, 282, 281, 238, 239, 241, 242, 342, 243, 344, 244, 345, 245, 347,
         246, 247, 350, 248, 298, 352, 353, 354, 252, 355, 356, 254, 359, 360,
         256, 361, 362, 364, 366, 368, 261, 371, 263, 374, 265, 377, 267, 268,
         269, 270, 382, 271, 384, 385, 273, 386, 387, 275, 390, 391, 392, 335,
         395, 397, 398, 400, 402, 379, 287, 406, 289, 291, 409, 293, 412, 414,
         296, 407, 299, 300, 301, 303, 304, 358, 357, 306, 307, 309, 310, 422,
         311, 423, 312, 425, 313, 427, 428, 315, 429, 430, 317, 433, 434, 319,
         435, 341, 437, 439, 324, 442, 326, 327, 329, 330, 389, 388, 332, 333,
         334, 450, 451, 336, 417, 337, 338, 454, 339, 456, 340, 458, 459, 460,
         343, 351, 461, 346, 410, 462, 348, 465, 349, 467, 469, 396, 471, 473,
         420, 476, 363, 365, 480, 367, 483, 369, 370, 372, 373, 432, 431, 375,
         376, 378, 493, 380, 495, 381, 497, 498, 383, 444, 443, 501, 503, 504,
         506, 507, 393, 394, 511, 470, 399, 487, 401, 516, 403, 404, 405, 408,
         411, 523, 524, 413, 527, 415, 530, 416, 453, 418, 533, 419, 535, 536,
         421, 538, 539, 540, 424, 543, 544, 426, 545, 546, 548, 455, 488, 513,
         550, 532, 509, 436, 518, 438, 556, 440, 441, 560, 500, 445, 561, 446,
         447, 564, 448, 449, 566, 492, 567, 452, 552, 489, 568, 569, 457, 572,
         494, 573, 575, 577, 578, 463, 464, 581, 582, 466, 583, 576, 468, 586,
         491, 472, 590, 474, 475, 594, 477, 478, 479, 542, 541, 481, 482, 484,
         485, 604, 486, 606, 490, 608, 512, 609, 610, 611, 496, 612, 613, 615,
         499, 502, 617, 619, 505, 622, 508, 510, 514, 515, 571, 570, 517, 519,
         629, 520, 529, 521, 522, 632, 633, 525, 526, 528, 637, 638, 531, 607,
         639, 640, 534, 641, 642, 643, 537, 644, 645, 647, 649, 651, 602, 653,
         600, 656, 547, 659, 549, 587, 551, 553, 554, 555, 557, 558, 668, 559,
         669, 562, 672, 563, 636, 674, 565, 675, 676, 678, 661, 681, 682, 574,
         685, 687, 579, 580, 691, 693, 620, 584, 585, 588, 589, 591, 592, 593,
         595, 596, 699, 597, 701, 598, 684, 599, 704, 601, 706, 707, 603, 709,
         710, 605, 711, 626, 662, 703, 712, 714, 697, 717, 614, 616, 721, 722,
         618, 725, 621, 623, 624, 728, 625, 679, 729, 627, 628, 732, 650, 630,
         686, 631, 733, 724, 735, 634, 737, 635, 739, 740, 742, 666, 745, 646,
         720, 648, 749, 663, 652, 751, 654, 655, 727, 657, 658, 660, 664, 713,
         665, 756, 757, 667, 759, 760, 700, 670, 671, 762, 689, 673, 763, 708,
         677, 680, 765, 767, 683, 688, 770, 690, 772, 692, 774, 694, 695, 776,
         696, 778, 779, 698, 781, 782, 775, 702, 783, 705, 752, 784, 755, 754,
         715, 716, 786, 718, 719, 789, 723, 726, 773, 730, 793, 731, 795, 796,
         734, 798, 736, 764, 738, 748, 741, 801, 743, 744, 803, 746, 747, 750,
         753, 806, 758, 808, 809, 761, 805, 812, 813, 766, 816, 768, 769, 819,
         771, 820, 821, 777, 807, 780, 814, 790, 785, 802, 787, 788, 822, 825,
         791, 792, 804, 827, 794, 828, 829, 797, 799, 800, 810, 830, 833, 811,
         834, 815, 817, 818, 823, 832, 831, 824, 826, 835, 839, 837, 840, 836,
         838}));
    S->add_generator(Perm(
        {0,   3,   4,   6,   8,   9,   1,   11,  2,   14,  15,  17,  18,  19,
         5,   22,  23,  7,   26,  28,  29,  30,  10,  33,  34,  35,  12,  37,
         13,  40,  42,  43,  44,  16,  47,  49,  50,  52,  53,  54,  20,  56,
         21,  59,  60,  61,  62,  24,  64,  25,  51,  36,  27,  69,  71,  72,
         74,  75,  76,  31,  32,  79,  81,  82,  84,  85,  86,  87,  88,  38,
         90,  39,  73,  55,  41,  94,  96,  97,  98,  45,  100, 46,  83,  63,
         48,  105, 107, 109, 111, 112, 114, 115, 116, 117, 57,  119, 58,  122,
         124, 125, 127, 128, 129, 130, 131, 65,  133, 66,  135, 67,  137, 68,
         113, 89,  70,  142, 143, 145, 146, 148, 149, 150, 77,  152, 78,  126,
         99,  80,  157, 159, 161, 163, 164, 166, 167, 169, 170, 172, 173, 174,
         175, 176, 91,  92,  178, 93,  147, 118, 95,  183, 185, 186, 188, 189,
         190, 191, 192, 101, 194, 102, 196, 103, 198, 104, 165, 132, 106, 203,
         204, 108, 171, 136, 110, 209, 211, 213, 215, 216, 218, 219, 220, 221,
         222, 120, 223, 121, 187, 151, 123, 227, 229, 231, 232, 233, 235, 236,
         238, 239, 241, 242, 243, 244, 245, 134, 246, 247, 248, 249, 250, 138,
         252, 139, 254, 140, 256, 141, 217, 177, 144, 261, 263, 265, 267, 268,
         269, 270, 271, 153, 273, 154, 275, 155, 156, 234, 193, 158, 281, 282,
         160, 240, 197, 162, 287, 289, 291, 293, 168, 296, 298, 299, 300, 301,
         303, 304, 306, 307, 309, 310, 311, 312, 313, 179, 315, 180, 317, 181,
         319, 182, 184, 323, 324, 326, 327, 329, 330, 332, 333, 276, 334, 335,
         336, 195, 337, 338, 339, 340, 341, 199, 343, 200, 295, 201, 346, 202,
         348, 349, 205, 351, 206, 207, 208, 302, 251, 210, 357, 358, 212, 308,
         255, 214, 363, 365, 367, 369, 370, 372, 373, 375, 376, 378, 379, 380,
         381, 224, 225, 383, 226, 328, 272, 228, 388, 389, 230, 277, 393, 394,
         396, 237, 399, 401, 403, 404, 405, 354, 407, 408, 410, 411, 413, 290,
         344, 353, 352, 297, 288, 415, 416, 253, 417, 418, 419, 420, 421, 257,
         422, 258, 424, 259, 426, 260, 371, 314, 262, 431, 432, 264, 377, 318,
         266, 436, 438, 440, 441, 386, 443, 444, 325, 445, 274, 446, 447, 448,
         449, 278, 279, 452, 280, 453, 430, 283, 455, 284, 457, 285, 286, 406,
         342, 350, 409, 345, 292, 463, 464, 294, 466, 468, 470, 305, 472, 474,
         475, 477, 478, 479, 481, 482, 484, 485, 486, 487, 488, 316, 489, 490,
         491, 492, 320, 494, 321, 496, 322, 442, 382, 499, 500, 502, 331, 505,
         507, 508, 509, 510, 512, 513, 429, 514, 515, 517, 518, 519, 520, 521,
         522, 347, 525, 526, 528, 529, 355, 531, 356, 532, 359, 534, 360, 361,
         537, 362, 364, 541, 542, 366, 483, 425, 368, 547, 549, 454, 398, 374,
         551, 552, 553, 458, 554, 555, 557, 558, 559, 384, 385, 498, 387, 562,
         563, 390, 565, 391, 392, 567, 511, 451, 395, 397, 400, 570, 571, 402,
         493, 574, 576, 578, 579, 580, 523, 412, 527, 465, 414, 584, 585, 587,
         588, 589, 591, 592, 593, 595, 596, 597, 598, 423, 599, 600, 601, 602,
         603, 427, 605, 428, 607, 433, 434, 435, 437, 556, 495, 439, 614, 501,
         560, 616, 618, 620, 621, 623, 624, 450, 625, 626, 456, 627, 628, 609,
         459, 630, 460, 631, 461, 462, 524, 634, 635, 636, 467, 586, 530, 469,
         471, 590, 533, 473, 643, 594, 536, 476, 646, 648, 650, 480, 652, 654,
         655, 657, 658, 660, 661, 640, 662, 663, 664, 665, 666, 667, 497, 668,
         670, 671, 503, 673, 504, 622, 564, 506, 677, 679, 680, 516, 683, 684,
         686, 688, 689, 690, 692, 674, 687, 649, 694, 608, 550, 695, 696, 535,
         697, 698, 538, 700, 539, 702, 540, 703, 543, 705, 544, 545, 708, 546,
         659, 604, 548, 678, 639, 573, 713, 715, 716, 718, 719, 720, 561, 723,
         724, 726, 582, 710, 727, 566, 606, 568, 569, 730, 731, 572, 685, 629,
         575, 583, 577, 734, 736, 735, 581, 738, 740, 741, 743, 744, 746, 669,
         747, 748, 637, 728, 750, 752, 753, 676, 754, 709, 755, 693, 732, 610,
         712, 611, 612, 758, 613, 615, 699, 761, 721, 617, 725, 672, 619, 707,
         651, 764, 766, 768, 714, 769, 632, 771, 633, 773, 711, 775, 638, 641,
         777, 642, 644, 780, 645, 647, 749, 701, 751, 704, 653, 783, 656, 675,
         785, 778, 787, 742, 788, 722, 790, 733, 791, 792, 681, 794, 682, 763,
         797, 691, 772, 774, 737, 799, 800, 759, 786, 802, 804, 805, 760, 706,
         784, 807, 757, 717, 782, 810, 811, 729, 814, 815, 817, 818, 796, 798,
         770, 739, 801, 776, 803, 779, 745, 822, 823, 756, 808, 821, 824, 762,
         826, 812, 765, 816, 793, 767, 830, 825, 831, 832, 781, 827, 789, 834,
         813, 806, 835, 836, 795, 837, 809, 833, 819, 838, 840, 820, 828, 839,
         829}));

    REQUIRE(S->size() == 604800);
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "023",
                          "perm. Conway group Co3 (order 495766656000)",
                          "[quick][schreier-sims][no-valgrind]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 277;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,   245, 42,  112, 15,  131, 7,   188, 75,  132, 10,  11,  187, 186,
         265, 22,  159, 256, 43,  101, 123, 134, 4,   32,  209, 238, 35,  45,
         235, 126, 5,   19,  60,  66,  80,  154, 251, 117, 206, 71,  118, 93,
         87,  167, 271, 221, 261, 182, 155, 47,  230, 172, 236, 109, 191, 76,
         156, 73,  116, 147, 23,  127, 231, 38,  53,  122, 210, 24,  68,  86,
         255, 196, 139, 149, 21,  111, 203, 252, 72,  262, 114, 214, 9,   181,
         174, 85,  95,  2,   250, 257, 243, 90,  158, 170, 148, 69,  105, 249,
         263, 16,  54,  31,  115, 51,  104, 125, 219, 92,  46,  64,  204, 8,
         266, 225, 34,  175, 145, 161, 180, 237, 241, 224, 169, 269, 12,  96,
         129, 189, 190, 29,  17,  30,  82,  143, 74,  168, 13,  227, 217, 78,
         258, 220, 178, 228, 146, 58,  254, 273, 215, 57,  106, 77,  110, 50,
         26,  248, 260, 274, 107, 99,  253, 37,  25,  272, 44,  52,  119, 18,
         201, 65,  41,  233, 103, 246, 200, 102, 160, 198, 207, 157, 40,  223,
         49,  267, 79,  1,   136, 124, 6,   61,  268, 100, 70,  98,  171, 121,
         39,  62,  211, 208, 84,  135, 97,  55,  152, 141, 63,  142, 259, 67,
         33,  177, 173, 14,  242, 94,  113, 240, 264, 150, 205, 27,  183, 83,
         195, 216, 163, 247, 133, 36,  153, 197, 140, 194, 120, 270, 165, 166,
         162, 218, 138, 234, 81,  91,  89,  185, 212, 137, 48,  202, 276, 229,
         151, 176, 144, 192, 130, 244, 232, 199, 56,  108, 184, 193, 239, 213,
         3,   222, 128, 20,  28,  164, 226, 59,  179, 275, 88}));
    S->add_generator(Perm(
        {0,   204, 203, 33,  236, 5,   172, 77,  76,  47,  146, 133, 224, 229,
         53,  84,  16,  223, 228, 130, 131, 252, 190, 13,  263, 242, 10,  32,
         196, 199, 65,  246, 209, 40,  99,  241, 198, 269, 251, 75,  118, 176,
         271, 183, 116, 197, 238, 22,  29,  178, 26,  174, 129, 2,   153, 272,
         257, 41,  12,  59,  20,  27,  175, 106, 159, 218, 259, 137, 258, 261,
         164, 262, 189, 45,  177, 260, 85,  25,  15,  226, 96,  24,  1,   274,
         148, 264, 132, 48,  117, 36,  60,  171, 201, 101, 253, 95,  120, 142,
         213, 165, 51,  115, 44,  103, 167, 243, 66,  141, 108, 88,  97,  276,
         30,  139, 222, 166, 173, 231, 3,   73,  239, 56,  170, 82,  162, 163,
         207, 145, 128, 52,  104, 90,  216, 220, 155, 74,  237, 28,  4,   113,
         273, 230, 270, 248, 180, 206, 50,  250, 78,  127, 150, 54,  232, 217,
         121, 69,  156, 6,   125, 210, 86,  89,  46,  184, 211, 265, 93,  19,
         138, 23,  126, 43,  188, 102, 244, 219, 192, 256, 83,  58,  144, 181,
         187, 91,  158, 205, 235, 147, 157, 114, 9,   152, 57,  39,  64,  143,
         67,  119, 161, 87,  200, 111, 79,  14,  123, 21,  149, 122, 191, 61,
         194, 266, 225, 31,  81,  62,  160, 151, 112, 215, 254, 234, 72,  17,
         179, 105, 267, 227, 18,  169, 249, 109, 208, 275, 68,  233, 168, 55,
         124, 80,  240, 35,  7,   212, 100, 245, 98,  195, 247, 107, 182, 42,
         185, 94,  11,  255, 135, 154, 221, 63,  193, 134, 71,  214, 8,   34,
         70,  202, 268, 37,  110, 38,  136, 140, 49,  186, 92}));

    REQUIRE(S->size() == static_cast<uint64_t>(495766656000));
    REQUIRE(S->contains(S->generator(0)));
    REQUIRE(S->contains(S->generator(1)));

    REQUIRE(S->contains(Perm(
        {0,   123, 14,  40,  168, 5,   188, 25,  85,  22,  50,  220, 179, 169,
         2,   148, 16,  17,  18,  104, 90,  185, 9,   229, 214, 7,   146, 209,
         67,  87,  218, 98,  61,  118, 165, 35,  161, 37,  42,  260, 3,   192,
         38,  91,  173, 119, 124, 190, 199, 83,  10,  244, 52,  203, 217, 136,
         154, 176, 224, 59,  131, 32,  219, 66,  210, 112, 63,  28,  221, 134,
         211, 71,  114, 197, 256, 193, 264, 242, 84,  267, 120, 263, 204, 49,
         78,  8,   216, 29,  231, 198, 20,  43,  111, 115, 94,  95,  239, 270,
         31,  265, 174, 166, 116, 103, 19,  212, 259, 230, 108, 117, 142, 92,
         65,  113, 72,  93,  102, 109, 33,  45,  80,  257, 126, 1,   46,  184,
         122, 206, 128, 129, 167, 60,  160, 254, 69,  177, 55,  196, 236, 139,
         140, 249, 110, 247, 144, 149, 26,  182, 15,  145, 150, 153, 208, 151,
         56,  261, 156, 172, 163, 194, 132, 36,  238, 158, 266, 34,  101, 130,
         4,   13,  207, 183, 157, 44,  100, 215, 57,  135, 274, 12,  180, 181,
         147, 171, 125, 21,  233, 250, 6,   222, 47,  232, 41,  75,  159, 248,
         137, 73,  89,  48,  200, 276, 226, 53,  82,  252, 127, 170, 152, 27,
         64,  70,  105, 246, 24,  175, 86,  54,  30,  62,  11,  68,  189, 223,
         58,  243, 202, 227, 228, 23,  107, 88,  191, 186, 258, 275, 138, 272,
         162, 96,  240, 241, 77,  225, 51,  245, 213, 143, 195, 141, 187, 271,
         205, 253, 133, 255, 74,  121, 234, 106, 39,  155, 262, 81,  76,  99,
         164, 79,  268, 269, 97,  251, 237, 273, 178, 235, 201})));
    REQUIRE(S->contains(Perm(
        {0,   205, 48,  70,  190, 65,  157, 172, 276, 1,   146, 133, 162, 237,
         31,  236, 165, 104, 19,  246, 37,  177, 84,  20,  137, 46,  121, 234,
         110, 52,  90,  115, 13,  194, 222, 10,  169, 89,  106, 67,  144, 126,
         203, 228, 211, 32,  108, 178, 247, 187, 217, 103, 265, 159, 51,  14,
         193, 127, 206, 140, 209, 114, 119, 149, 88,  23,  40,  61,  258, 95,
         57,  75,  15,  41,  155, 76,  272, 54,  113, 158, 99,  7,   216, 17,
         200, 264, 261, 271, 92,  100, 171, 212, 141, 176, 62,  132, 163, 79,
         39,  210, 152, 130, 219, 188, 167, 120, 150, 125, 134, 2,   232, 260,
         33,  160, 96,  44,  12,  269, 118, 93,  68,  143, 218, 131, 147, 243,
         199, 27,  268, 207, 135, 5,   47,  18,  252, 111, 235, 195, 240, 189,
         208, 21,  122, 220, 11,  173, 180, 59,  253, 45,  215, 185, 123, 249,
         241, 29,  257, 58,  201, 16,  192, 231, 124, 267, 38,  168, 55,  183,
         74,  170, 101, 64,  174, 225, 148, 166, 94,  266, 270, 49,  3,   274,
         22,  72,  71,  245, 229, 224, 77,  145, 128, 153, 255, 214, 275, 179,
         262, 109, 256, 63,  244, 138, 107, 85,  97,  254, 251, 83,  87,  263,
         259, 161, 98,  34,  24,  78,  105, 4,   80,  66,  230, 197, 202, 181,
         56,  139, 136, 28,  248, 42,  26,  175, 221, 43,  35,  196, 129, 73,
         242, 8,   151, 239, 81,  60,  154, 204, 102, 227, 69,  142, 117, 198,
         25,  86,  50,  164, 223, 36,  273, 191, 156, 238, 226, 213, 112, 53,
         30,  91,  9,   82,  233, 116, 184, 250, 6,   186, 182})));
    REQUIRE(S->contains(Perm(
        {0,   205, 48,  70,  190, 65,  157, 172, 276, 1,   146, 133, 162, 237,
         31,  236, 165, 104, 19,  246, 37,  177, 84,  20,  137, 46,  121, 234,
         110, 52,  90,  115, 13,  194, 222, 10,  169, 89,  106, 67,  144, 126,
         203, 228, 211, 32,  108, 178, 247, 187, 217, 103, 265, 159, 51,  14,
         193, 127, 206, 140, 209, 114, 119, 149, 88,  23,  40,  61,  258, 95,
         57,  75,  15,  41,  155, 76,  272, 54,  113, 158, 99,  7,   216, 17,
         200, 264, 261, 271, 92,  100, 171, 212, 141, 176, 62,  132, 163, 79,
         39,  210, 152, 130, 219, 188, 167, 120, 150, 125, 134, 2,   232, 260,
         33,  160, 96,  44,  12,  269, 118, 93,  68,  143, 218, 131, 147, 243,
         199, 27,  268, 207, 135, 5,   47,  18,  252, 111, 235, 195, 240, 189,
         208, 21,  122, 220, 11,  173, 180, 59,  253, 45,  215, 185, 123, 249,
         241, 29,  257, 58,  201, 16,  192, 231, 124, 267, 38,  168, 55,  183,
         74,  170, 101, 64,  174, 225, 148, 166, 94,  266, 270, 49,  3,   274,
         22,  72,  71,  245, 229, 224, 77,  145, 128, 153, 255, 214, 275, 179,
         262, 109, 256, 63,  244, 138, 107, 85,  97,  254, 251, 83,  87,  263,
         259, 161, 98,  34,  24,  78,  105, 4,   80,  66,  230, 197, 202, 181,
         56,  139, 136, 28,  248, 42,  26,  175, 221, 43,  35,  196, 129, 73,
         242, 8,   151, 239, 81,  60,  154, 204, 102, 227, 69,  142, 117, 198,
         25,  86,  50,  164, 223, 36,  273, 191, 156, 238, 226, 213, 112, 53,
         30,  91,  9,   82,  233, 116, 184, 250, 6,   186, 182})));
    REQUIRE(!S->contains(Perm(
        {0,   185, 87,  266, 22,  30,  188, 6,   111, 82,  10,  13,  124, 136,
         213, 100, 99,  130, 167, 31,  269, 74,  15,  60,  67,  162, 154, 221,
         270, 129, 131, 101, 23,  210, 114, 26,  229, 161, 63,  196, 180, 170,
         3,   18,  164, 27,  108, 49,  248, 182, 153, 103, 165, 64,  230, 203,
         260, 149, 145, 273, 32,  189, 197, 206, 109, 169, 33,  209, 68,  95,
         192, 39,  78,  57,  134, 8,   55,  151, 139, 184, 34,  242, 132, 223,
         200, 85,  69,  42,  276, 244, 91,  243, 107, 41,  215, 86,  125, 202,
         193, 159, 191, 19,  175, 172, 104, 96,  150, 158, 261, 53,  152, 75,
         5,   216, 80,  102, 58,  37,  40,  166, 234, 195, 65,  20,  187, 105,
         29,  61,  268, 126, 256, 1,   9,   228, 2,   201, 186, 247, 240, 72,
         232, 205, 207, 133, 254, 116, 144, 59,  94,  73,  219, 252, 204, 11,
         35,  48,  56,  179, 92,  16,  176, 117, 238, 226, 271, 236, 237, 43,
         135, 122, 93,  194, 51,  212, 84,  115, 253, 211, 142, 274, 118, 83,
         47,  222, 262, 245, 17,  12,  7,   127, 128, 54,  255, 263, 233, 224,
         71,  231, 177, 259, 174, 168, 249, 76,  110, 220, 38,  178, 199, 24,
         66,  198, 246, 265, 81,  148, 225, 138, 239, 106, 141, 45,  267, 181,
         121, 113, 272, 137, 143, 251, 50,  62,  258, 171, 241, 28,  52,  119,
         25,  264, 217, 120, 214, 90,  257, 21,  173, 227, 155, 97,  88,  4,
         77,  160, 146, 70,  36,  89,  140, 208, 156, 46,  79,  98,  218, 14,
         112, 183, 190, 123, 235, 44,  163, 147, 157, 275, 250})));
    REQUIRE(!S->contains(Perm(
        {0,   123, 14,  40,  168, 2,   188, 25,  85,  22,  50,  220, 179, 169,
         1,   148, 16,  36,  18,  104, 90,  185, 9,   229, 214, 7,   146, 209,
         67,  87,  218, 98,  61,  118, 165, 35,  161, 37,  42,  260, 21,  192,
         38,  91,  173, 119, 124, 190, 199, 83,  10,  244, 52,  203, 217, 136,
         154, 176, 224, 59,  131, 32,  219, 66,  210, 112, 63,  28,  221, 134,
         211, 71,  114, 197, 256, 193, 264, 242, 84,  267, 120, 263, 204, 49,
         78,  8,   216, 29,  231, 198, 20,  43,  111, 115, 94,  95,  239, 270,
         31,  265, 174, 166, 116, 103, 19,  212, 259, 11,  108, 117, 142, 92,
         65,  113, 72,  93,  102, 109, 33,  45,  80,  257, 126, 3,   46,  184,
         122, 206, 128, 129, 167, 60,  160, 254, 69,  177, 55,  196, 236, 139,
         140, 249, 110, 247, 144, 149, 26,  182, 15,  145, 150, 153, 208, 151,
         56,  261, 156, 172, 163, 194, 132, 4,   238, 158, 266, 34,  101, 130,
         100, 17,  207, 183, 157, 44,  230, 215, 57,  135, 274, 12,  180, 181,
         147, 171, 125, 5,   233, 250, 6,   222, 47,  232, 41,  75,  159, 248,
         137, 73,  89,  48,  200, 276, 226, 53,  82,  252, 127, 170, 152, 27,
         64,  70,  105, 246, 24,  175, 86,  54,  30,  62,  13,  68,  189, 223,
         58,  243, 202, 227, 228, 23,  107, 88,  191, 186, 258, 275, 138, 272,
         162, 96,  240, 241, 77,  225, 51,  245, 213, 143, 195, 141, 187, 271,
         205, 253, 133, 255, 74,  121, 234, 106, 39,  155, 262, 81,  76,  99,
         164, 79,  268, 269, 97,  251, 237, 273, 178, 235, 201})));
    REQUIRE(!S->contains(Perm(
        {0,   185, 87,  266, 22,  30,  188, 6,   111, 82,  10,  100, 124, 136,
         213, 17,  99,  130, 167, 31,  269, 74,  15,  60,  67,  162, 154, 221,
         270, 129, 131, 101, 23,  210, 114, 26,  229, 161, 63,  196, 180, 170,
         1,   18,  164, 27,  108, 49,  248, 182, 153, 103, 165, 64,  36,  203,
         260, 149, 145, 273, 32,  189, 197, 206, 109, 169, 33,  209, 68,  95,
         192, 39,  78,  57,  134, 8,   55,  151, 139, 184, 34,  242, 132, 223,
         200, 85,  69,  42,  276, 244, 91,  243, 107, 41,  215, 86,  125, 202,
         193, 159, 191, 19,  175, 172, 104, 96,  150, 158, 261, 53,  152, 75,
         21,  216, 80,  102, 58,  37,  40,  166, 234, 195, 65,  20,  187, 105,
         29,  61,  268, 126, 256, 2,   9,   228, 5,   201, 186, 247, 240, 72,
         232, 205, 207, 133, 254, 116, 144, 59,  94,  73,  219, 252, 204, 4,
         35,  48,  56,  179, 92,  16,  176, 117, 238, 226, 271, 236, 237, 43,
         135, 122, 93,  194, 51,  212, 84,  115, 253, 211, 142, 274, 118, 83,
         47,  222, 262, 245, 230, 12,  7,   127, 128, 54,  255, 263, 233, 224,
         71,  231, 177, 259, 174, 168, 249, 76,  110, 220, 38,  178, 199, 24,
         66,  198, 246, 265, 81,  148, 225, 138, 239, 106, 141, 45,  267, 181,
         121, 113, 272, 137, 143, 251, 50,  62,  258, 171, 241, 28,  52,  119,
         25,  264, 217, 120, 214, 90,  257, 3,   173, 227, 155, 97,  88,  13,
         77,  160, 146, 70,  11,  89,  140, 208, 156, 46,  79,  98,  218, 14,
         112, 183, 190, 123, 235, 44,  163, 147, 157, 275, 250})));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "024",
                          "perm. Conway group Co3 (alt.) (order 495766656000) ",
                          "[quick][schreier-sims][no-valgrind]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 553;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,   3,   4,   5,   6,   1,   2,   10,  12,  14,  16,  18,  20,  21,
         23,  25,  7,   27,  29,  31,  8,   34,  36,  9,   39,  41,  43,  45,
         47,  11,  50,  52,  54,  56,  13,  59,  61,  63,  64,  66,  67,  15,
         70,  71,  73,  17,  76,  78,  80,  81,  83,  84,  19,  87,  88,  90,
         92,  94,  95,  97,  99,  22,  102, 104, 105, 93,  24,  107, 109, 110,
         112, 26,  115, 117, 119, 120, 122, 124, 28,  127, 129, 130, 118, 30,
         132, 134, 135, 137, 32,  139, 141, 143, 33,  145, 147, 149, 150, 35,
         152, 154, 156, 155, 157, 159, 37,  38,  162, 40,  165, 167, 169, 121,
         42,  173, 174, 176, 178, 44,  180, 182, 184, 185, 46,  186, 151, 189,
         188, 190, 192, 48,  49,  195, 51,  198, 200, 202, 96,  53,  206, 208,
         209, 55,  212, 214, 215, 65,  218, 57,  219, 58,  136, 77,  223, 225,
         60,  227, 229, 62,  232, 234, 235, 236, 238, 240, 241, 243, 245, 68,
         220, 69,  249, 250, 252, 254, 256, 257, 72,  260, 262, 263, 82,  266,
         74,  267, 75,  111, 270, 272, 274, 276, 79,  279, 281, 282, 283, 285,
         287, 288, 290, 292, 85,  268, 86,  296, 297, 222, 300, 302, 89,  304,
         172, 306, 286, 308, 91,  231, 312, 314, 316, 317, 318, 320, 258, 98,
         322, 324, 325, 101, 328, 100, 330, 144, 331, 333, 103, 336, 338, 340,
         106, 177, 342, 344, 346, 108, 348, 350, 352, 353, 265, 310, 355, 207,
         210, 357, 113, 359, 114, 361, 205, 363, 239, 364, 116, 278, 368, 301,
         371, 372, 373, 375, 123, 376, 378, 379, 126, 382, 125, 384, 179, 385,
         387, 128, 390, 392, 394, 131, 142, 396, 307, 399, 133, 401, 403, 405,
         406, 217, 366, 408, 255, 409, 138, 248, 251, 412, 140, 414, 415, 197,
         418, 420, 170, 397, 423, 424, 295, 425, 146, 148, 168, 246, 391, 381,
         380, 429, 153, 430, 271, 432, 434, 435, 436, 158, 438, 400, 440, 442,
         160, 269, 161, 305, 444, 445, 163, 446, 164, 448, 450, 280, 451, 386,
         166, 388, 319, 455, 457, 171, 327, 458, 460, 298, 462, 175, 464, 465,
         466, 468, 203, 343, 471, 472, 473, 181, 183, 201, 293, 337, 326, 477,
         187, 478, 224, 480, 482, 483, 417, 191, 485, 347, 487, 489, 193, 221,
         194, 362, 491, 492, 196, 493, 494, 496, 233, 497, 332, 199, 334, 374,
         501, 503, 204, 504, 506, 411, 507, 329, 339, 211, 428, 277, 213, 511,
         512, 419, 513, 216, 515, 437, 516, 427, 517, 488, 226, 519, 356, 345,
         228, 413, 230, 315, 402, 490, 404, 377, 521, 522, 237, 453, 367, 476,
         433, 449, 242, 244, 525, 341, 474, 247, 422, 518, 253, 459, 528, 461,
         529, 383, 393, 259, 261, 531, 524, 467, 532, 264, 534, 484, 535, 475,
         508, 441, 273, 537, 321, 398, 275, 463, 370, 349, 443, 351, 323, 538,
         539, 284, 499, 311, 481, 495, 289, 291, 523, 395, 426, 294, 470, 536,
         299, 505, 542, 303, 447, 543, 510, 421, 309, 456, 452, 313, 500, 416,
         354, 545, 520, 335, 486, 533, 365, 514, 530, 547, 358, 360, 546, 469,
         502, 498, 369, 454, 407, 549, 389, 439, 509, 550, 410, 540, 544, 431,
         526, 551, 548, 479, 552, 527, 541}));

    S->add_generator(Perm(
        {0,   2,   1,   4,   3,   7,   8,   9,   11,  13,  15,  17,  19,  5,
         22,  24,  26,  6,   28,  30,  32,  33,  35,  37,  38,  40,  42,  44,
         46,  48,  49,  51,  53,  55,  57,  58,  60,  62,  10,  65,  25,  68,
         69,  54,  72,  74,  75,  77,  79,  12,  82,  31,  85,  86,  43,  89,
         91,  93,  14,  96,  98,  100, 101, 103, 81,  39,  106, 34,  108, 16,
         111, 113, 114, 116, 118, 18,  121, 123, 125, 126, 128, 64,  50,  131,
         45,  133, 20,  136, 138, 21,  140, 142, 144, 67,  146, 148, 59,  122,
         151, 153, 155, 23,  127, 158, 160, 152, 161, 163, 164, 166, 168, 170,
         171, 172, 27,  175, 177, 179, 84,  181, 183, 76,  97,  154, 187, 188,
         29,  102, 191, 193, 186, 194, 196, 197, 199, 201, 203, 204, 205, 207,
         95,  210, 211, 213, 92,  216, 217, 182, 90,  220, 221, 36,  222, 224,
         47,  226, 228, 230, 231, 233, 112, 232, 237, 239, 41,  242, 244, 246,
         110, 247, 248, 104, 251, 253, 255, 120, 258, 259, 261, 117, 264, 265,
         147, 115, 268, 269, 252, 271, 273, 275, 277, 278, 280, 137, 279, 284,
         286, 52,  289, 291, 293, 135, 294, 295, 129, 298, 299, 301, 256, 303,
         305, 56,  200, 307, 309, 310, 311, 313, 315, 134, 312, 319, 321, 270,
         302, 323, 61,  326, 327, 329, 157, 63,  66,  332, 334, 335, 337, 339,
         285, 341, 320, 343, 345, 347, 267, 349, 351, 290, 70,  354, 317, 71,
         356, 297, 358, 314, 208, 360, 362, 73,  167, 344, 365, 366, 367, 369,
         370, 109, 368, 374, 223, 359, 377, 78,  380, 381, 383, 190, 80,  83,
         386, 388, 389, 391, 393, 238, 395, 375, 397, 398, 400, 219, 402, 404,
         243, 87,  407, 372, 88,  250, 410, 357, 99,  411, 413, 384, 363, 416,
         417, 419, 421, 422, 420, 94,  409, 414, 426, 206, 218, 427, 387, 105,
         227, 428, 225, 241, 424, 431, 433, 371, 176, 418, 437, 429, 439, 441,
         346, 423, 396, 443, 325, 107, 430, 340, 447, 445, 449, 202, 350, 452,
         453, 260, 454, 234, 456, 401, 130, 139, 459, 124, 461, 463, 330, 306,
         436, 467, 469, 470, 468, 119, 464, 474, 173, 266, 475, 333, 274, 476,
         272, 288, 472, 479, 481, 316, 141, 466, 484, 477, 486, 488, 399, 471,
         342, 490, 379, 132, 478, 394, 492, 495, 169, 403, 498, 499, 212, 500,
         281, 502, 348, 174, 505, 487, 262, 508, 318, 509, 143, 510, 493, 462,
         149, 480, 145, 514, 322, 511, 276, 150, 324, 287, 518, 156, 263, 328,
         300, 483, 520, 159, 390, 353, 257, 519, 304, 162, 457, 165, 523, 178,
         364, 485, 524, 521, 507, 408, 352, 501, 526, 473, 516, 482, 527, 440,
         214, 517, 373, 530, 446, 412, 184, 432, 180, 533, 376, 531, 229, 185,
         378, 240, 536, 189, 215, 382, 254, 435, 192, 336, 406, 209, 537, 361,
         195, 503, 198, 525, 308, 438, 512, 538, 529, 355, 405, 455, 540, 425,
         535, 434, 541, 245, 442, 496, 494, 491, 415, 532, 236, 534, 544, 489,
         392, 235, 448, 451, 546, 385, 465, 331, 249, 460, 458, 292, 450, 444,
         513, 283, 515, 548, 338, 282, 497, 543, 296, 506, 504, 550, 528, 549,
         547, 551, 542, 545, 552, 522, 539}));

    REQUIRE(S->size() == static_cast<uint64_t>(495766656000));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "025",
                          "perm. Suzuki group (order 448345497600)",
                          "[no-valgrind][quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 1783;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,    926,  1366, 1336, 1696, 1688, 610,  1412, 1390, 374,  1774, 1572,
         1588, 1690, 1127, 616,  197,  240,  761,  935,  301,  1776, 1078, 23,
         588,  1388, 799,  69,   1318, 839,  438,  517,  1510, 33,   1241, 611,
         843,  791,  1526, 162,  1053, 474,  706,  1012, 1076, 739,  556,  937,
         296,  1755, 208,  151,  225,  883,  952,  1405, 149,  396,  1781, 949,
         181,  1008, 1529, 63,   743,  243,  500,  288,  1027, 27,   1579, 723,
         1622, 1172, 1710, 1179, 1328, 1377, 638,  217,  356,  986,  1183, 519,
         1203, 377,  241,  294,  1484, 1198, 717,  630,  311,  481,  1252, 95,
         213,  118,  280,  823,  247,  786,  726,  721,  1750, 1369, 367,  325,
         334,  238,  573,  427,  1525, 830,  1278, 600,  912,  1536, 97,   119,
         828,  1226, 1555, 1550, 410,  1761, 148,  522,  928,  1338, 888,  161,
         797,  1075, 1176, 1769, 840,  1272, 869,  1574, 462,  732,  865,  495,
         1586, 223,  1590, 375,  126,  56,   1745, 51,   546,  488,  154,  1108,
         1652, 443,  1051, 1122, 1732, 131,  39,   1212, 609,  192,  333,  1110,
         446,  340,  922,  613,  1514, 1573, 399,  1775, 1042, 363,  646,  1339,
         1770, 60,   1262, 467,  793,  496,  528,  430,  858,  661,  405,  838,
         165,  980,  552,  606,  947,  16,   568,  401,  1468, 1143, 1589, 1503,
         1044, 720,  1599, 1235, 50,   985,  1493, 1378, 957,  96,   1628, 1089,
         1749, 79,   738,  835,  1634, 368,  1006, 145,  1606, 52,   1054, 1242,
         964,  774,  1251, 1661, 579,  1354, 341,  1100, 837,  1610, 109,  862,
         17,   86,   392,  65,   788,  746,  1545, 100,  1679, 735,  1167, 1723,
         523,  1639, 1694, 1605, 718,  433,  1553, 815,  1568, 939,  1289, 1223,
         1061, 946,  1672, 1535, 1299, 729,  740,  1752, 1020, 1418, 1132, 1773,
         887,  329,  429,  702,  98,   1511, 1446, 619,  898,  518,  801,  369,
         67,   992,  466,  1146, 960,  318,  87,   1569, 48,   472,  304,  493,
         780,  20,   1116, 593,  298,  1625, 944,  307,  545,  1505, 457,  92,
         1022, 1546, 768,  1415, 1693, 543,  293,  625,  492,  1428, 1296, 1292,
         680,  107,  1576, 1542, 436,  277,  1455, 744,  1285, 166,  108,  800,
         1213, 458,  1441, 1169, 169,  234,  1356, 449,  1206, 1135, 1374, 1248,
         417,  695,  594,  1219, 395,  1683, 1626, 1598, 80,   491,  851,  787,
         431,  582,  1671, 177,  1221, 758,  917,  106,  221,  287,  1105, 1236,
         1325, 539,  9,    147,  1200, 85,   1417, 875,  426,  1346, 587,  1192,
         813,  802,  1410, 1365, 550,  1364, 475,  423,  242,  1692, 479,  352,
         57,   525,  1580, 174,  1281, 199,  1102, 1471, 1189, 190,  1751, 1190,
         658,  1259, 124,  411,  1298, 1389, 1582, 896,  1700, 348,  1277, 520,
         731,  982,  1623, 391,  1578, 1072, 380,  111,  1085, 278,  187,  360,
         1077, 257,  1400, 967,  328,  1015, 30,   1125, 979,  1350, 455,  157,
         1187, 1184, 168,  694,  654,  343,  1335, 831,  1643, 1063, 1368, 442,
         688,  310,  337,  1007, 1396, 586,  140,  1243, 1091, 1495, 290,  183,
         1230, 469,  750,  784,  297,  808,  41,   390,  592,  1344, 524,  394,
         480,  93,   1757, 1343, 1725, 961,  1633, 508,  153,  1040, 864,  357,
         320,  299,  1011, 143,  185,  549,  1759, 1552, 66,   557,  1577, 1268,
         1004, 642,  1109, 1095, 487,  620,  510,  1161, 736,  715,  704,  834,
         971,  31,   285,  83,   419,  1596, 127,  252,  478,  397,  1250, 853,
         186,  1113, 551,  760,  1332, 1779, 910,  535,  1523, 1469, 712,  373,
         585,  945,  1607, 317,  709,  308,  152,  663,  1275, 497,  388,  530,
         194,  558,  1066, 969,  46,   501,  553,  1119, 993,  1740, 1150, 1258,
         873,  1686, 759,  657,  198,  956,  936,  1720, 766,  110,  1482, 1649,
         1019, 859,  1363, 232,  1018, 621,  361,  659,  1559, 540,  461,  382,
         24,   902,  1571, 1462, 476,  303,  350,  1651, 675,  1403, 725,  1048,
         115,  1129, 927,  1068, 1302, 1156, 195,  1512, 1608, 164,  6,    35,
         1098, 171,  1300, 1079, 15,   966,  1486, 283,  509,  581,  754,  1090,
         1566, 319,  1130, 1456, 1039, 1762, 91,   1084, 1411, 1009, 730,  1327,
         1501, 814,  78,   1765, 640,  1508, 505,  643,  924,  1287, 178,  1297,
         1440, 1164, 1506, 1246, 1001, 1768, 448,  655,  842,  567,  408,  583,
         1204, 189,  1031, 547,  1430, 1467, 1715, 890,  1731, 1474, 1756, 1271,
         1630, 1408, 881,  596,  1530, 1322, 1584, 930,  324,  681,  1101, 1466,
         792,  1291, 1205, 1117, 456,  1123, 915,  948,  1443, 1669, 447,  349,
         974,  1283, 900,  1734, 1112, 1705, 279,  876,  514,  1237, 42,   1653,
         1670, 544,  1153, 1025, 538,  1301, 1321, 513,  1663, 90,   256,  763,
         205,  103,  1724, 71,   891,  598,  102,  905,  773,  269,  634,  420,
         141,  1228, 1666, 249,  512,  999,  218,  45,   270,  1464, 1667, 64,
         331,  809,  245,  1128, 1660, 1706, 470,  1431, 1217, 1279, 622,  1662,
         1477, 1516, 365,  566,  531,  18,   1207, 719,  1028, 806,  572,  1406,
         314,  1637, 1222, 1245, 1094, 728,  229,  775,  866,  1029, 1185, 1249,
         300,  1502, 1280, 1708, 471,  962,  101,  359,  244,  973,  1311, 37,
         684,  184,  794,  846,  1052, 132,  820,  26,   335,  286,  385,  824,
         989,  1445, 765,  1640, 473,  745,  1358, 1707, 1587, 384,  637,  259,
         1449, 1736, 1157, 1675, 798,  1379, 844,  99,   803,  1433, 1611, 1380,
         120,  832,  113,  451,  829,  1037, 515,  219,  1170, 236,  191,  29,
         136,  919,  656,  36,   822,  940,  795,  1106, 1058, 913,  863,  358,
         1617, 527,  1778, 1498, 1677, 1729, 188,  577,  1737, 959,  239,  850,
         490,  142,  776,  1017, 904,  138,  925,  1453, 1155, 564,  972,  379,
         703,  995,  970,  1470, 1404, 674,  1032, 53,   1713, 1728, 1307, 276,
         130,  1427, 667,  724,  1261, 893,  1333, 1544, 415,  1414, 284,  1452,
         698,  997,  589,  1370, 868,  727,  1632, 1465, 1444, 1081, 534,  1227,
         116,  849,  1121, 690,  1551, 366,  1103, 841,  1320, 1730, 170,  1210,
         644,  870,  1,    602,  128,  1485, 679,  1648, 1162, 1655, 934,  19,
         570,  47,   1305, 261,  845,  1093, 1744, 1293, 306,  541,  265,  196,
         691,  59,   1303, 1392, 54,   1522, 1138, 1416, 569,  212,  1402, 861,
         292,  485,  785,  1188, 228,  1458, 617,  435,  1527, 555,  878,  516,
         874,  789,  696,  1255, 1564, 1483, 1533, 440,  193,  1581, 421,  1460,
         1082, 209,  81,   1664, 1211, 804,  1432, 1005, 289,  560,  1673, 877,
         1615, 901,  1254, 737,  1375, 652,  1064, 1196, 504,  991,  222,  459,
         61,   633,  1438, 494,  43,   1434, 1014, 437,  1602, 867,  580,  576,
         272,  1743, 312,  1257, 1086, 711,  1202, 68,   764,  777,  1083, 662,
         882,  1238, 1034, 1681, 1036, 833,  1647, 628,  489,  1140, 176,  1420,
         204,  1201, 1609, 1385, 599,  1763, 1348, 158,  796,  40,   226,  1540,
         1515, 1627, 848,  1229, 1631, 264,  1087, 453,  1002, 1317, 554,  1638,
         603,  1371, 1273, 1656, 425,  1703, 1247, 133,  44,   432,  22,   615,
         1563, 909,  984,  1030, 631,  428,  1024, 1062, 1126, 215,  623,  464,
         1507, 941,  772,  507,  1439, 1480, 612,  1738, 235,  682,  402,  918,
         1104, 370,  847,  1680, 155,  506,  167,  1111, 700,  529,  1313, 1240,
         302,  687,  1233, 559,  1163, 914,  159,  689,  1148, 439,  1088, 14,
         747,  601,  626,  1195, 274,  1342, 1435, 345,  1547, 1312, 954,  1721,
         1041, 1697, 1193, 201,  1620, 1319, 291,  1554, 1124, 1423, 562,  1450,
         1152, 710,  1355, 872,  605,  818,  1209, 1614, 1476, 511,  932,  1120,
         649,  1314, 1597, 250,  1391, 339,  836,  1687, 73,   1334, 1174, 1359,
         134,  1711, 1436, 75,   1181, 1180, 1182, 82,   445,  778,  1186, 444,
         963,  404,  407,  1357, 383,  1142, 1315, 1131, 1003, 1384, 89,   1777,
         376,  1045, 1026, 84,   660,  686,  344,  762,  1329, 1158, 923,  988,
         163,  336,  1214, 1603, 1270, 752,  1674, 351,  1726, 364,  770,  263,
         1459, 1437, 121,  911,  733,  1059, 468,  1764, 1678, 1118, 1539, 207,
         371,  705,  1033, 1447, 1115, 34,   227,  463,  1442, 771,  651,  1074,
         347,  779,  526,  230,  94,   1717, 998,  975,  1518, 1023, 563,  409,
         1282, 892,  182,  1422, 1294, 1487, 1601, 1665, 503,  1585, 1216, 671,
         137,  1070, 1636, 548,  1767, 418,  114,  753,  782,  400,  1260, 697,
         1489, 332,  1409, 645,  1504, 262,  1290, 685,  323,  943,  1264, 1488,
         322,  647,  412,  268,  614,  713,  604,  950,  1337, 938,  1772, 886,
         1593, 1641, 1654, 790,  1137, 1114, 1165, 1194, 1766, 1065, 28,   1145,
         920,  714,  677,  1753, 1616, 372,  1531, 635,  76,   1208, 1397, 1448,
         532,  894,  1173, 450,  3,    1304, 129,  179,  1519, 1642, 1133, 483,
         477,  1746, 381,  1701, 1050, 1407, 441,  1457, 1500, 1401, 233,  1154,
         342,  1191, 810,  1175, 1646, 1650, 1689, 578,  389,  387,  2,    1538,
         454,  105,  903,  1069, 1695, 1386, 346,  1000, 1398, 77,   211,  821,
         827,  1760, 1413, 1383, 1197, 1047, 1373, 1712, 25,   413,  8,    1168,
         951,  1478, 1583, 1635, 460,  1330, 1376, 1520, 434,  1353, 958,  597,
         880,  55,   767,  1349, 673,  1286, 386,  632,  7,    1382, 897,  315,
         955,  378,  273,  1419, 1043, 1421, 1263, 1149, 1698, 1619, 1685, 889,
         321,  1497, 664,  751,  990,  825,  1013, 1134, 1178, 1225, 1010, 1096,
         648,  338,  1244, 692,  908,  805,  282,  1239, 1331, 816,  1151, 1532,
         899,  871,  1558, 330,  627,  1351, 965,  1224, 983,  1490, 591,  1644,
         741,  907,  683,  665,  200,  537,  879,  403,  1754, 1716, 669,  1612,
         1160, 756,  1393, 1733, 1097, 1537, 574,  977,  88,   929,  618,  1265,
         1295, 1284, 1461, 1714, 1704, 210,  1494, 465,  1541, 1429, 855,  1565,
         1352, 636,  781,  203,  1288, 309,  650,  1092, 641,  1682, 32,   281,
         607,  1524, 172,  1056, 757,  1517, 1256, 1340, 1399, 1556, 953,  536,
         1513, 112,  38,   968,  1621, 62,   676,  1326, 1451, 978,  1534, 267,
         117,  1481, 1367, 1234, 1055, 1496, 327,  1629, 895,  246,  313,  1136,
         1684, 1549, 123,  916,  499,  258,  1147, 122,  1521, 1575, 1454, 584,
         1780, 1657, 1562, 1080, 976,  1499, 624,  1591, 260,  295,  1748, 590,
         11,   173,  139,  1557, 326,  502,  424,  70,   398,  981,  414,  1394,
         678,  1269, 144,  812,  12,   202,  146,  1567, 1604, 1308, 1659, 1618,
         521,  1166, 355,  206,  1719, 1266, 1016, 1215, 1592, 255,  224,  542,
         608,  1046, 237,  826,  1475, 1702, 1159, 996,  1324, 852,  1595, 1425,
         1144, 1528, 72,   422,  1624, 305,  354,  1057, 214,  1543, 672,  1060,
         906,  486,  220,  1395, 1274, 769,  1067, 253,  807,  1309, 1341, 452,
         1463, 1722, 1360, 1038, 931,  575,  1361, 595,  156,  707,  1310, 933,
         1071, 1561, 1735, 1594, 748,  231,  755,  716,  987,  1267, 734,  742,
         1668, 693,  708,  362,  266,  994,  1218, 819,  1782, 856,  1232, 248,
         1107, 1035, 1509, 353,  1548, 1426, 565,  1171, 5,    1362, 13,   1747,
         393,  316,  254,  1372, 4,    1141, 1424, 1742, 416,  1347, 1613, 1073,
         1492, 701,  749,  811,  783,  1758, 74,   1177, 1387, 884,  1491, 666,
         1473, 1253, 1739, 1600, 571,  1139, 1645, 251,  722,  484,  1220, 1771,
         885,  857,  921,  668,  160,  1479, 699,  1658, 817,  860,  1099, 1718,
         561,  1741, 1699, 1021, 942,  150,  1345, 1691, 1570, 216,  104,  406,
         271,  1323, 1472, 49,   670,  482,  1709, 498,  1381, 125,  629,  1049,
         1231, 639,  1316, 1276, 653,  135,  180,  1727, 1306, 275,  10,   175,
         21,   1199, 854,  533,  1560, 58,   1676}));
    S->add_generator(Perm(
        {0,    28,   33,   42,   49,   51,   17,   59,   14,   70,   73,   81,
         84,   87,   22,   99,   101,  26,   15,   117,  120,  124,  8,    133,
         135,  140,  6,    145,  40,   156,  160,  72,   163,  47,   134,  179,
         3,    186,  188,  192,  1,    57,   36,   4,    210,  213,  137,  2,
         222,  43,   231,  68,   240,  247,  250,  89,   75,   255,  261,  79,
         37,   276,  279,  287,  290,  299,  302,  305,  5,    311,  94,   324,
         97,   98,   333,  331,  340,  342,  347,  7,    62,   108,  359,  361,
         112,  372,  375,  104,  23,   329,  391,  399,  402,  407,  9,    416,
         38,   31,   10,   18,   427,  131,  438,  445,  13,   448,  451,  453,
         11,   462,  465,  468,  12,   304,  481,  486,  377,  150,  498,  500,
         154,  511,  518,  521,  159,  529,  532,  535,  543,  545,  548,  16,
         556,  88,   220,  171,  288,  274,  573,  576,  177,  588,  591,  289,
         597,  184,  609,  616,  415,  623,  19,   632,  608,  638,  20,   647,
         199,  658,  491,  21,   204,  674,  676,  208,  136,  690,  400,  700,
         702,  707,  710,  24,   351,  118,  722,  725,  729,  25,   228,  229,
         430,  745,  748,  752,  27,   759,  60,   182,  96,   774,  596,  779,
         245,  787,  792,  795,  803,  806,  810,  29,   817,  621,  823,  828,
         30,   837,  840,  843,  32,   848,  268,  859,  862,  272,  872,  587,
         882,  141,  449,  612,  34,   785,  285,  896,  422,  708,  280,  904,
         885,  35,   627,  297,  921,  926,  503,  933,  936,  940,  943,  864,
         281,  82,   218,  905,  959,  39,   963,  318,  881,  975,  322,  986,
         506,  991,  238,  41,   1001, 559,  1010, 1012, 525,  338,  293,  1029,
         61,   1036, 1038, 193,  44,   622,  1052, 1054, 45,   1062, 46,   1065,
         264,  76,   169,  80,   1073, 52,   1042, 875,  1030, 48,   1083, 355,
         164,  738,  371,  1093, 1096, 1099, 1105, 1108, 1053, 50,   1117, 382,
         1125, 605,  386,  1135, 603,  389,  1143, 1146, 1147, 1090, 1153, 397,
         1157, 717,  571,  1164, 1166, 1171, 53,   1180, 561,  1022, 54,   1190,
         414,  1110, 426,  452,  306,  55,   1204, 56,   1210, 425,  1218, 198,
         1221, 1224, 58,   1228, 277,  1234, 436,  1245, 1247, 719,  1154, 443,
         421,  515,  851,  883,  1268, 1271, 797,  63,   505,  215,  1276, 241,
         1004, 460,  1281, 457,  1282, 670,  203,  352,  455,  138,  1290, 64,
         473,  1301, 309,  477,  814,  619,  1313, 485,  1025, 244,  65,   358,
         1329, 1333, 66,   798,  1338, 67,   441,  496,  1116, 671,  861,  107,
         469,  69,   1352, 437,  857,  1273, 509,  1047, 1371, 1372, 1373, 516,
         1382, 1387, 1144, 162,  246,  1393, 71,   528,  527,  1384, 1398, 1085,
         1324, 995,  1086, 628,  639,  74,   1396, 541,  723,  982,  912,  1109,
         1424, 1430, 1416, 1399, 77,   91,   554,  1440, 1168, 1443, 1286, 78,
         691,  563,  1452, 1215, 566,  242,  1310, 570,  1207, 395,  119,  1464,
         1104, 804,  553,  624,  83,   546,  583,  1468, 1296, 586,  1201, 1155,
         574,  1474, 1077, 1476, 1478, 85,   1482, 1233, 1327, 86,   558,  1492,
         1148, 607,  1497, 917,  1500, 1202, 614,  1507, 530,  1512, 1514, 816,
         1515, 1187, 625,  821,  90,   1375, 173,  1519, 454,  533,  1521, 1123,
         360,  1460, 878,  1531, 1534, 92,   1538, 645,  618,  1150, 974,  1388,
         93,   1549, 654,  296,  1552, 656,  937,  1558, 600,  1149, 216,  95,
         148,  665,  773,  1562, 669,  1496, 1568, 672,  1537, 1265, 1266, 1576,
         730,  100,  934,  594,  1581, 684,  1311, 1072, 688,  562,  1590, 1469,
         1592, 1445, 102,  630,  698,  1596, 1481, 781,  947,  1380, 1601, 103,
         459,  1222, 105,  522,  1606, 405,  106,  1356, 1610, 369,  111,  1615,
         720,  895,  409,  819,  784,  221,  889,  109,  1256, 332,  110,  357,
         217,  219,  768,  736,  1427, 1314, 128,  1098, 951,  743,  1626, 756,
         1138, 251,  1631, 113,  344,  1328, 1627, 114,  786,  758,  1504, 1308,
         589,  1013, 115,  1640, 765,  898,  993,  116,  860,  999,  1255, 772,
         564,  1633, 1417, 1103, 1334, 617,  1078, 227,  783,  1340, 1361, 1651,
         1199, 712,  790,  1572, 1659, 1212, 1337, 1541, 1170, 121,  801,  802,
         1665, 1463, 1467, 1198, 1302, 1261, 122,  1670, 123,  1046, 815,  939,
         1049, 668,  1158, 1415, 1240, 125,  575,  1189, 1677, 126,  836,  1517,
         127,  315,  834,  1434, 411,  1341, 362,  1516, 517,  606,  599,  1381,
         129,  1264, 1689, 1169, 130,  1690, 855,  1470, 298,  901,  1075, 990,
         641,  994,  132,  1317, 825,  343,  870,  1694, 793,  1484, 1693, 278,
         1088, 766,  880,  1242, 1699, 1700, 185,  1546, 847,  1354, 408,  1439,
         139,  307,  893,  1397, 263,  888,  886,  1248, 1448, 900,  1040, 664,
         1557, 497,  1041, 580,  142,  1707, 143,  911,  1447, 1114, 716,  144,
         1711, 919,  927,  270,  187,  1342, 1102, 626,  924,  1684, 1094, 1404,
         682,  1582, 146,  714,  1501, 1674, 1493, 256,  1718, 147,  918,  1696,
         1252, 1269, 653,  308,  149,  488,  949,  539,  800,  1254, 1502, 955,
         732,  257,  1330, 151,  735,  581,  152,  267,  1681, 1641, 153,  1679,
         968,  1035, 973,  972,  965,  962,  1064, 1128, 1283, 1284, 155,  981,
         363,  992,  891,  283,  824,  1005, 335,  489,  964,  1617, 1232, 157,
         158,  997,  961,  1423, 753,  869,  1236, 1006, 1736, 167,  1692, 1738,
         366,  762,  967,  1632, 706,  1528, 161,  1612, 365,  1019, 1494, 487,
         1023, 1374, 1733, 1027, 1300, 1473, 746,  742,  1034, 1367, 1551, 1365,
         1749, 1067, 897,  165,  1425, 166,  1080, 1045, 1251, 1288, 1048, 1089,
         1145, 1151, 844,  1653, 1413, 495,  168,  1747, 1060, 1032, 833,  807,
         677,  1142, 252,  1437, 170,  1137, 526,  172,  1364, 178,  1598, 1654,
         175,  954,  273,  197,  418,  174,  398,  1044, 1081, 1176, 629,  699,
         176,  1346, 1559, 388,  631,  1008, 849,  873,  728,  749,  1229, 1636,
         180,  1723, 1664, 1322, 1566, 1426, 709,  181,  1748, 1115, 1697, 1051,
         183,  1106, 1122, 846,  1306, 667,  1339, 744,  537,  1131, 1238, 1635,
         1002, 567,  464,  1705, 1140, 970,  439,  254,  957,  1018, 1113, 976,
         1715, 189,  370,  190,  1249, 303,  582,  191,  1520, 1394, 796,  381,
         1623, 1613, 354,  412,  1753, 958,  1230, 1275, 194,  1237, 1756, 1175,
         195,  1758, 1272, 1179, 560,  711,  1181, 1569, 1028, 196,  1410, 662,
         740,  703,  601,  1518, 1235, 275,  1141, 1195, 1420, 512,  1480, 348,
         633,  200,  838,  201,  689,  763,  236,  1459, 504,  1766, 202,  1524,
         243,  1535, 1213, 1347, 1216, 1177, 841,  852,  392,  551,  1709, 205,
         687,  948,  1385, 206,  1752, 1495, 295,  207,  1076, 724,  1092, 928,
         907,  1600, 209,  704,  1057, 1456, 1243, 1525, 540,  1461, 1280, 466,
         577,  211,  1703, 1058, 212,  1671, 858,  1629, 747,  519,  1260, 513,
         1603, 265,  403,  914,  214,  1644, 890,  1639, 387,  989,  1011, 1303,
         1432, 1401, 1522, 979,  1498, 226,  330,  1586, 980,  1431, 555,  456,
         1050, 223,  868,  1287, 1331, 1318, 224,  1604, 225,  1444, 374,  552,
         284,  1294, 1159, 1768, 1298, 1039, 1550, 262,  1253, 867,  1761, 230,
         1079, 1307, 1565, 1616, 1026, 1257, 1395, 482,  1548, 1775, 1435, 232,
         1016, 692,  1223, 339,  592,  826,  233,  234,  1024, 1326, 1152, 1070,
         1226, 930,  1722, 235,  1683, 922,  1345, 953,  310,  248,  524,  1716,
         237,  695,  1556, 328,  1402, 239,  721,  771,  1597, 260,  1055, 1442,
         1390, 1136, 1441, 1583, 760,  1350, 983,  754,  1436, 916,  1217, 1132,
         673,  1450, 1363, 1770, 1594, 1020, 1370, 1369, 971,  1720, 508,  1172,
         854,  613,  727,  249,  1378, 1655, 1160, 1490, 523,  1100, 1239, 1577,
         420,  929,  1392, 1686, 1455, 507,  1087, 253,  1289, 1191, 1595, 1488,
         1539, 1043, 379,  686,  1074, 484,  1751, 327,  1309, 1706, 585,  385,
         696,  258,  1112, 1409, 259,  1726, 1412, 1673, 1295, 1267, 1698, 1773,
         1418, 1735, 799,  1769, 1119, 1717, 1406, 902,  376,  1451, 1428, 1642,
         1638, 1561, 542,  1250, 731,  1667, 977,  266,  463,  701,  845,  604,
         1178, 1348, 1186, 620,  590,  1185, 1483, 269,  1704, 431,  1278, 835,
         271,  770,  1429, 1743, 1391, 932,  1419, 336,  367,  1325, 856,  1376,
         514,  1529, 1725, 830,  383,  1220, 1355, 1742, 282,  678,  1465, 776,
         646,  471,  1422, 286,  394,  1728, 950,  884,  433,  446,  291,  1277,
         938,  378,  292,  1646, 866,  1386, 1593, 853,  1353, 1173, 1031, 294,
         1611, 1446, 1605, 461,  1710, 1297, 1591, 1772, 1332, 899,  419,  598,
         634,  1299, 1661, 1408, 1188, 769,  300,  1527, 301,  1505, 1407, 1487,
         1454, 1211, 423,  1745, 1687, 1542, 903,  1129, 996,  876,  909,  1621,
         913,  1554, 693,  1066, 952,  813,  312,  404,  894,  1656, 313,  1258,
         314,  1279, 1545, 1650, 1263, 1320, 683,  316,  1291, 350,  1485, 906,
         1731, 317,  644,  1351, 569,  1544, 1014, 733,  353,  648,  319,  1009,
         320,  1362, 718,  842,  1526, 321,  373,  578,  349,  1682, 1126, 685,
         323,  1532, 944,  325,  326,  428,  892,  1411, 1130, 1746, 410,  960,
         1708, 1165, 966,  782,  1740, 447,  429,  435,  334,  1082, 1509, 1734,
         1587, 751,  337,  538,  805,  1645, 442,  579,  1584, 1270, 483,  1120,
         341,  1713, 1292, 470,  1489, 879,  1741, 741,  1182, 1433, 557,  345,
         942,  346,  865,  390,  863,  458,  1208, 984,  908,  1061, 1405, 475,
         1293, 1139, 1316, 1466, 1563, 536,  850,  1588, 356,  734,  956,  1652,
         368,  364,  1192, 1730, 1244, 1017, 444,  761,  1063, 1246, 396,  1567,
         1285, 550,  1622, 1414, 697,  478,  1624, 777,  1658, 1630, 1007, 1084,
         636,  1068, 1589, 1688, 1510, 829,  998,  380,  501,  1111, 547,  544,
         1205, 1156, 1511, 572,  1647, 384,  1343, 839,  1513, 1479, 479,  778,
         811,  1543, 1540, 1523, 1744, 393,  1777, 1648, 1462, 1649, 1127, 492,
         1486, 1097, 417,  476,  874,  401,  615,  1193, 413,  871,  1174, 1379,
         1573, 1457, 1662, 1574, 490,  1625, 642,  1508, 406,  1755, 1620, 635,
         1214, 680,  595,  1458, 1669, 1774, 1134, 1227, 877,  780,  1184, 1231,
         655,  969,  1675, 1037, 1579, 925,  1161, 1781, 1666, 1071, 568,  602,
         424,  1680, 1200, 737,  775,  493,  1614, 1602, 1643, 1499, 1739, 467,
         432,  1312, 694,  434,  1003, 1183, 1477, 593,  1091, 652,  440,  651,
         1438, 480,  726,  1779, 1712, 549,  1564, 1760, 1194, 450,  1570, 920,
         1421, 1359, 1503, 611,  1259, 818,  1724, 666,  1685, 1349, 1368, 1782,
         715,  1506, 472,  1403, 474,  643,  1319, 681,  1225, 923,  1366, 1571,
         1637, 494,  1599, 1729, 739,  831,  822,  1472, 1530, 1765, 988,  1678,
         1449, 1608, 1321, 610,  499,  502,  1609, 1547, 649,  1101, 1672, 978,
         1304, 827,  705,  1727, 1315, 915,  510,  1389, 1059, 1377, 534,  1780,
         1219, 520,  1560, 660,  887,  1668, 1471, 531,  1274, 661,  1580, 1695,
         1536, 1702, 1663, 1163, 820,  1107, 1197, 1719, 1767, 1203, 1000, 1778,
         1121, 832,  985,  791,  1764, 1133, 565,  637,  1754, 1206, 788,  657,
         584,  659,  1762, 1575, 755,  945,  1585, 931,  1033, 1262, 1167, 1021,
         1453, 910,  1763, 1336, 1305, 1335, 1400, 1344, 1578, 1676, 1162, 640,
         1196, 935,  650,  1618, 1619, 1383, 663,  1628, 808,  1771, 1657, 757,
         1323, 675,  1357, 1360, 679,  1721, 1069, 1533, 1607, 1015, 1691, 1701,
         1124, 812,  713,  1358, 941,  1737, 794,  1553, 1056, 750,  1209, 764,
         767,  789,  809,  1491, 1776, 1555, 1714, 1757, 1660, 1118, 1759, 946,
         1095, 987,  1750, 1634, 1241, 1475, 1732}));

    REQUIRE(S->size() == static_cast<uint64_t>(448345497600));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "026",
                          "perm. Fischer group Fi22 (order 64561751654400)",
                          "[standard][schreier-sims]") {
    auto rg = ReportGuard(REPORT);
    // Slower than GAP
    constexpr size_t N = 3511;
    auto             S = new SchreierSims<N>();
    using Perm         = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,    524,  2,    789,  2130, 777,  491,  3059, 3096, 2636, 527,  11,
         822,  3013, 14,   872,  2392, 2504, 108,  2816, 20,   3295, 851,  23,
         2196, 1503, 2131, 2285, 1061, 1382, 174,  1063, 32,   3057, 490,  846,
         827,  1494, 1640, 3025, 2769, 2858, 42,   1987, 237,  45,   1962, 3393,
         1038, 2974, 50,   1272, 52,   3089, 425,  1109, 1275, 821,  1121, 2314,
         638,  1900, 1649, 63,   64,   1132, 1370, 1590, 68,   2968, 2775, 71,
         3423, 2393, 2154, 75,   1070, 3010, 2642, 79,   2135, 1764, 463,  83,
         417,  2407, 3424, 2748, 3377, 1184, 776,  670,  2072, 653,  3183, 2690,
         96,   1821, 98,   1427, 2804, 1028, 2873, 397,  1196, 207,  3108, 2619,
         18,   2960, 110,  111,  2400, 2492, 245,  2216, 116,  3015, 632,  712,
         3451, 2055, 3036, 2178, 124,  2418, 3030, 127,  1453, 732,  283,  3283,
         273,  2183, 561,  135,  1936, 806,  571,  261,  1460, 669,  142,  1071,
         1431, 145,  3252, 785,  1177, 1469, 327,  1116, 1863, 3087, 3298, 2215,
         156,  2518, 3389, 1289, 160,  1967, 162,  1519, 164,  3210, 166,  3135,
         2507, 169,  3236, 1659, 3403, 299,  30,   2365, 2082, 3080, 415,  1790,
         180,  3359, 3028, 3014, 1876, 2774, 2151, 1444, 188,  1633, 190,  2808,
         1326, 2401, 3308, 988,  1949, 2261, 198,  2246, 200,  2829, 202,  203,
         204,  421,  3148, 105,  2958, 1489, 1542, 211,  814,  1166, 1231, 1334,
         216,  217,  911,  624,  2306, 3055, 1573, 223,  687,  2649, 759,  3215,
         2603, 229,  306,  368,  3195, 2689, 234,  1245, 2009, 44,   1777, 305,
         2260, 3434, 1101, 3292, 1964, 114,  2032, 2014, 918,  249,  474,  1760,
         252,  3119, 254,  1384, 3045, 2132, 3022, 825,  3051, 139,  1745, 263,
         3257, 2647, 266,  1533, 268,  2849, 270,  2606, 866,  132,  1322, 1012,
         1831, 2834, 694,  279,  2912, 2620, 689,  130,  3073, 1862, 286,  848,
         1859, 289,  290,  291,  3297, 2593, 294,  2036, 2395, 339,  1675, 173,
         3198, 1312, 3344, 3238, 2660, 239,  230,  739,  3490, 530,  952,  1521,
         2880, 313,  2628, 905,  3507, 2101, 318,  1681, 2956, 1935, 2699, 1491,
         953,  958,  326,  150,  1536, 2723, 2321, 1671, 2369, 1986, 2140, 1945,
         2113, 3505, 556,  297,  1302, 1963, 1602, 1361, 1386, 345,  346,  371,
         807,  2842, 973,  351,  885,  2719, 2561, 1441, 356,  1984, 358,  359,
         803,  1403, 365,  3373, 1424, 362,  1359, 1508, 231,  1466, 2382, 347,
         1566, 373,  2126, 375,  2991, 2718, 3035, 1451, 2920, 1750, 382,  1554,
         384,  2493, 3040, 1767, 1692, 1068, 2021, 1565, 3110, 393,  3182, 1913,
         1304, 103,  3340, 1197, 3294, 2514, 2687, 2836, 1141, 1828, 2851, 917,
         1713, 409,  2973, 2773, 2417, 611,  1696, 178,  1890, 84,   1955, 3156,
         1877, 205,  3240, 1513, 1162, 54,   426,  427,  2891, 3348, 1232, 630,
         2979, 2162, 2817, 2992, 578,  1131, 3289, 813,  2397, 2819, 1472, 2665,
         838,  1108, 3479, 2744, 3112, 950,  450,  888,  770,  479,  3181, 2462,
         456,  542,  458,  3253, 3070, 3442, 3136, 82,   1179, 1225, 3031, 3127,
         468,  1126, 783,  471,  2426, 473,  250,  2560, 2289, 477,  1150, 453,
         2006, 481,  482,  2908, 484,  1784, 486,  2445, 2905, 1971, 34,   6,
         492,  3027, 494,  3321, 3362, 709,  1161, 1260, 3438, 501,  2308, 503,
         504,  505,  2041, 3245, 2771, 1813, 510,  623,  512,  2934, 2825, 515,
         2931, 2743, 2473, 1135, 3388, 521,  2310, 717,  1,    525,  526,  10,
         1709, 529,  309,  1013, 3432, 533,  1346, 3363, 765,  537,  3016, 2323,
         3081, 541,  457,  543,  2494, 2923, 1376, 1761, 1866, 2508, 2040, 551,
         1994, 1609, 3176, 3235, 338,  886,  3186, 2982, 2625, 134,  562,  563,
         1707, 1477, 566,  567,  568,  1147, 570,  138,  2324, 2458, 2794, 1406,
         1992, 577,  436,  579,  2480, 581,  582,  583,  2146, 3462, 1801, 587,
         588,  2726, 2252, 2727, 1230, 593,  594,  2410, 3415, 856,  3171, 3456,
         1096, 755,  3137, 2618, 1817, 2214, 1735, 2868, 608,  1549, 1788, 413,
         2283, 1220, 3376, 615,  616,  617,  2906, 747,  3124, 826,  1010, 511,
         219,  3023, 2278, 3139, 1855, 629,  431,  3293, 118,  796,  1606, 2052,
         2529, 2338, 60,   2386, 2302, 1251, 642,  1823, 3497, 1966, 3416, 2631,
         1570, 3333, 3190, 651,  2424, 93,   828,  2478, 1550, 1958, 658,  3160,
         990,  1595, 2878, 1267, 793,  1835, 1564, 667,  3303, 141,  91,   1423,
         993,  1119, 2759, 1942, 2350, 2919, 3046, 1128, 834,  681,  1358, 683,
         3218, 3338, 2156, 224,  2137, 282,  2758, 1800, 1772, 2039, 278,  2481,
         3209, 1861, 698,  2573, 2557, 2367, 702,  2199, 2616, 2045, 1931, 2909,
         1204, 497,  3427, 2076, 119,  713,  714,  762,  716,  523,  718,  2864,
         3206, 721,  722,  891,  2938, 3174, 2056, 727,  728,  2643, 730,  1829,
         129,  2211, 1605, 735,  2785, 3169, 738,  307,  3009, 2892, 742,  1787,
         744,  1098, 746,  619,  3260, 2074, 3012, 1222, 1909, 753,  3473, 601,
         756,  757,  2525, 226,  3214, 2926, 715,  1380, 3287, 536,  1476, 919,
         768,  889,  452,  2610, 2447, 773,  2972, 775,  90,   5,    778,  779,
         1693, 781,  1325, 470,  1258, 147,  2016, 787,  1944, 3,    1163, 3018,
         2187, 664,  1045, 2062, 633,  2528, 798,  1253, 2372, 801,  1281, 360,
         2889, 3422, 137,  348,  2066, 2213, 810,  1397, 931,  439,  212,  1896,
         2706, 817,  960,  819,  1537, 57,   12,   2870, 824,  259,  621,  36,
         654,  2584, 830,  831,  832,  833,  680,  852,  3406, 837,  444,  839,
         987,  2537, 1341, 843,  3384, 2688, 35,   2231, 287,  1144, 2364, 22,
         835,  2389, 1922, 3185, 597,  1183, 858,  1889, 860,  3396, 2053, 2844,
         2821, 3097, 272,  2253, 2127, 2930, 2205, 2501, 15,   873,  874,  2702,
         876,  877,  1661, 2377, 1051, 1978, 882,  883,  908,  352,  557,  1102,
         451,  769,  3159, 723,  1879, 893,  894,  1555, 1921, 1103, 898,  899,
         1516, 1387, 1626, 2513, 3301, 315,  3350, 1187, 884,  909,  936,  218,
         912,  3021, 2398, 2124, 1724, 407,  248,  767,  1716, 2442, 922,  3410,
         2020, 2746, 1704, 2093, 928,  929,  930,  812,  1153, 1686, 1151, 1138,
         910,  937,  1528, 1865, 3037, 3378, 3399, 2413, 944,  1229, 1685, 2818,
         1799, 1324, 449,  2320, 310,  324,  954,  3092, 1703, 1878, 325,  3251,
         818,  961,  962,  1571, 2900, 2259, 1379, 967,  2910, 1027, 1408, 971,
         2035, 350,  1015, 1905, 1449, 3113, 978,  1295, 1425, 981,  2692, 3044,
         984,  3417, 2133, 840,  195,  1321, 660,  1851, 1893, 672,  1130, 2847,
         996,  1646, 2411, 3158, 1611, 2585, 2770, 2275, 3409, 1273, 2075, 1708,
         1407, 1669, 622,  1459, 275,  531,  1014, 974,  1016, 1017, 1018, 3177,
         1020, 1422, 3413, 1246, 3394, 1201, 1420, 969,  101,  1623, 3197, 1372,
         3402, 2943, 1034, 1498, 1568, 1789, 48,   1039, 3047, 1041, 1042, 1285,
         1044, 794,  1700, 2159, 2678, 1049, 1743, 880,  1297, 3157, 3200, 3327,
         2312, 3062, 1058, 2648, 3421, 28,   1882, 31,   2102, 1065, 1858, 1067,
         389,  3263, 76,   143,  1139, 1757, 2089, 2359, 1076, 3365, 1953, 2195,
         1080, 1081, 3226, 2669, 1816, 3098, 1086, 2614, 2345, 1792, 3265, 1142,
         1092, 2115, 2490, 1095, 600,  1097, 745,  3366, 2857, 242,  887,  897,
         1104, 1562, 2929, 1107, 445,  55,   1552, 2258, 2422, 1113, 2284, 2977,
         151,  3279, 1118, 673,  1445, 58,   2611, 2519, 2841, 1125, 469,  2043,
         679,  1129, 994,  437,  65,   3472, 2371, 519,  1136, 1689, 935,  1072,
         2896, 404,  1091, 2833, 849,  1247, 2280, 569,  1148, 1677, 478,  934,
         1207, 932,  2299, 1155, 1674, 1157, 1846, 2083, 2731, 498,  424,  790,
         3448, 1165, 213,  1167, 1168, 1169, 1170, 1171, 1208, 1812, 1517, 3420,
         1176, 148,  2476, 464,  1319, 2331, 2136, 857,  89,   1215, 2177, 907,
         2766, 1189, 2640, 3216, 3352, 2353, 1526, 3391, 104,  399,  2226, 1199,
         2098, 1025, 2047, 1320, 708,  1487, 1912, 1152, 1172, 2532, 3061, 1328,
         3499, 1213, 3437, 1185, 3048, 3168, 2155, 1656, 613,  2477, 751,  2434,
         2884, 465,  2791, 2852, 3330, 945,  592,  214,  430,  2621, 2733, 3155,
         1236, 1616, 1641, 2827, 3219, 1898, 1242, 2029, 1282, 235,  1023, 1145,
         2262, 3380, 2370, 641,  1547, 799,  1437, 3364, 1509, 2176, 784,  2326,
         499,  3116, 2850, 3481, 1402, 2576, 1266, 663,  3202, 2003, 2965, 2281,
         51,   1005, 1350, 56,   1627, 1277, 1310, 1960, 3072, 802,  1244, 1283,
         1284, 1043, 2291, 1639, 1288, 159,  3493, 3050, 2543, 1293, 2012, 979,
         2713, 1052, 1679, 2071, 3225, 1762, 340,  2650, 396,  3334, 1306, 2235,
         3447, 2073, 1278, 1652, 301,  1393, 1797, 1315, 2419, 2762, 2450, 1180,
         1203, 989,  274,  1894, 949,  782,  192,  1399, 1211, 1329, 1957, 2962,
         2034, 3228, 215,  2854, 3404, 3466, 3319, 3291, 1340, 842,  1342, 2347,
         3006, 2598, 534,  2712, 3115, 2704, 1274, 2292, 1916, 1353, 2287, 2862,
         2189, 2980, 682,  366,  2536, 343,  1362, 1363, 3024, 2559, 3485, 1367,
         2489, 2679, 66,   1371, 1031, 1414, 1644, 2182, 546,  1377, 3100, 966,
         763,  1906, 29,   3175, 255,  1385, 344,  901,  1388, 1389, 2768, 3132,
         1392, 1313, 1781, 3005, 1673, 811,  1398, 1327, 3503, 2685, 1264, 361,
         1404, 3114, 575,  1008, 970,  1409, 2595, 1411, 3085, 3020, 1373, 2387,
         1416, 1417, 1418, 2166, 1026, 1421, 1021, 671,  364,  980,  2334, 99,
         1428, 1429, 1672, 144,  2247, 1433, 1434, 2792, 2668, 1254, 1438, 3502,
         2019, 355,  1442, 1819, 187,  1120, 2879, 1447, 2303, 976,  2317, 379,
         2198, 128,  1454, 1485, 2753, 1457, 2463, 1011, 140,  3149, 3458, 1902,
         1464, 3429, 369,  1467, 1468, 149,  1556, 1601, 442,  2388, 1560, 2000,
         766,  565,  2894, 1970, 1480, 1481, 3026, 2005, 2809, 1455, 1486, 1205,
         1488, 209,  3347, 323,  2128, 1871, 37,   1495, 1496, 3302, 1035, 1499,
         2095, 3213, 3118, 25,   1504, 2491, 2959, 1806, 367,  1256, 3322, 2990,
         1512, 423,  2680, 1814, 900,  1174, 1518, 163,  1574, 311,  1522, 1995,
         3351, 2895, 1194, 3082, 938,  3058, 1775, 1636, 2815, 267,  3449, 1535,
         328,  820,  1538, 2835, 1540, 2918, 210,  3326, 3487, 1545, 3343, 1252,
         1887, 609,  656,  1551, 1110, 1589, 383,  895,  1470, 1631, 1852, 1559,
         1474, 1561, 1105, 1941, 666,  391,  372,  2351, 1036, 2406, 648,  963,
         1572, 222,  1520, 1608, 2629, 2193, 3361, 1952, 1596, 2637, 1582, 2732,
         1584, 1722, 1586, 1587, 1588, 1553, 67,   3262, 1650, 2695, 1594, 661,
         1580, 1834, 1598, 2749, 2218, 1471, 342,  1603, 2957, 734,  634,  1744,
         1575, 553,  1610, 1000, 1612, 2944, 1765, 1615, 1237, 2589, 1618, 3304,
         1620, 2772, 3001, 1029, 1624, 1625, 902,  1276, 2666, 2033, 1630, 1557,
         1632, 189,  1807, 2158, 1531, 3258, 1702, 1287, 38,   1238, 1642, 1647,
         1374, 1645, 997,  1643, 1648, 62,   1592, 2112, 1311, 2380, 3280, 2148,
         1219, 3443, 1885, 171,  1660, 878,  2446, 2813, 2309, 1950, 1666, 2781,
         1926, 1009, 2145, 331,  1430, 1396, 1156, 298,  1918, 1149, 2935, 1298,
         1680, 319,  2638, 2673, 1684, 946,  933,  2339, 2186, 1137, 2191, 2787,
         388,  780,  1741, 1695, 414,  1888, 2684, 1699, 1046, 1972, 1638, 956,
         926,  1705, 2617, 564,  1007, 528,  2855, 1711, 2266, 408,  3066, 3099,
         920,  1997, 3275, 1872, 2984, 1721, 1585, 1897, 916,  1725, 1726, 1727,
         1756, 1729, 3203, 1731, 2736, 3360, 1892, 606,  1736, 1737, 1738, 2945,
         3341, 1694, 1742, 1050, 1607, 262,  3288, 2222, 1748, 3232, 381,  2729,
         3141, 3128, 1754, 1755, 1728, 1073, 1758, 1759, 251,  547,  1301, 2170,
         81,   1614, 3426, 387,  3370, 1769, 3480, 1771, 692,  1773, 2175, 1530,
         2947, 238,  2171, 2119, 2304, 1394, 2928, 1783, 485,  2663, 1786, 743,
         610,  1037, 179,  2467, 1089, 2533, 1794, 1795, 1796, 1314, 2555, 948,
         691,  586,  2921, 1803, 1804, 1805, 1507, 1634, 2658, 3064, 2898, 1811,
         1173, 509,  1515, 3468, 1084, 604,  1818, 1443, 1820, 97,   2233, 643,
         1824, 1825, 2343, 2812, 405,  731,  1830, 276,  2683, 1833, 1597, 665,
         2703, 3060, 2234, 3034, 1840, 2153, 1842, 2567, 1844, 1845, 1158, 1847,
         1925, 2025, 1850, 991,  1558, 1853, 2720, 628,  2192, 1857, 1066, 288,
         3095, 697,  285,  152,  1864, 939,  548,  1867, 1868, 2756, 2571, 1493,
         1719, 2267, 2438, 3450, 184,  420,  957,  892,  2883, 1924, 1062, 3126,
         2042, 1658, 2142, 1548, 1697, 859,  416,  2163, 1734, 992,  1323, 1895,
         815,  1723, 1241, 2988, 61,   2562, 1463, 1969, 1904, 975,  1381, 2866,
         2544, 752,  3277, 2811, 1206, 395,  2783, 2487, 1352, 3431, 1676, 2644,
         1920, 896,  854,  3247, 1881, 1848, 1668, 2010, 1928, 3077, 2523, 706,
         2157, 3273, 2778, 321,  136,  2444, 3315, 1939, 1940, 1563, 675,  2439,
         788,  335,  2325, 3227, 1948, 196,  1665, 3332, 1579, 1078, 3408, 418,
         2933, 1330, 657,  3111, 1279, 3356, 46,   341,  244,  1965, 645,  161,
         1968, 1903, 1479, 489,  1701, 2856, 2989, 3266, 1976, 1977, 881,  2298,
         3331, 3397, 2028, 1983, 357,  1985, 333,  43,   1988, 1989, 2767, 2107,
         576,  3267, 552,  1523, 3131, 1717, 3400, 3088, 1475, 3017, 2527, 1269,
         3163, 1483, 480,  2007, 3278, 236,  1927, 2061, 1294, 2013, 247,  3476,
         786,  2017, 2018, 1440, 924,  390,  2569, 3101, 2255, 1849, 2026, 2046,
         1982, 1243, 2290, 2993, 246,  1629, 1332, 972,  295,  2037, 2038, 693,
         550,  506,  1884, 1127, 3459, 705,  2027, 1202, 3311, 2144, 3282, 2220,
         635,  862,  2566, 121,  726,  2057, 3482, 2169, 2348, 2011, 795,  2063,
         3033, 3296, 808,  2067, 3065, 2069, 2828, 1299, 92,   1309, 749,  1006,
         711,  2077, 2078, 2510, 2206, 2081, 176,  1159, 2139, 2085, 2700, 2224,
         2535, 1074, 2313, 2091, 2381, 927,  2094, 1500, 2096, 2826, 1200, 2099,
         2615, 317,  1064, 2538, 2552, 2597, 2106, 1991, 2763, 2202, 2360, 2111,
         1651, 336,  2114, 1093, 2116, 2890, 3381, 1779, 2645, 2714, 2122, 2123,
         915,  3140, 374,  868,  1492, 2129, 4,    26,   257,  986,  2134, 80,
         1182, 688,  2138, 2084, 334,  3193, 1886, 2655, 2049, 1670, 584,  2147,
         1655, 3474, 2150, 186,  2914, 1841, 74,   1218, 686,  1932, 1635, 1047,
         2160, 2795, 433,  1891, 2626, 2605, 1419, 2742, 3076, 2059, 1763, 1778,
         2172, 2188, 2174, 1774, 1257, 1186, 123,  2822, 2564, 2181, 1375, 133,
         2969, 2185, 1688, 792,  2173, 1356, 2190, 1690, 1856, 1577, 2357, 1079,
         24,   2197, 1452, 703,  2981, 2201, 2109, 2203, 3509, 870,  2080, 2207,
         3405, 3102, 3191, 733,  2212, 809,  605,  155,  115,  2468, 1600, 2219,
         2051, 2936, 1747, 2551, 2087, 3506, 1198, 2227, 2228, 2229, 2639, 847,
         2755, 1822, 1838, 1307, 2236, 2797, 2531, 2239, 2452, 2241, 2405, 2243,
         2244, 2599, 199,  1432, 2248, 2249, 2250, 2863, 590,  867,  2254, 2024,
         2256, 3411, 1111, 965,  240,  197,  1248, 2263, 3056, 2940, 1712, 1873,
         2268, 2591, 2911, 2271, 2272, 2273, 2764, 1003, 2329, 3371, 626,  2971,
         1146, 1271, 2282, 612,  1114, 27,   2861, 1354, 3117, 476,  2030, 1286,
         1351, 3488, 2488, 3196, 3038, 3342, 1979, 1154, 2300, 3084, 640,  1448,
         1780, 3105, 220,  3071, 502,  1664, 522,  2872, 1056, 2090, 59,   2654,
         2316, 1450, 2318, 2319, 951,  330,  2451, 539,  572,  1946, 1259, 3063,
         2786, 2276, 2330, 1181, 2332, 2579, 1426, 2335, 2484, 2337, 637,  1687,
         2340, 2341, 3079, 1826, 2344, 1088, 2346, 1343, 2060, 2349, 676,  1567,
         2352, 1193, 2354, 2355, 2563, 2194, 2358, 1075, 2110, 3372, 3425, 2363,
         850,  175,  2366, 701,  2368, 332,  1250, 1134, 800,  2423, 2374, 3281,
         2506, 879,  2378, 3104, 1653, 2092, 370,  2485, 2384, 2385, 639,  1415,
         1473, 853,  2390, 2697, 16,   73,   3246, 296,  3285, 440,  914,  2399,
         112,  193,  2902, 2466, 3053, 2242, 1569, 85,   3457, 2409, 595,  998,
         3368, 943,  2464, 2521, 2503, 412,  125,  1316, 2420, 2425, 1112, 2373,
         652,  2421, 472,  2472, 2428, 3325, 2952, 2460, 3008, 3300, 1223, 2541,
         2436, 3134, 1874, 1943, 2440, 2600, 921,  2922, 1937, 487,  1662, 772,
         2454, 3433, 1318, 2322, 2240, 2499, 2448, 2932, 3069, 2457, 573,  3339,
         2431, 2927, 455,  1458, 2414, 2832, 2403, 1791, 2217, 2469, 2470, 2471,
         2427, 518,  2474, 2475, 1178, 1221, 655,  2479, 580,  695,  2482, 2670,
         2336, 2383, 2486, 1915, 2294, 1368, 1094, 1505, 113,  385,  544,  2495,
         2887, 2497, 3207, 2453, 2500, 871,  3002, 2416, 17,   3043, 2376, 168,
         549,  3049, 2079, 3454, 2512, 903,  401,  2661, 3491, 2517, 157,  1123,
         2520, 2415, 2522, 1930, 3032, 758,  3355, 2002, 797,  636,  2985, 2238,
         1209, 1793, 2747, 2088, 1360, 841,  2103, 3153, 2540, 2435, 3029, 1292,
         1908, 2545, 2546, 2547, 3483, 2549, 3354, 2223, 2104, 2553, 2554, 1798,
         2556, 700,  2784, 1365, 475,  354,  1901, 2356, 2180, 2716, 2054, 1843,
         2901, 2022, 2570, 1870, 2572, 699,  2574, 2575, 1265, 3165, 2578, 2333,
         2707, 2581, 2582, 2602, 829,  1001, 2586, 2587, 3143, 1617, 2846, 2269,
         2592, 293,  2823, 1410, 2596, 2105, 1345, 2245, 2441, 2961, 2583, 228,
         2604, 2165, 271,  2607, 2608, 2609, 771,  1122, 3349, 2613, 1087, 2100,
         704,  1706, 603,  107,  281,  1233, 2622, 3455, 2624, 560,  2164, 2627,
         314,  1576, 2630, 647,  2632, 2633, 3230, 2635, 9,    1581, 1682, 2230,
         1190, 2667, 78,   729,  1919, 2120, 2646, 265,  1059, 225,  1303, 3130,
         2843, 3107, 2315, 2143, 2656, 2657, 1808, 2721, 304,  2515, 2662, 1785,
         2664, 443,  1628, 2641, 1436, 1083, 2483, 2853, 2672, 1683, 2674, 2978,
         2676, 3248, 1048, 1369, 1514, 3313, 3264, 1832, 1698, 1401, 2686, 402,
         845,  233,  95,   2691, 982,  2946, 2694, 1593, 3353, 2391, 2698, 322,
         2086, 3395, 875,  1836, 1349, 2705, 816,  2580, 3387, 2709, 2710, 3328,
         1347, 1296, 2121, 2715, 2565, 2999, 377,  353,  1854, 2659, 2722, 329,
         2724, 2725, 589,  591,  2728, 1751, 3145, 1160, 1583, 1234, 2734, 3469,
         1732, 2871, 3484, 2739, 3310, 2964, 2167, 517,  447,  2745, 925,  2534,
         87,   1599, 3379, 2796, 3106, 1456, 2760, 2232, 1869, 3414, 690,  674,
         2754, 2802, 1317, 2108, 2274, 2765, 1188, 1990, 1390, 40,   1002, 508,
         1621, 411,  185,  70,   2776, 2997, 1934, 2779, 2780, 1667, 2782, 1914,
         2558, 736,  2328, 1691, 2788, 2937, 2790, 1226, 1435, 2793, 574,  2161,
         2751, 2237, 2798, 2799, 3255, 3173, 2761, 2803, 100,  2805, 2897, 2807,
         191,  1484, 2810, 1911, 1827, 1663, 2814, 1532, 19,   434,  947,  441,
         2820, 864,  2179, 2594, 2824, 514,  2097, 1239, 2070, 201,  2830, 3256,
         2465, 1143, 277,  1539, 403,  2837, 3375, 3220, 2840, 1124, 349,  2652,
         863,  3486, 2590, 995,  2848, 269,  1262, 406,  1227, 2671, 1335, 1710,
         1973, 1100, 41,   2859, 2860, 2286, 1355, 2251, 719,  3501, 1907, 2867,
         607,  2963, 823,  2737, 2311, 102,  2975, 2875, 2876, 2877, 662,  1446,
         312,  2881, 3446, 1880, 1224, 3221, 2886, 2496, 2888, 804,  2117, 428,
         741,  2893, 1478, 1525, 1140, 2806, 1810, 3357, 964,  2568, 2402, 2996,
         2904, 488,  618,  2907, 483,  707,  968,  2270, 280,  3103, 2152, 3090,
         2916, 2917, 1541, 677,  380,  1802, 2443, 545,  2967, 2925, 761,  2461,
         1782, 1106, 869,  516,  2455, 1956, 513,  1678, 2221, 2789, 724,  3374,
         2265, 3467, 3307, 1033, 1613, 1739, 2693, 1776, 2948, 2949, 3270, 3316,
         2430, 2953, 2954, 3299, 320,  1604, 208,  1506, 109,  2601, 1331, 2869,
         2741, 1270, 2966, 2924, 69,   2184, 3234, 2279, 774,  410,  49,   2874,
         2976, 1115, 2675, 432,  1357, 2200, 559,  3383, 1720, 2530, 2986, 2987,
         1899, 1974, 1511, 376,  435,  2031, 2994, 2995, 2903, 2777, 3439, 2717,
         3000, 1622, 2502, 3286, 3004, 1395, 1344, 3007, 2432, 740,  77,   3011,
         750,  13,   183,  117,  538,  2001, 791,  3244, 1413, 913,  258,  625,
         1364, 39,   1482, 493,  182,  2542, 126,  466,  2524, 2064, 1839, 378,
         122,  940,  2296, 3039, 386,  3041, 3042, 2505, 983,  256,  678,  1040,
         1216, 2509, 1291, 260,  3052, 2404, 3054, 221,  2264, 33,   1529, 7,
         1837, 1210, 1057, 2327, 1809, 2068, 1714, 3067, 3068, 2456, 460,  2307,
         1280, 284,  3120, 3075, 2168, 1929, 3211, 2342, 177,  540,  1527, 3083,
         2301, 1412, 3086, 153,  1999, 53,   2915, 3091, 955,  3093, 3162, 1860,
         8,    865,  1085, 1715, 1378, 2023, 2209, 2913, 2379, 2305, 2752, 2653,
         106,  3164, 392,  1959, 448,  977,  1405, 1348, 1261, 2288, 1502, 253,
         3074, 3440, 3306, 3123, 620,  3125, 1883, 467,  1753, 3129, 2651, 1996,
         1391, 3133, 2437, 167,  462,  602,  3249, 627,  2125, 1752, 3142, 2588,
         3144, 2730, 3464, 3358, 206,  1461, 3150, 3154, 3152, 2539, 3151, 1235,
         419,  1053, 999,  890,  659,  3161, 3094, 2004, 3109, 2577, 3166, 3167,
         1217, 737,  3390, 598,  3495, 2801, 725,  1383, 554,  1019, 3178, 3345,
         3180, 454,  394,  94,   3385, 855,  558,  3407, 3188, 3445, 650,  2210,
         3192, 2141, 3194, 232,  2295, 1030, 300,  3199, 1054, 3201, 1268, 1730,
         3335, 3205, 720,  2498, 3208, 696,  165,  3078, 3212, 1501, 760,  227,
         1191, 3217, 684,  1240, 2839, 2885, 3222, 3223, 3224, 1300, 1082, 1947,
         1333, 3229, 2634, 3231, 1749, 3233, 2970, 555,  170,  3237, 303,  3239,
         422,  3241, 3401, 3243, 3019, 507,  2394, 1923, 2677, 3138, 3250, 959,
         146,  459,  3254, 2800, 2831, 264,  1637, 3259, 748,  3261, 1591, 1069,
         2682, 1090, 1975, 1993, 3268, 3269, 2950, 3271, 3317, 1933, 3274, 1718,
         3276, 1910, 2008, 1117, 1654, 2375, 2050, 131,  3284, 2396, 3003, 764,
         1746, 438,  3444, 1339, 243,  631,  400,  21,   2065, 292,  154,  2955,
         2433, 904,  1497, 668,  1619, 3305, 3122, 2942, 194,  3496, 2740, 2048,
         3312, 2681, 3314, 1938, 2951, 3272, 3318, 1338, 3320, 495,  1510, 3489,
         3324, 2429, 1543, 1055, 2711, 3329, 1228, 1980, 1951, 649,  1305, 3204,
         3336, 3337, 685,  2459, 398,  1740, 2297, 1546, 302,  3179, 3346, 1490,
         429,  2612, 906,  1524, 1192, 2696, 2550, 2526, 1961, 2899, 3147, 181,
         1733, 1578, 496,  535,  1255, 1077, 1099, 3367, 2412, 3369, 1768, 2277,
         2361, 363,  2939, 2838, 614,  88,   941,  2750, 1249, 2118, 3382, 2983,
         844,  3184, 3386, 2708, 520,  158,  3170, 1195, 3392, 47,   1024, 2701,
         861,  1981, 3398, 942,  1998, 3242, 1032, 172,  1336, 2208, 836,  3187,
         1954, 1004, 923,  2257, 3412, 1022, 2757, 596,  646,  985,  3418, 3419,
         1175, 1060, 805,  72,   86,   2362, 1766, 710,  3428, 1465, 3510, 1917,
         532,  2449, 241,  3435, 3478, 1214, 500,  2998, 3121, 3441, 461,  1657,
         3290, 3189, 2882, 1308, 1164, 1534, 1875, 120,  3452, 3453, 2511, 2623,
         599,  2408, 1462, 2044, 3460, 3461, 585,  3463, 3146, 3465, 1337, 2941,
         1815, 2735, 3470, 3471, 1133, 754,  2149, 3475, 2015, 3477, 3436, 446,
         1770, 1263, 2058, 2548, 2738, 1366, 2845, 1544, 2293, 3323, 308,  2516,
         3492, 1290, 3494, 3172, 3309, 644,  3498, 1212, 3500, 2865, 1439, 1400,
         3504, 337,  2225, 316,  3508, 2204, 3430}));

    S->add_generator(Perm(
        {0,    556,  325,  67,   1579, 391,  2643, 1896, 2439, 2666, 3145, 820,
         2475, 3036, 1735, 2023, 1741, 3404, 1633, 363,  3334, 1163, 2404, 3217,
         230,  225,  3302, 2527, 1117, 2398, 2936, 2177, 3233, 2216, 472,  3428,
         2479, 7,    813,  2321, 376,  199,  1853, 1621, 2948, 2510, 1569, 838,
         2158, 521,  195,  1768, 2337, 3118, 1594, 863,  790,  1631, 2818, 3098,
         712,  2188, 2149, 254,  2574, 662,  72,   381,  580,  805,  3380, 517,
         1640, 414,  1366, 2998, 147,  539,  179,  385,  2902, 1816, 1100, 1951,
         519,  475,  2060, 3264, 3168, 1551, 3465, 2134, 537,  3149, 2739, 2029,
         1529, 2494, 1185, 2975, 2165, 963,  1049, 1337, 3095, 2489, 1749, 1428,
         162,  2323, 2701, 276,  764,  3122, 1459, 792,  917,  1176, 2298, 2349,
         1298, 1303, 1870, 2281, 3244, 2930, 1580, 701,  2525, 3068, 2225, 2577,
         1242, 1630, 681,  1077, 1372, 770,  1183, 263,  2063, 2085, 3164, 724,
         1383, 2740, 3214, 971,  1029, 2978, 346,  2347, 697,  100,  3017, 612,
         2032, 2529, 1507, 2956, 1773, 888,  954,  957,  2091, 280,  1571, 3496,
         153,  950,  3426, 1706, 1079, 3229, 3369, 190,  3381, 1933, 1881, 1849,
         2935, 2890, 3076, 2362, 3314, 2836, 3405, 1032, 258,  1419, 3097, 2248,
         2427, 1876, 2136, 598,  2721, 79,   2878, 1355, 1921, 3191, 1505, 731,
         2580, 352,  972,  2394, 3014, 473,  3286, 2410, 1423, 2880, 3278, 348,
         3101, 924,  2150, 1647, 196,  1022, 3331, 418,  779,  2456, 2954, 1394,
         224,  592,  1772, 149,  471,  3031, 510,  2436, 1479, 668,  165,  3431,
         2141, 3418, 2985, 3459, 2246, 1830, 2429, 751,  1648, 1244, 753,  1230,
         3117, 379,  2812, 2786, 847,  1090, 2653, 1265, 251,  3333, 2745, 14,
         2539, 489,  2670, 3134, 1747, 3305, 41,   3374, 616,  2720, 1239, 1555,
         1233, 2581, 1878, 487,  3040, 333,  450,  467,  1092, 2639, 1632, 2184,
         3272, 2760, 1657, 1786, 2118, 1015, 368,  309,  1364, 2911, 2966, 2684,
         35,   2449, 931,  2025, 2520, 2803, 197,  2810, 2926, 2987, 1144, 1862,
         809,  2832, 484,  1128, 2605, 1306, 465,  982,  219,  1578, 3258, 2901,
         3398, 1399, 1089, 1894, 928,  2842, 2689, 2499, 2830, 3326, 2395, 1908,
         2563, 1188, 2843, 2982, 3323, 1985, 89,   710,  366,  1626, 1696, 3094,
         1296, 2758, 480,  2516, 2846, 30,   3132, 1181, 1357, 406,  1488, 2715,
         1794, 68,   1638, 1374, 407,  2594, 2077, 3204, 1590, 1930, 3243, 2528,
         1251, 2162, 2426, 3169, 1024, 166,  1107, 979,  401,  2466, 3420, 2259,
         894,  1819, 40,   207,  1553, 1644, 624,  1361, 3282, 1755, 3375, 2900,
         514,  1234, 2089, 3315, 28,   3137, 744,  2218, 2127, 3277, 1545, 1453,
         2800, 597,  1543, 1434, 2081, 2062, 528,  2775, 506,  1487, 3373, 298,
         2537, 661,  759,  2488, 3127, 657,  1573, 2957, 987,  1070, 193,  2596,
         328,  1132, 551,  1174, 703,  1986, 481,  2864, 1668, 3056, 2899, 718,
         2100, 2887, 245,  1746, 1129, 2609, 815,  1481, 647,  1186, 3016, 2920,
         549,  3120, 3256, 2088, 1471, 846,  2033, 2211, 2641, 1599, 882,  844,
         1161, 1609, 2419, 1695, 2601, 428,  2752, 1886, 3173, 46,   1536, 2202,
         2271, 3065, 862,  2727, 1082, 1882, 855,  1528, 2490, 2686, 66,   520,
         919,  831,  2942, 1663, 3294, 1393, 1879, 2815, 2895, 2955, 370,  990,
         2631, 570,  500,  3113, 1898, 1651, 636,  2802, 2334, 1950, 257,  1760,
         3208, 1139, 1194, 1759, 761,  213,  3043, 3035, 2953, 3291, 1028, 1130,
         188,  2416, 980,  2546, 3207, 15,   1470, 2952, 2048, 2018, 2317, 1057,
         2498, 2433, 925,  2523, 672,  1734, 1023, 2460, 1327, 2674, 2283, 1386,
         344,  3506, 1719, 2729, 1702, 3450, 1007, 3276, 641,  1974, 1506, 3030,
         585,  1548, 1795, 1929, 2749, 3340, 1382, 2505, 1439, 1865, 2716, 148,
         999,  329,  497,  2458, 2254, 1381, 503,  3469, 3152, 2109, 1109, 1937,
         788,  802,  1263, 709,  553,  600,  3249, 1813, 2947, 2422, 1586, 2785,
         2233, 1510, 1652, 1456, 3355, 588,  3077, 3212, 2204, 2240, 2662, 3241,
         457,  1825, 554,  1272, 1591, 1325, 2759, 1087, 2129, 34,   2262, 1291,
         2229, 3013, 2521, 1600, 1869, 1859, 821,  3458, 229,  2756, 1671, 2147,
         1350, 2207, 1836, 2130, 2869, 2870, 3084, 1678, 1472, 2572, 2050, 659,
         2703, 2583, 873,  1422, 3187, 2264, 3432, 1063, 2001, 772,  541,  606,
         781,  604,  872,  2116, 3339, 2201, 1880, 3438, 617,  3395, 1452, 479,
         1259, 1465, 3254, 1673, 2356, 1440, 2951, 1227, 1524, 1550, 3170, 3111,
         2724, 903,  109,  3410, 3054, 2891, 1627, 969,  857,  1847, 2943, 654,
         1531, 3327, 1302, 3473, 23,   373,  2205, 3008, 1135, 1831, 3044, 1561,
         1797, 2455, 2293, 994,  2015, 508,  1566, 2371, 2789, 1368, 2808, 2557,
         743,  2181, 2894, 169,  183,  3041, 783,  817,  3102, 2157, 906,  2892,
         1119, 2389, 1576, 3061, 139,  1684, 3037, 776,  3146, 2235, 1872, 2630,
         1981, 71,   3228, 1448, 2984, 335,  2698, 2534, 1714, 3449, 3320, 1318,
         2330, 544,  656,  2620, 1909, 3154, 2872, 3042, 2968, 974,  2250, 92,
         2065, 2223, 2904, 2159, 2006, 1450, 1037, 1098, 575,  3003, 3344, 1468,
         3051, 3387, 2772, 161,  1924, 118,  2725, 87,   1069, 2567, 267,  1873,
         3226, 828,  1041, 3090, 97,   1313, 2299, 1775, 260,  2106, 246,  522,
         3163, 3005, 2669, 2096, 2690, 3236, 766,  1511, 1829, 2738, 2359, 1143,
         1467, 275,  774,  1277, 1311, 3171, 2889, 1305, 2989, 1949, 318,  3058,
         890,  729,  431,  3251, 1283, 593,  1165, 2055, 2324, 1988, 1515, 1681,
         2095, 2707, 1637, 867,  1756, 995,  2279, 1120, 1178, 3309, 1748, 2101,
         2308, 3049, 2011, 496,  1217, 829,  2251, 2030, 2156, 2042, 441,  2569,
         2076, 1431, 2092, 2980, 860,  1400, 3143, 3131, 3250, 301,  1522, 1977,
         2289, 3107, 3456, 2152, 849,  2604, 2370, 926,  2965, 1332, 981,  2179,
         558,  1517, 2859, 1064, 121,  1793, 2122, 2817, 1567, 2495, 464,  117,
         1570, 3025, 3429, 321,  1964, 2588, 1076, 2565, 1796, 2656, 1740, 762,
         914,  2450, 2350, 2163, 3248, 228,  2858, 945,  650,  694,  2592, 128,
         912,  1102, 1142, 1269, 3141, 607,  2909, 608,  3328, 2833, 3088, 78,
         2685, 1238, 2940, 2175, 2452, 2708, 2331, 733,  2501, 2417, 2391, 2781,
         1792, 2237, 2493, 3350, 3147, 707,  2514, 2914, 1834, 486,  3497, 3492,
         640,  1353, 1764, 2244, 1213, 722,  3280, 2228, 1054, 2663, 1257, 419,
         1841, 1935, 2491, 3177, 1762, 143,  57,   154,  2423, 2549, 1597, 1261,
         2671, 2265, 3160, 451,  1601, 3158, 3073, 320,  456,  2687, 1003, 3466,
         1941, 395,  1822, 1086, 3411, 1267, 953,  1389, 2160, 2369, 403,  3383,
         929,  2000, 2766, 3114, 1474, 1855, 2682, 63,   2420, 86,   962,  868,
         2515, 1616, 2658, 3481, 3507, 3112, 3099, 559,  270,  192,  2829, 3234,
         2937, 448,  3487, 1771, 2477, 1712, 758,  1699, 2634, 2699, 460,  1140,
         1589, 2480, 495,  2125, 2916, 996,  1915, 986,  527,  3010, 3384, 172,
         2428, 2632, 175,  2418, 2691, 1560, 2912, 1961, 1430, 2867, 905,  1343,
         3270, 2313, 2341, 763,  2069, 222,  2140, 2187, 2447, 262,  2616, 2322,
         2917, 1147, 3015, 1584, 3162, 1913, 1701, 1060, 84,   1846, 2387, 135,
         2044, 3424, 787,  2117, 2485, 702,  3048, 1154, 561,  1655, 1180, 212,
         2763, 3489, 704,  932,  609,  1823, 698,  2757, 2407, 2664, 728,  2260,
         1598, 1987, 2113, 3028, 2003, 1942, 564,  2075, 3480, 1222, 25,   2268,
         880,  65,   1919, 1451, 3494, 1266, 1593, 2288, 3303, 2793, 2950, 3299,
         2570, 303,  1953, 455,  1574, 1346, 2151, 2624, 2877, 1770, 1936, 1101,
         157,  2047, 2622, 1767, 3376, 1653, 502,  1669, 2470, 2137, 2028, 947,
         2777, 2131, 271,  3505, 3399, 483,  3096, 3190, 1820, 2608, 1606, 185,
         281,  1541, 840,  324,  1351, 443,  1779, 1532, 1732, 2991, 3001, 708,
         24,   64,   2502, 1160, 1072, 2226, 3128, 988,  423,  289,  3213, 1246,
         878,  664,  3060, 2326, 1776, 2933, 3237, 3219, 1379, 1608, 383,  1067,
         2209, 687,  9,    314,  433,  1656, 916,  3423, 1038, 1002, 1397, 970,
         1863, 1385, 1828, 2182, 2508, 1198, 534,  360,  3322, 1700, 2276, 799,
         2329, 3275, 2087, 2790, 1339, 3498, 1643, 2114, 151,  2052, 555,  1503,
         1056, 1916, 2166, 2478, 1088, 2469, 2301, 3316, 241,  531,  367,  3401,
         1206, 1,    992,  2929, 1193, 2782, 232,  130,  8,    2519, 3471, 55,
         2650, 1324, 2190, 2778, 2714, 2041, 1293, 634,  2688, 2734, 3508, 1861,
         1493, 327,  1612, 1031, 2451, 3440, 31,   653,  584,  1676, 1686, 3115,
         2355, 645,  2309, 3455, 1564, 1731, 2311, 1280, 2801, 2962, 1838, 1322,
         1983, 870,  2178, 3400, 264,  2067, 778,  504,  651,  209,  3441, 793,
         1352, 976,  3416, 2161, 1403, 3119, 1965, 871,  1310, 615,  3437, 769,
         342,  2421, 2963, 688,  791,  1934, 1288, 3109, 2411, 2614, 2090, 1218,
         752,  174,  1131, 2755, 3343, 1091, 171,  1697, 719,  3183, 3092, 1535,
         2425, 1677, 1408, 422,  2704, 3150, 678,  3503, 2277, 2970, 3142, 1094,
         1946, 832,  646,  1745, 2668, 2958, 3445, 3361, 294,  3468, 1294, 1226,
         1641, 138,  2340, 1483, 1066, 2949, 1525, 1808, 515,  103,  425,  627,
         876,  1437, 2771, 3349, 104,  2252, 3488, 775,  2432, 3,    1791, 1463,
         2373, 2545, 2886, 959,  1477, 74,   1494, 2120, 1016, 3103, 1464, 305,
         689,  3495, 438,  639,  1051, 2338, 2841, 907,  2788, 234,  1486, 2078,
         2086, 48,   133,  1809, 3246, 296,  3224, 748,  227,  738,  1979, 392,
         1126, 36,   3189, 2376, 396,  1093, 1957, 3133, 1708, 2651, 3446, 2811,
         818,  2071, 833,  705,  198,  2804, 3193, 44,   3439, 676,  200,  2339,
         3464, 1683, 543,  663,  2221, 1380, 509,  1806, 3403, 622,  105,  540,
         1211, 2659, 2600, 1208, 2054, 2526, 548,  2683, 3342, 1595, 3281, 2927,
         966,  341,  2552, 936,  3021, 1295, 691,  1052, 250,  2014, 1384, 814,
         1447, 3216, 2016, 898,  3079, 3257, 2133, 3290, 1857, 1190, 1247, 1944,
         2839, 1672, 2692, 3012, 3341, 442,  1720, 602,  3055, 1152, 3351, 429,
         2976, 239,  3370, 3397, 1162, 357,  2571, 2835, 536,  524,  693,  960,
         3195, 3385, 2995, 1014, 816,  2375, 2806, 2465, 563,  795,  1004, 2903,
         319,  2093, 315,  566,  777,  2748, 12,   453,  1396, 463,  1682, 1975,
         1807, 1729, 1134, 690,  1501, 1750, 454,  290,  2312, 1877, 1780, 2342,
         842,  1539, 3345, 187,  2486, 985,  1349, 1001, 3285, 1801, 3451, 317,
         2819, 3413, 2762, 1905, 1892, 3346, 3407, 1489, 3067, 2765, 2357, 1670,
         1556, 1818, 2316, 2124, 2173, 2598, 851,  2021, 1138, 2327, 1858, 416,
         843,  1982, 786,  2606, 1415, 1520, 735,  3148, 1301, 3034, 205,  322,
         240,  952,  739,  3288, 3287, 869,  323,  1629, 934,  1421, 201,  1219,
         2296, 1519, 194,  1084, 574,  268,  293,  3363, 22,   2773, 21,   412,
         1976, 2167, 411,  1885, 3414, 717,  1478, 2361, 2628, 884,  1484, 137,
         2827, 2750, 331,  2072, 2705, 2504, 347,  767,  726,  111,  2795, 1245,
         421,  3274, 3421, 3330, 2587, 951,  1237, 2068, 2913, 2981, 848,  3463,
         711,  2058, 1685, 69,   339,  1549, 1932, 3417, 1781, 3070, 3500, 42,
         1170, 27,   1718, 2481, 2415, 3313, 2706, 345,  1034, 1763, 413,  132,
         2040, 1664, 3394, 2013, 2462, 1997, 1614, 3106, 1375, 1080, 3198, 2754,
         2657, 677,  2145, 167,  1401, 466,  1966, 58,   3105, 398,  2798, 1938,
         2287, 3304, 2862, 1177, 3485, 2138, 1320, 1104, 2744, 2655, 389,  1508,
         159,  3130, 1223, 3412, 2414, 2295, 2884, 388,  220,  468,  2828, 1062,
         1262, 1914, 2363, 1694, 599,  2399, 338,  2195, 1895, 1713, 3289, 435,
         2320, 2105, 1654, 3448, 3032, 1639, 1711, 1011, 1509, 545,  1330, 2518,
         2575, 823,  16,   399,  1412, 3180, 2993, 2266, 3402, 20,   1071, 2589,
         1688, 1758, 261,  2532, 565,  2200, 911,  2144, 3462, 1215, 885,  3477,
         1722, 2629, 2257, 33,   1254, 649,  2702, 1996, 1166, 658,  458,  1241,
         3156, 3074, 2189, 2831, 2861, 1404, 2635, 184,  2183, 1842, 1738, 1742,
         3359, 2169, 1207, 2440, 3377, 2718, 145,  1457, 529,  2977, 1344, 1476,
         2307, 557,  2747, 1377, 3186, 2697, 2559, 1392, 2665, 208,  1111, 2192,
         29,   252,  1435, 765,  3482, 808,  2304, 1420, 1728, 516,  353,  2285,
         2352, 3223, 3353, 2358, 1201, 3461, 61,   2213, 2774, 377,  32,   1123,
         1546, 2944, 1784, 1596, 856,  955,  1179, 2258, 47,   1623, 243,  623,
         755,  2328, 1124, 426,  247,  3336, 1615, 2681, 2660, 2536, 249,  2906,
         1646, 2678, 1426, 2405, 287,  940,  3231, 3179, 918,  579,  369,  644,
         2132, 2733, 1660, 1018, 1212, 2857, 1906, 675,  2004, 1317, 152,  1158,
         3222, 113,  2263, 1040, 601,  1620, 382,  3009, 3319, 2234, 365,  633,
         11,   256,  238,  1592, 3062, 3011, 1993, 1243, 1200, 2712, 1947, 1821,
         1043, 2860, 1492, 291,  1777, 1149, 2735, 444,  2825, 2568, 302,  1514,
         1462, 1931, 2123, 686,  866,  1649, 2238, 2020, 2325, 3047, 1871, 1925,
         2102, 1943, 3029, 618,  3175, 807,  2112, 498,  1611, 923,  1390, 1495,
         2284, 1480, 1371, 1568, 1363, 1628, 2677, 3260, 2241, 1005, 3259, 1248,
         2314, 364,  2554, 1999, 2026, 2146, 3501, 1025, 1971, 1537, 437,  1911,
         393,  893,  218,  3201, 2578, 713,  2865, 430,  136,  1407, 2471, 2056,
         1053, 3306, 2343, 210,  1959, 1577, 2550, 1150, 680,  2066, 1661, 1336,
         2059, 2792, 4,    746,  3123, 1387, 292,  1499, 3367, 96,   1460, 3491,
         875,  756,  2918, 896,  2761, 3268, 1300, 1899, 1956, 2876, 2302, 858,
         2533, 83,   3182, 1753, 259,  1328, 1417, 3178, 94,   3002, 2103, 3318,
         1766, 3218, 19,   578,  106,  1897, 3253, 1926, 1153, 2517, 3225, 1710,
         538,  1726, 2472, 1187, 2780, 2807, 2531, 2497, 1666, 1675, 2390, 2142,
         282,  1693, 3486, 417,  91,   2769, 2783, 1096, 3378, 1282, 3504, 1019,
         334,  737,  3215, 217,  248,  2522, 1105, 1308, 1169, 660,  989,  1854,
         114,  796,  1727, 1680, 1444, 3347, 307,  1314, 2805, 2435, 1252, 2104,
         2994, 3184, 2560, 1115, 2824, 2474, 2813, 1402, 2199, 380,  3108, 967,
         278,  2164, 3202, 3022, 2007, 1075, 614,  2799, 942,  1497, 1733, 108,
         900,  745,  1737, 3181, 1354, 2496, 1255, 1017, 277,  155,  1196, 2667,
         1581, 968,  2627, 2905, 1491, 3185, 1991, 170,  3292, 311,  3238, 1890,
         2402, 2403, 62,   2064, 810,  2888, 1513, 3069, 427,  354,  362,  2743,
         1645, 3422, 469,  3075, 3338, 1837, 2111, 447,  854,  669,  2535, 1315,
         2919, 98,   937,  2008, 3389, 283,  899,  90,   3396, 511,  3443, 1835,
         1736, 2551, 1236, 2896, 2941, 1202, 1703, 3444, 176,  1184, 891,  146,
         1279, 1068, 2885, 2434, 523,  1047, 1662, 1866, 2206, 2468, 445,  2875,
         3493, 1427, 2882, 1572, 2722, 1073, 2584, 284,  3296, 804,  2170, 2646,
         1216, 1199, 825,  378,  2043, 1044, 3196, 1978, 2821, 2840, 2997, 2492,
         586,  2675, 211,  336,  1839, 1225, 2196, 1891, 3135, 834,  2261, 3194,
         2649, 1469, 1690, 2220, 1376, 5,    1845, 297,  836,  1155, 1010, 415,
         2354, 3063, 629,  39,   2483, 203,  3203, 1006, 797,  2585, 2139, 1761,
         1922, 1214, 2097, 552,  1338, 2617, 1810, 3057, 1475, 2879, 2400, 53,
         394,  3419, 1224, 2332, 3221, 2555, 1256, 3293, 1544, 2543, 304,  1157,
         99,   811,  3209, 1625, 494,  273,  60,   535,  3110, 1232, 1636, 1455,
         1260, 2378, 1583, 568,  269,  2680, 1604, 189,  1585, 1963, 3430, 789,
         1917, 2874, 2694, 1103, 2547, 3091, 3165, 1405, 2300, 984,  983,  2923,
         2736, 1658, 798,  596,  1785, 1319, 682,  2513, 1148, 3357, 1716, 3391,
         695,  101,  265,  3307, 3510, 569,  226,  1461, 3317, 1359, 3406, 1962,
         571,  2924, 887,  1108, 3245, 432,  51,   2080, 2297, 861,  1276, 1348,
         1709, 124,  1802, 595,  839,  3392, 2382, 2603, 2,    330,  1228, 2544,
         1429, 158,  3232, 1634, 37,   3064, 3144, 1370, 1500, 619,  3227, 125,
         2907, 964,  2197, 2845, 2171, 3078, 127,  1373, 1958, 1458, 1466, 2027,
         343,  3261, 2820, 2742, 235,  2612, 355,  2392, 45,   2599, 131,  3038,
         2726, 2019, 2847, 1026, 1035, 95,   3087, 1788, 1358, 2245, 2834, 2126,
         1167, 725,  2637, 2850, 2553, 2823, 1973, 1814, 93,   115,  122,  1538,
         2464, 3262, 1482, 991,  902,  242,  1164, 819,  439,  749,  1642, 1840,
         3337, 3379, 2597, 2463, 611,  2121, 620,  1078, 1021, 300,  2454, 1312,
         859,  1803, 1774, 1533, 1112, 2654, 589,  2210, 1603, 279,  2779, 3499,
         2348, 3027, 3467, 2652, 3435, 610,  1192, 938,  1945, 110,  85,   2119,
         372,  1083, 434,  2005, 1730, 374,  1033, 2070, 1715, 3200, 409,  841,
         715,  2232, 732,  1650, 1045, 1940, 505,  2396, 1446, 82,   877,  1912,
         2255, 3442, 2816, 356,  734,  1948, 2253, 625,  3255, 1362, 2049, 306,
         2476, 2611, 2290, 785,  2443, 2174, 2897, 2243, 3199, 993,  2203, 2045,
         440,  2647, 3046, 920,  3474, 1582, 1864, 2270, 1743, 1046, 977,  782,
         3019, 3081, 901,  3300, 491,  1347, 2278, 684,  1268, 107,  879,  1030,
         3151, 1013, 43,   683,  2524, 2272, 1137, 3080, 3509, 1851, 3475, 1843,
         3382, 2441, 1027, 2979, 1039, 3457, 1159, 3172, 1235, 2446, 181,  1928,
         1050, 824,  1156, 2484, 1960, 2856, 613,  2384, 3279, 2282, 1264, 1074,
         3023, 1285, 2615, 436,  1954, 2107, 628,  864,  2360, 2208, 182,  1443,
         2217, 2379, 1844, 3026, 845,  123,  408,  2191, 2219, 1171, 939,  2696,
         2128, 2180, 2945, 997,  2176, 126,  2227, 3354, 2383, 2564, 671,  1765,
         2057, 3329, 1175, 2051, 1805, 852,  358,  1085, 1127, 685,  2388, 476,
         274,  1333, 359,  1378, 2294, 2036, 874,  1287, 2619, 2541, 2556, 1331,
         73,   1195, 337,  1992, 2638, 3454, 2990, 1110, 1850, 141,  2898, 2377,
         134,  526,  477,  3476, 233,  2983, 313,  2098, 1512, 1518, 2961, 2303,
         546,  1059, 2784, 3033, 1883, 2713, 2661, 1789, 38,   1125, 2558, 140,
         1292, 299,  850,  2310, 2386, 853,  2365, 1984, 119,  1203, 2002, 1220,
         3167, 178,  567,  3265, 1367, 1304, 2873, 998,  2242, 2335, 1055, 621,
         800,  2482, 2960, 3335, 2012, 2457, 2711, 889,  3425, 1698, 2344, 3155,
         202,  1798, 1804, 1790, 3502, 2448, 3093, 1952, 3153, 1751, 2084, 2751,
         2079, 236,  2996, 2108, 1619, 2946, 1221, 3365, 102,  1998, 3140, 3086,
         2437, 1341, 2731, 3089, 1118, 206,  1284, 2215, 594,  512,  1281, 482,
         1433, 2764, 3452, 747,  2185, 3283, 1907, 3284, 253,  116,  2039, 1345,
         700,  935,  2186, 2648, 897,  2562, 54,   530,  2673, 2212, 1674, 1182,
         2693, 2037, 3472, 3220, 1365, 2249, 2061, 3121, 3197, 1146, 2881, 2695,
         2381, 2710, 3100, 1889, 1902, 2969, 2239, 1534, 160,  3433, 1707, 386,
         3348, 921,  1918, 1008, 2590, 1552, 1454, 237,  2626, 461,  754,  2700,
         2500, 773,  2863, 3066, 1724, 1972, 827,  390,  692,  3161, 1413, 1309,
         112,  485,  2315, 1097, 3427, 3386, 1498, 49,   1739, 1369, 1900, 2809,
         3479, 2397, 1081, 288,  1410, 626,  2430, 2168, 1289, 3083, 1411, 3071,
         801,  173,  1250, 2709, 948,  909,  2741, 76,   1744, 3484, 3297, 2593,
         452,  1617, 3311, 3298, 1563, 2922, 1923, 1271, 2723, 216,  881,  587,
         3409, 2837, 142,  2796, 1800, 958,  1783, 2385, 1990, 3039, 17,   806,
         462,  1360, 1020, 2412, 351,  312,  3308, 3470, 3273, 1209, 2610, 721,
         1605, 910,  2512, 2194, 2753, 822,  308,  723,  3239, 3390, 361,  3052,
         2351, 1485, 177,  2292, 1286, 70,   2442, 1827, 1521, 2511, 1191, 2928,
         2193, 2636, 1667, 1704, 1441, 3352, 2797, 3358, 1665, 2883, 1258, 1409,
         665,  2247, 255,  2467, 716,  1815, 3126, 1833, 771,  2305, 81,   1967,
         2621, 727,  1558, 933,  1887, 2506, 2959, 1523, 648,  2393, 1970, 560,
         3053, 2746, 2925, 3263, 3478, 449,  1530, 3006, 3310, 837,  2854, 150,
         1009, 2844, 1757, 2409, 3321, 1114, 2538, 1613, 2853, 1438, 3490, 2986,
         943,  946,  1326, 3415, 1113, 1416, 973,  2633, 1799, 2401, 2256, 590,
         56,   2623, 384,  3252, 492,  75,   2024, 865,  533,  1910, 2336, 2010,
         1240, 1106, 642,  1136, 2115, 3325, 1502, 1607, 1559, 2972, 750,  214,
         1725, 1307, 1141, 3192, 326,  670,  3000, 10,   168,  2582, 2083, 583,
         3242, 375,  387,  3434, 3332, 164,  2459, 1414, 1624, 1787, 1557, 191,
         1342, 2999, 1980, 1116, 2438, 2613, 1449, 2503, 2353, 1172, 2586, 295,
         2932, 1562, 478,  768,  930,  1769, 3362, 400,  1253, 459,  2269, 696,
         221,  2461, 2224, 1610, 2275, 2346, 3436, 1547, 2230, 1012, 2135, 1297,
         2974, 2372, 949,  1442, 1122, 1989, 3295, 2507, 310,  2286, 2672, 3408,
         2794, 1504, 581,  2280, 2866, 1432, 679,  1275, 1496, 499,  826,  3138,
         1418, 2768, 3267, 2291, 2770, 410,  2374, 2034, 2973, 2035, 77,   2368,
         3240, 2009, 652,  156,  638,  2453, 3157, 1635, 2408, 1205, 1299, 2967,
         883,  730,  18,   340,  2099, 794,  2431, 1000, 3364, 830,  956,  518,
         1274, 2908, 3059, 2053, 1955, 1231, 2444, 631,  3129, 2992, 180,  397,
         1278, 2730, 223,  26,   2607, 1516, 1249, 1901, 736,  1527, 1210, 1856,
         674,  3072, 1995, 2625, 50,   1920, 2871, 673,  3371, 2509, 1824, 470,
         532,  1659, 404,  3453, 3460, 886,  1874, 59,   1875, 2333, 2915, 1542,
         2855, 405,  2380, 3166, 2155, 2473, 1323, 3211, 490,  3372, 3324, 2154,
         2988, 3139, 2591, 2153, 2561, 2022, 550,  2530, 88,   1554, 2274, 576,
         163,  2017, 3018, 1927, 2868, 3085, 1692, 1968, 3269, 2849, 635,  2645,
         286,  2822, 3393, 285,  316,  741,  2964, 3483, 1058, 525,  2345, 3004,
         13,   3188, 266,  2791, 1151, 186,  3082, 1065, 1826, 740,  2236, 1884,
         3360, 1473, 2732, 961,  3125, 3007, 2231, 1398, 2413, 3266, 1273, 2364,
         2576, 1133, 655,  1388, 757,  965,  2602, 215,  742,  2406, 2719, 2318,
         1778, 1526, 488,  2548, 1189, 1832, 2367, 2814, 1587, 892,  2644, 144,
         1705, 2893, 605,  3368, 706,  2728, 1622, 630,  3206, 1290, 3159, 573,
         1994, 1969, 1329, 513,  1904, 3116, 978,  1903, 908,  1335, 2679, 1145,
         1717, 922,  2082, 2445, 780,  2094, 1229, 1540, 424,  2676, 760,  1168,
         1099, 895,  474,  493,  784,  2074, 1565, 1752, 3205, 1860, 975,  944,
         835,  2031, 3271, 1316, 1356, 1811, 1588, 2487, 2214, 632,  3388, 2306,
         2934, 2642, 3301, 2921, 1868, 2826, 2172, 2566, 402,  643,  2838, 1754,
         1888, 6,    1173, 2267, 1048, 2910, 591,  3312, 562,  507,  2767, 52,
         1817, 2222, 1391, 1893, 3045, 572,  2776, 714,  1691, 637,  2787, 3230,
         2540, 120,  3024, 2938, 1445, 542,  2148, 1197, 332,  812,  2424, 547,
         1939, 603,  3124, 350,  3366, 1436, 1424, 2038, 1321, 699,  1689, 2319,
         2542, 3050, 1812, 2971, 1490, 1095, 2046, 1061, 129,  3247, 1679, 244,
         3210, 2579, 582,  1036, 1042, 1204, 1575, 2737, 3104, 420,  2595, 3235,
         501,  1848, 2143, 3174, 2851, 1270, 3356, 1721, 1867, 1406, 1334, 2640,
         577,  2073, 3176, 904,  1723, 3136, 2273, 2848, 915,  2198, 1602, 666,
         2931, 927,  231,  2939, 371,  2110, 720,  941,  1782, 1618, 1121, 2852,
         2717, 1395, 1687, 204,  3020, 272,  1425, 2366, 913,  1852, 80,   803,
         2618, 3447, 349,  2573, 446,  1340, 667}));

    REQUIRE(S->size() == static_cast<uint64_t>(64561751654400));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "027",
                          "perm. Held group (order 4030387200)",
                          "[no-valgrind][quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 2059;
    auto             S  = new SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S->add_generator(Perm(
        {0,    374,  708,  1312, 1036, 1151, 1366, 1307, 1571, 1402, 236,  1438,
         363,  590,  288,  1372, 38,   1886, 816,  1953, 1582, 1109, 525,  124,
         24,   1218, 26,   1795, 499,  1574, 802,  31,   1040, 117,  1643, 35,
         1344, 1559, 16,   180,  1183, 979,  1819, 152,  44,   1161, 1500, 332,
         1131, 946,  1599, 51,   985,  1428, 54,   55,   401,  1661, 1351, 272,
         692,  120,  1545, 1221, 1211, 1423, 66,   318,  1536, 1722, 119,  790,
         407,  2024, 146,  2045, 937,  424,  339,  1395, 2056, 568,  1111, 444,
         746,  510,  1123, 2058, 1810, 550,  116,  103,  1009, 902,  632,  1799,
         1308, 1910, 1034, 1706, 693,  101,  922,  91,   104,  571,  2031, 714,
         1447, 1385, 1977, 409,  1220, 1456, 1094, 212,  90,   33,   1922, 70,
         61,   971,  769,  387,  23,   1060, 1057, 480,  1628, 398,  130,  1477,
         1326, 1166, 1974, 1272, 1324, 1295, 490,  291,  1216, 1389, 822,  306,
         552,  1301, 74,   1957, 1401, 149,  1407, 766,  43,   153,  1000, 656,
         638,  157,  158,  943,  677,  232,  162,  1031, 425,  195,  1403, 285,
         219,  311,  657,  1289, 852,  1518, 587,  1159, 1350, 1180, 1041, 923,
         39,   1334, 1735, 399,  1278, 1273, 1498, 488,  908,  1770, 537,  1941,
         595,  1404, 617,  165,  686,  1845, 1924, 939,  1112, 706,  579,  1262,
         749,  789,  775,  843,  1826, 1675, 1900, 1776, 115,  213,  966,  896,
         1673, 1331, 1437, 168,  1139, 1472, 494,  1640, 2008, 995,  982,  1086,
         1766, 800,  565,  231,  161,  853,  1551, 808,  10,   237,  1043, 1240,
         551,  553,  1305, 1069, 1641, 811,  246,  2051, 596,  249,  1349, 1408,
         1593, 1380, 1065, 451,  476,  1915, 1597, 259,  1113, 1225, 262,  457,
         709,  554,  1572, 1846, 447,  1748, 1300, 614,  59,   890,  1125, 1507,
         276,  1674, 1785, 1609, 308,  1635, 607,  815,  1682, 167,  427,  287,
         14,   2043, 1843, 139,  756,  810,  1345, 1794, 1524, 1587, 911,  1660,
         1358, 975,  1771, 1368, 304,  886,  143,  1008, 280,  705,  1194, 169,
         1379, 410,  1269, 757,  1037, 1454, 67,   1501, 702,  859,  731,  1642,
         813,  1752, 1064, 1557, 373,  778,  527,  539,  47,   1657, 2027, 1237,
         470,  1870, 1616, 78,   1023, 1178, 1624, 1014, 1081, 345,  1420, 1050,
         1063, 1699, 1035, 654,  406,  1242, 487,  1450, 2013, 1526, 700,  976,
         2041, 404,  1991, 12,   1634, 1669, 366,  683,  368,  369,  446,  1820,
         2023, 328,  1,    824,  1999, 473,  474,  676,  1306, 1774, 1769, 509,
         1714, 1589, 1595, 123,  1979, 840,  412,  1936, 1554, 393,  1523, 1731,
         695,  1598, 129,  183,  400,  56,   1867, 1981, 361,  1443, 352,  72,
         1662, 111,  313,  669,  390,  1659, 912,  415,  416,  1110, 1101, 534,
         1762, 1441, 628,  1383, 77,   164,  1778, 286,  1357, 1003, 434,  1683,
         989,  485,  430,  888,  1865, 1011, 849,  1916, 1478, 906,  2022, 1013,
         83,   1746, 370,  268,  1534, 1586, 1962, 255,  452,  1996, 1410, 1566,
         1458, 263,  1744, 1029, 1012, 897,  806,  1883, 1955, 1457, 466,  1836,
         1747, 1779, 336,  1837, 1839, 377,  378,  1116, 256,  477,  2020, 1266,
         127,  481,  1878, 1937, 1603, 433,  1824, 354,  187,  1784, 138,  1756,
         1627, 759,  222,  1146, 1189, 667,  1859, 28,   861,  1975, 660,  503,
         566,  1068, 1286, 1834, 1644, 383,  85,   729,  1583, 1448, 515,  514,
         1920, 581,  578,  1569, 1073, 1104, 522,  925,  1653, 22,   881,  330,
         1804, 1907, 1021, 1633, 689,  1758, 419,  872,  1701, 190,  1973, 331,
         592,  1816, 1128, 1088, 622,  1154, 1855, 580,  1892, 1103, 89,   240,
         144,  241,  265,  901,  557,  556,  558,  1963, 972,  629,  1096, 1198,
         1179, 230,  504,  1532, 81,   981,  1600, 105,  1995, 740,  1118, 1321,
         1475, 776,  518,  202,  547,  517,  1754, 1230, 904,  684,  600,  174,
         588,  589,  13,   1188, 540,  1719, 987,  192,  248,  1939, 704,  1209,
         586,  1783, 764,  603,  1315, 1611, 606,  282,  1905, 1788, 2029, 611,
         1540, 1390, 271,  619,  715,  194,  2036, 615,  1740, 621,  544,  623,
         1680, 625,  845,  1235, 422,  561,  1544, 1596, 94,   1020, 1303, 2046,
         1467, 1224, 156,  894,  1364, 1550, 1016, 1274, 1736, 919,  1543, 1718,
         648,  1330, 1253, 1002, 798,  1157, 351,  658,  155,  170,  655,  707,
         502,  661,  732,  809,  1208, 1347, 1044, 497,  1849, 411,  1181, 671,
         672,  1340, 851,  1832, 379,  160,  857,  774,  1797, 1019, 1909, 367,
         585,  685,  196,  1511, 1913, 532,  1369, 1562, 60,   100,  1429, 396,
         1793, 1455, 984,  826,  358,  1869, 320,  1860, 598,  309,  201,  659,
         2,    264,  1099, 1091, 1811, 818,  107,  616,  1153, 1879, 1847, 1292,
         1445, 1509, 1647, 948,  1809, 1415, 726,  1813, 1573, 511,  1434, 322,
         662,  959,  1048, 735,  1451, 1728, 1392, 739,  573,  1531, 1186, 1267,
         1932, 1926, 84,   1129, 1985, 204,  1397, 1055, 1333, 753,  1688, 755,
         292,  315,  1137, 493,  864,  1901, 1030, 1238, 602,  2050, 151,  1474,
         1945, 122,  1512, 1651, 1430, 773,  679,  206,  577,  1652, 329,  1614,
         910,  1329, 782,  1923, 784,  1033, 786,  1906, 788,  205,  71,   791,
         1142, 1084, 1986, 795,  834,  1233, 652,  1751, 229,  1182, 30,   1440,
         924,  1460, 462,  945,  235,  663,  293,  245,  812,  324,  1670, 283,
         18,   1650, 713,  1948, 991,  821,  142,  1414, 375,  1246, 699,  1763,
         828,  829,  973,  920,  1169, 854,  796,  933,  836,  1245, 1895, 1270,
         389,  1664, 1463, 207,  1689, 626,  929,  1960, 1537, 438,  1538, 674,
         172,  233,  833,  855,  1122, 678,  1772, 321,  1254, 500,  1723, 1298,
         760,  1730, 2030, 1519, 998,  1249, 1817, 1823, 535,  873,  1490, 2009,
         882,  934,  1320, 1742, 1409, 526,  876,  1339, 1965, 1265, 305,  1418,
         435,  1155, 273,  1812, 1684, 893,  639,  1726, 215,  461,  935,  1281,
         1177, 555,  93,   903,  584,  1782, 441,  1854, 188,  1231, 780,  298,
         414,  1453, 2052, 1844, 1446, 1127, 1332, 645,  831,  1681, 102,  179,
         804,  523,  1863, 1842, 928,  846,  1570, 1059, 2001, 835,  877,  898,
         1980, 76,   1958, 199,  1257, 1090, 1356, 159,  1929, 807,  49,   2034,
         723,  1287, 950,  1359, 1902, 2047, 1677, 1071, 1607, 1904, 1092, 733,
         1489, 1934, 988,  2016, 964,  1089, 214,  967,  1138, 1919, 1163, 121,
         560,  830,  1781, 301,  359,  977,  1696, 41,   1602, 569,  226,  2042,
         698,  52,   1175, 594,  962,  432,  2033, 820,  992,  1825, 994,  225,
         1360, 1737, 868,  1115, 154,  1581, 651,  429,  1004, 1005, 1061, 1535,
         307,  92,   2014, 437,  460,  443,  343,  1713, 642,  1017, 1051, 681,
         633,  530,  1285, 340,  1251, 2003, 1806, 1406, 1136, 459,  762,  163,
         1821, 785,  98,   350,  4,    316,  1579, 1992, 32,   178,  1695, 238,
         666,  1830, 1342, 1297, 734,  1851, 347,  1018, 1506, 1394, 1528, 751,
         1432, 126,  1687, 931,  125,  1006, 1712, 348,  326,  254,  1066, 1067,
         505,  243,  1172, 955,  1950, 520,  1196, 1283, 1631, 1427, 1575, 1911,
         1250, 344,  1705, 1818, 793,  1119, 227,  1590, 543,  965,  941,  711,
         958,  1093, 114,  1261, 562,  1882, 1120, 710,  2044, 418,  1102, 549,
         521,  1741, 1610, 1263, 1276, 21,   417,  82,   200,  260,  2057, 999,
         475,  1717, 574,  1085, 1098, 1124, 856,  86,   1121, 274,  1464, 917,
         542,  747,  1626, 48,   1367, 1725, 1656, 1876, 1028, 758,  968,  220,
         1140, 1792, 792,  1658, 1343, 1508, 495,  1984, 1439, 1887, 1828, 5,
         1775, 716,  545,  889,  1522, 653,  1555, 175,  1436, 45,   1621, 970,
         1993, 1807, 133,  1709, 1168, 832,  1654, 1697, 1070, 1327, 1502, 986,
         1176, 900,  341,  564,  177,  670,  801,  40,   1734, 1604, 742,  1314,
         591,  496,  1484, 1707, 1768, 2015, 310,  1229, 1074, 1790, 563,  1693,
         1773, 1966, 2048, 1203, 1493, 1205, 1206, 1341, 664,  599,  1558, 64,
         1874, 1354, 1938, 1215, 140,  1217, 25,   1750, 112,  63,   1852, 1223,
         637,  261,  1226, 1594, 2004, 1195, 583,  909,  1858, 797,  1258, 627,
         1236, 335,  763,  1239, 239,  1488, 353,  1243, 1884, 837,  825,  1749,
         1391, 869,  1080, 1024, 1252, 650,  860,  1400, 1517, 940,  1234, 1759,
         1260, 1095, 203,  1107, 1319, 885,  479,  743,  1492, 314,  839,  1944,
         135,  185,  643,  1275, 1108, 2005, 184,  1580, 1363, 899,  1989, 1075,
         1831, 1022, 506,  949,  1336, 171,  1577, 1291, 719,  1399, 1676, 137,
         1412, 1047, 863,  1648, 270,  145,  1462, 634,  2035, 242,  380,  7,
         96,   1309, 1310, 1564, 3,    1803, 1187, 604,  1373, 1850, 1796, 1264,
         878,  575,  1592, 1623, 136,  1724, 132,  1173, 1838, 781,  649,  217,
         918,  752,  181,  1335, 1288, 1703, 1925, 883,  673,  1207, 1046, 1144,
         36,   294,  1721, 665,  1361, 250,  176,  58,   2010, 1903, 1213, 1617,
         942,  428,  300,  951,  996,  1348, 1384, 1280, 640,  1994, 6,    1132,
         303,  690,  1370, 1767, 15,   1316, 1630, 1503, 1396, 1377, 1619, 312,
         253,  1546, 1388, 423,  1362, 109,  1618, 1829, 1382, 141,  613,  1248,
         738,  1416, 1053, 79,   1376, 750,  2006, 1293, 1255, 148,  9,    166,
         193,  1888, 1027, 150,  251,  880,  454,  1411, 1296, 1959, 823,  725,
         1393, 1868, 887,  1608, 346,  1997, 1422, 65,   1636, 1425, 1969, 1077,
         53,   694,  772,  1889, 1056, 1893, 730,  1872, 1160, 218,  11,   1148,
         803,  421,  1442, 405,  1576, 720,  916,  108,  513,  1615, 355,  736,
         2000, 913,  317,  697,  113,  465,  456,  1542, 805,  1466, 1302, 842,
         1126, 1520, 1461, 636,  1612, 1971, 1470, 1764, 221,  1961, 767,  576,
         1708, 131,  440,  1970, 1760, 1481, 1814, 1483, 1190, 2049, 1486, 1496,
         1241, 960,  874,  1491, 1268, 1204, 1632, 1848, 1487, 1857, 186,  2012,
         46,   319,  1174, 1375, 1533, 1505, 1052, 275,  1145, 721,  1983, 687,
         770,  1908, 1873, 1548, 1917, 1256, 173,  867,  1465, 1885, 1156, 394,
         296,  1525, 357,  1527, 1054, 1568, 2055, 741,  567,  1504, 448,  1007,
         68,   848,  850,  1930, 612,  1646, 1459, 646,  630,  62,   1381, 1553,
         1515, 1668, 641,  234,  1552, 1547, 392,  1158, 1556, 327,  1210, 37,
         1710, 1987, 691,  1791, 1311, 1565, 455,  1686, 1529, 519,  930,  8,
         266,  728,  29,   1078, 1444, 1290, 1700, 1038, 1279, 1001, 20,   512,
         1685, 1585, 449,  297,  1588, 385,  1087, 2018, 1322, 252,  1227, 386,
         631,  258,  397,  50,   570,  2032, 980,  484,  1185, 1745, 1606, 956,
         1419, 279,  1106, 605,  1468, 1921, 779,  1449, 338,  1355, 1386, 1378,
         2002, 1162, 2007, 1323, 342,  1732, 1130, 492,  128,  2053, 1374, 1076,
         1494, 531,  364,  281,  1424, 1912, 1733, 1639, 223,  244,  323,  34,
         508,  1645, 1541, 722,  1299, 1757, 817,  771,  777,  524,  1170, 1942,
         1134, 333,  1143, 413,  299,  57,   408,  2038, 841,  1765, 1729, 1667,
         1549, 365,  814,  2017, 1672, 216,  277,  209,  1294, 954,  1761, 1897,
         624,  921,  284,  431,  892,  1584, 1567, 1058, 754,  844,  1890, 1739,
         1952, 1199, 1877, 1042, 978,  1171, 1727, 349,  1578, 536,  2025, 1337,
         1949, 1082, 99,   1191, 1476, 1167, 1560, 1978, 1062, 1015, 384,  1720,
         1943, 1117, 647,  593,  1715, 1346, 69,   862,  1325, 1133, 895,  1698,
         737,  1666, 865,  395,  1625, 1638, 1184, 182,  644,  997,  1743, 1691,
         620,  1105, 879,  1738, 458,  1605, 445,  468,  269,  1247, 1219, 799,
         325,  2028, 582,  1755, 491,  1649, 533,  1259, 1480, 1678, 420,  827,
         1471, 1665, 228,  1371, 1192, 382,  189,  302,  858,  1200, 381,  1152,
         211,  1833, 426,  469,  1780, 974,  905,  601,  489,  278,  1786, 1802,
         609,  2011, 1197, 1563, 1141, 696,  295,  27,   1318, 680,  1798, 95,
         1808, 1951, 1787, 1313, 528,  2039, 1026, 1165, 1800, 724,  88,   712,
         891,  727,  1482, 1815, 541,  870,  1083, 42,   371,  1032, 1954, 871,
         486,  993,  208,  1827, 1150, 1387, 1045, 1284, 675,  1777, 507,  1881,
         467,  471,  1328, 472,  1968, 1998, 927,  290,  915,  197,  267,  718,
         1495, 668,  1317, 1049, 1222, 1862, 907,  546,  1856, 1497, 1232, 498,
         703,  1875, 1853, 926,  1927, 436,  2021, 402,  1417, 701,  337,  1871,
         1435, 1514, 1212, 1861, 1135, 1694, 482,  717,  1898, 1835, 1097, 463,
         1244, 1521, 17,   1149, 1405, 1431, 1690, 1946, 548,  1433, 1894, 838,
         1896, 1679, 1880, 1982, 210,  761,  952,  1353, 957,  608,  787,  529,
         1513, 682,  97,   1079, 1637, 688,  1914, 257,  439,  1516, 1918, 969,
         516,  1613, 118,  783,  198,  1338, 745,  1864, 1928, 944,  1539, 1990,
         744,  1964, 961,  1935, 391,  483,  1214, 597,  1988, 191,  1655, 1716,
         1271, 768,  1891, 1972, 819,  1704, 1072, 1801, 1692, 19,   1822, 464,
         1956, 147,  938,  1413, 847,  1473, 450,  559,  1933, 884,  1201, 1967,
         1840, 1426, 1479, 1469, 1947, 538,  134,  501,  2054, 110,  1711, 388,
         936,  403,  1899, 1510, 1147, 748,  794,  1561, 1940, 1282, 1931, 362,
         1039, 1164, 1365, 572,  453,  1421, 1841, 376,  1452, 932,  1620, 1025,
         1228, 1277, 1398, 1622, 224,  875,  1352, 1789, 1499, 356,  1010, 1193,
         963,  1671, 1591, 2019, 478,  1866, 442,  372,  73,   1702, 2026, 334,
         1753, 610,  866,  106,  1601, 990,  947,  1304, 618,  2037, 1663, 1805,
         2040, 360,  983,  289,  1100, 75,   635,  953,  1202, 1485, 765,  247,
         914,  1629, 1976, 1530, 80,   1114, 87}));

    S->add_generator(Perm(
        {0,    502,  1182, 1390, 34,   2015, 1815, 1118, 395,  1677, 291,  1453,
         1711, 1737, 1432, 681,  1600, 339,  1556, 1001, 651,  532,  230,  1171,
         226,  1055, 1099, 1338, 1553, 191,  1906, 643,  698,  189,  436,  727,
         717,  1368, 697,  1560, 59,   1604, 1176, 1662, 420,  363,  1800, 1164,
         1047, 1921, 231,  2044, 1841, 39,   528,  2019, 1480, 394,  571,  434,
         2040, 1128, 258,  425,  1110, 1498, 1740, 892,  1594, 215,  1392, 468,
         2001, 1651, 929,  106,  855,  849,  1947, 1489, 1961, 1144, 1255, 1201,
         1165, 888,  1088, 1833, 771,  1232, 850,  1419, 721,  6,    1513, 2012,
         1380, 757,  1347, 1409, 265,  861,  846,  1431, 1598, 1321, 562,  1140,
         1003, 1660, 705,  1526, 346,  863,  1454, 599,  1706, 1297, 776,  1373,
         960,  1019, 1583, 1568, 1247, 992,  1388, 1673, 1832, 999,  554,  1658,
         334,  920,  1930, 1750, 1123, 1825, 637,  726,  682,  234,  1139, 2023,
         1713, 984,  983,  1886, 505,  2057, 412,  1446, 177,  2037, 1913, 827,
         485,  379,  331,  1458, 86,   1037, 793,  287,  1331, 1914, 1149, 1849,
         1644, 1326, 1316, 351,  1620, 269,  642,  222,  1127, 458,  736,  796,
         1228, 1922, 2025, 1442, 1354, 1224, 1163, 348,  433,  1138, 1854, 1335,
         56,   197,  712,  466,  401,  604,  972,  1716, 1124, 867,  810,  221,
         277,  1021, 445,  688,  364,  908,  375,  1985, 1211, 1734, 790,  145,
         560,  61,   877,  868,  512,  426,  661,  1772, 5,    1299, 883,  678,
         1801, 1156, 1580, 1945, 1426, 308,  349,  2032, 405,  1680, 327,  1812,
         989,  695,  1960, 210,  1393, 144,  151,  1756, 89,   1805, 782,  1397,
         283,  211,  1602, 1809, 438,  161,  501,  1100, 465,  19,   940,  223,
         887,  1076, 365,  722,  1532, 4,    748,  1507, 1052, 212,  60,   1018,
         889,  1046, 359,  525,  1864, 1314, 173,  309,  55,   510,  64,   2006,
         201,  1362, 1675, 2000, 1533, 97,   2033, 930,  1254, 1757, 116,  792,
         1577, 624,  980,  641,  1523, 170,  966,  655,  2014, 1208, 911,  324,
         1479, 1234, 1693, 1529, 1642, 1020, 1488, 988,  1610, 1850, 96,   1586,
         679,  1381, 129,  662,  1717, 1300, 1767, 977,  864,  648,  1764, 787,
         866,  2052, 1994, 167,  1951, 1878, 88,   1531, 437,  1481, 660,  1719,
         1510, 1048, 1796, 315,  2003, 766,  1436, 1179, 69,   987,  1206, 675,
         328,  1078, 1592, 1785, 1936, 1096, 1011, 928,  917,  1999, 1174, 1685,
         1573, 558,  175,  875,  107,  1962, 1636, 486,  805,  1646, 1273, 1525,
         1285, 1463, 1896, 559,  372,  94,   1274, 1227, 900,  8,    785,  914,
         761,  101,  1167, 480,  1315, 244,  768,  1226, 279,  22,   1325, 169,
         625,  352,  1293, 1996, 517,  853,  1916, 1681, 1933, 1039, 1589, 1474,
         1073, 1383, 946,  602,  707,  1406, 1909, 1345, 730,  452,  1279, 778,
         1495, 1026, 1146, 1890, 1016, 718,  1322, 652,  36,   90,   209,  1195,
         1015, 1821, 1484, 811,  936,  1771, 941,  186,  1923, 1748, 1967, 1198,
         1246, 1085, 1569, 408,  1998, 909,  1664, 1855, 2028, 589,  673,  1090,
         281,  2020, 497,  622,  527,  35,   148,  341,  1983, 842,  1218, 1672,
         820,  1007, 1305, 1931, 1449, 1537, 1749, 1455, 1976, 310,  1402, 2050,
         48,   567,  720,  1363, 1520, 20,   1248, 1486, 1473, 136,  696,  594,
         274,  1548, 52,   1301, 1584, 163,  373,  329,  640,  1708, 239,  1133,
         1013, 1829, 1281, 1000, 1710, 382,  1075, 1501, 692,  1384, 1425, 1289,
         303,  804,  2009, 1089, 1797, 1081, 1942, 1625, 1310, 1839, 1181, 896,
         1408, 700,  38,   511,  389,  2042, 1744, 1212, 1151, 1786, 353,  733,
         390,  1808, 98,   1389, 1576, 1816, 1667, 1822, 350,  1064, 667,  576,
         1527, 1837, 1077, 1278, 1282, 1574, 1170, 1670, 1205, 1521, 1676, 852,
         1956, 1440, 1542, 1776, 1563, 1465, 813,  561,  317,  2027, 66,   1623,
         784,  1445, 474,  1752, 1969, 503,  355,  122,  803,  278,  1701, 153,
         1851, 1056, 99,   1698, 422,  1260, 374,  522,  1334, 1342, 388,  423,
         838,  1250, 266,  1308, 1618, 2043, 1493, 1095, 653,  1319, 1550, 775,
         1443, 612,  268,  540,  548,  417,  1391, 461,  70,   15,   666,  552,
         737,  1491, 955,  1612, 2035, 1312, 10,   1210, 1894, 1230, 879,  854,
         1150, 49,   1369, 1413, 959,  1014, 1596, 2056, 1547, 1251, 1209, 1173,
         1367, 1652, 570,  860,  1337, 1462, 1826, 263,  333,  823,  1038, 683,
         1404, 839,  1333, 523,  658,  1223, 816,  781,  1558, 1692, 947,  257,
         1030, 577,  791,  1120, 956,  93,   740,  81,   1104, 993,  1236, 1044,
         1824, 126,  225,  756,  2022, 919,  62,   1153, 859,  699,  1330, 1633,
         1819, 459,  1059, 290,  1606, 524,  456,  1400, 1736, 157,  165,  1572,
         397,  102,  63,   618,  1485, 755,  1973, 672,  347,  1524, 245,  1060,
         1712, 1974, 1564, 1997, 454,  155,  220,  71,   1554, 716,  1323, 1733,
         788,  1196, 1901, 159,  1769, 489,  2030, 1460, 416,  168,  1810, 406,
         181,  537,  1634, 654,  899,  76,   1448, 1653, 467,  976,  2045, 635,
         969,  1512, 1788, 742,  115,  297,  890,  227,  694,  1605, 1907, 1948,
         1370, 472,  124,  1626, 1640, 1927, 392,  1101, 957,  1917, 1611, 809,
         25,   1694, 1497, 619,  134,  858,  1351, 442,  1478, 1134, 1517, 750,
         569,  738,  1561, 1420, 647,  1866, 1054, 710,  924,  996,  270,  1249,
         1496, 37,   1111, 84,   286,  1306, 1437, 342,  1641, 1804, 1058, 381,
         256,  362,  295,  1929, 817,  1063, 1794, 1022, 546,  325,  1043, 1217,
         1707, 1459, 553,  668,  252,  194,  1519, 638,  693,  1977, 1803, 610,
         418,  851,  304,  1450, 2016, 605,  1723, 1657, 79,   680,  753,  547,
         1659, 137,  188,  1545, 1588, 1467, 1530, 1551, 1650, 739,  1169, 847,
         1424, 1984, 255,  1121, 616,  1728, 1162, 774,  232,  1847, 318,  28,
         514,  183,  958,  1029, 118,  615,  1745, 2047, 476,  103,  3,    1503,
         419,  1259, 1132, 247,  288,  332,  1566, 1720, 1500, 366,  336,  903,
         57,   1755, 492,  1097, 905,  926,  1357, 1375, 184,  1079, 1057, 1966,
         1880, 1143, 1401, 541,  1200, 1830, 1957, 451,  873,  731,  1562, 1107,
         687,  764,  429,  1570, 259,  806,  1193, 253,  1353, 250,  961,  415,
         981,  789,  1028, 1470, 140,  54,   747,  243,  1619, 758,  1207, 1899,
         1702, 1970, 1242, 1240, 1214, 487,  1341, 1700, 1935, 1597, 441,  1950,
         176,  484,  130,  321,  1040, 550,  267,  1069, 199,  1336, 1082, 970,
         166,  1982, 87,   1061, 1438, 2031, 824,  1539, 586,  991,  1122, 1838,
         1350, 1687, 1941, 1688, 837,  587,  1978, 1051, 1853, 322,  818,  1035,
         583,  1202, 447,  1643, 1607, 262,  874,  1621, 282,  1964, 219,  725,
         865,  1760, 224,  1879, 1002, 1106, 1725, 109,  1466, 962,  1091, 1870,
         1565, 927,  398,  1843, 1609, 1313, 1943, 421,  754,  1924, 95,   709,
         1900, 1461, 1405, 393,  462,  1514, 734,  504,  152,  296,  1276, 1682,
         711,  1476, 85,   1256, 202,  1502, 592,  1231, 1070, 708,  1877, 11,
         1823, 1614, 403,  2024, 685,  1304, 198,  822,  591,  565,  614,  233,
         965,  1203, 1535, 719,  200,  1714, 728,  285,  1175, 1991, 114,  1791,
         500,  1421, 520,  963,  1427, 1585, 613,  1065, 1656, 1009, 1516, 2054,
         1593, 1903, 1630, 1355, 1789, 2048, 2018, 131,  190,  67,   407,  542,
         187,  1434, 1509, 893,  1166, 1186, 1852, 1483, 1639, 1902, 273,  80,
         1544, 1067, 1988, 400,  229,  1417, 1187, 367,  1204, 323,  596,  1032,
         314,  767,  1915, 402,  1131, 534,  1066, 1050, 154,  356,  280,  477,
         845,  293,  1045, 1986, 1145, 1552, 922,  23,   1845, 404,  912,  1284,
         1142, 1889, 119,  1414, 536,  43,   2026, 1754, 1487, 656,  765,  645,
         1587, 83,   1012, 455,  1875, 12,   1781, 1290, 1868, 1441, 1177, 1678,
         431,  1245, 1873, 1946, 915,  292,  1993, 471,  1086, 948,  593,  1940,
         1428, 646,  1908, 556,  1158, 358,  1989, 24,   1184, 1631, 112,  690,
         1715, 533,  572,  579,  217,  411,  312,  248,  1339, 1980, 490,  1937,
         783,  1735, 1008, 812,  530,  428,  1239, 598,  836,  913,  629,  1773,
         1113, 1356, 630,  160,  1221, 254,  1365, 1429, 597,  945,  1885, 1189,
         178,  300,  535,  872,  531,  378,  1328, 659,  1559, 1632, 1378, 639,
         1581, 1679, 870,  272,  1818, 1663, 1763, 82,   677,  862,  2039, 1192,
         1787, 1233, 1747, 470,  933,  582,  235,  469,  631,  1792, 147,  1366,
         1739, 1435, 724,  706,  891,  311,  1802, 368,  780,  299,  1456, 228,
         1098, 1590, 1115, 751,  1955, 1778, 482,  319,  1093, 1102, 1859, 240,
         246,  830,  954,  1541, 1528, 1469, 932,  1806, 1258, 515,  918,  1511,
         1920, 800,  330,  669,  825,  1540, 876,  338,  2010, 58,   1836, 275,
         1482, 1398, 1965, 384,  424,  607,  125,  772,  383,  1159, 1385, 1887,
         1746, 294,  901,  513,  1318, 623,  242,  986,  921,  1033, 1575, 1452,
         1844, 674,  544,  1266, 1793, 13,   1237, 519,  1271, 1954, 1697, 31,
         968,  551,  203,  1758, 498,  448,  1215, 1995, 1952, 1858, 1172, 16,
         446,  495,  1332, 313,  1949, 1418, 354,  1148, 1298, 601,  518,  1665,
         2005, 564,  1777, 1883, 1303, 1103, 1348, 934,  743,  807,  1307, 1817,
         545,  1624, 1477, 1092, 1669, 2036, 1023, 139,  938,  2007, 1774, 44,
         937,  1324, 1027, 2008, 1291, 1415, 1690, 1382, 2041, 626,  449,  361,
         127,  1848, 834,  316,  1302, 732,  1761, 1881, 46,   664,  1157, 573,
         41,   357,  74,   1084, 670,  1840, 1119, 994,  1857, 1329, 971,  770,
         1112, 621,  1416, 649,  884,  206,  1168, 1534, 1721, 1696, 1683, 113,
         575,  1464, 1807, 943,  606,  671,  453,  1287, 463,  773,  414,  50,
         2004, 978,  1241, 1691, 302,  1699, 2,    702,  1724, 65,   1925, 305,
         214,  475,  1616, 998,  7,    1374, 42,   345,  1349, 386,  746,  1882,
         1422, 1244, 1835, 1705, 665,  2013, 636,  526,  493,  284,  1703, 1129,
         1346, 2034, 1006, 326,  14,   432,  1444, 30,   439,  1394, 1229, 1617,
         478,  435,  1918, 1990, 953,  1191, 967,  1645, 271,  1360, 1268, 142,
         931,  427,  713,  779,  121,  387,  491,  840,  1674, 1895, 72,   1267,
         1615, 1340, 574,  1654, 1396, 91,   1126, 1072, 1518, 298,  494,  1010,
         1379, 608,  1579, 2021, 45,   982,  627,  808,  1183, 1263, 1031, 885,
         9,    413,  343,  995,  1622, 1738, 1668, 762,  2046, 488,  952,  676,
         1053, 1876, 205,  1295, 164,  581,  814,  794,  430,  1846, 172,  1934,
         644,  1872, 1981, 180,  1904, 174,  105,  997,  1555, 218,  1105, 213,
         869,  1262, 744,  1938, 769,  499,  1975, 1972, 376,  1567, 1433, 1430,
         132,  1504, 1213, 1371, 1125, 1726, 1261, 1549, 185,  1666, 1376, 595,
         1926, 1197, 320,  942,  241,  1471, 1557, 301,  2011, 1155, 1071, 1280,
         895,  529,  1506, 251,  1898, 684,  907,  543,  1468, 1790, 1919, 657,
         516,  538,  1049, 1704, 609,  2017, 620,  1578, 1765, 763,  1412, 2029,
         752,  1689, 973,  110,  714,  1135, 1784, 555,  443,  1130, 949,  1628,
         557,  1582, 410,  444,  1439, 123,  1411, 1387, 549,  906,  799,  729,
         111,  1490, 1343, 1358, 1062, 701,  162,  802,  1036, 1770, 1865, 1709,
         1732, 1968, 1595, 1505, 974,  1813, 715,  704,  2051, 1522, 1447, 385,
         192,  632,  1309, 1762, 1655, 32,   833,  856,  1005, 910,  1296, 1601,
         1108, 832,  1410, 1017, 916,  1094, 1939, 1871, 1613, 237,  1648, 1536,
         27,   236,  617,  1395, 1219, 650,  1649, 1141, 1472, 440,  798,  1891,
         143,  1892, 306,  1782, 749,  1407, 261,  857,  1992, 939,  745,  1959,
         68,   141,  1451, 2038, 26,   117,  1722, 1294, 75,   1932, 1499, 369,
         723,  1779, 578,  1684, 1768, 1423, 521,  1591, 1216, 1147, 1515, 1958,
         563,  2053, 1238, 1344, 2002, 1635, 207,  1252, 878,  1188, 1861, 1161,
         377,  1494, 371,  146,  1317, 1731, 691,  1831, 628,  216,  370,  1508,
         826,  1116, 689,  149,  1361, 1953, 138,  1780, 1199, 307,  1753, 760,
         104,  2049, 1190, 611,  40,   1320, 276,  483,  1194, 135,  1862, 1185,
         1888, 1775, 133,  703,  460,  871,  1270, 1403, 585,  391,  1538, 509,
         47,   1842, 539,  634,  457,  979,  935,  951,  238,  1399, 881,  1235,
         479,  835,  797,  496,  843,  1661, 1257, 821,  844,  150,  1117, 1359,
         925,  600,  1546, 1795, 1364, 1828, 663,  51,   1160, 29,   1034, 1327,
         120,  1860, 1742, 603,  1637, 77,   1627, 1686, 1311, 1783, 1987, 1971,
         1893, 1004, 815,  1863, 1253, 1286, 204,  1152, 53,   1272, 92,   21,
         1911, 1292, 1743, 335,  1178, 1603, 337,  1243, 786,  801,  633,  506,
         1869, 1080, 1671, 1629, 777,  741,  686,  882,  171,  580,  208,  950,
         1867, 1265, 1638, 1729, 179,  841,  886,  1912, 588,  1264, 902,  18,
         1730, 409,  1928, 1543, 848,  1799, 396,  1599, 735,  481,  1288, 73,
         1766, 2055, 1042, 1225, 1277, 1074, 1386, 1352, 182,  450,  1874, 1372,
         1068, 1154, 193,  904,  590,  1751, 894,  1897, 1759, 819,  128,  923,
         795,  1,    990,  975,  1041, 1608, 985,  2058, 1083, 964,  196,  1180,
         1137, 1024, 1910, 1283, 195,  1025, 260,  566,  1727, 1979, 898,  1475,
         1136, 360,  1571, 1275, 264,  340,  508,  1820, 1905, 78,   1963, 1798,
         1834, 1884, 399,  1492, 829,  1109, 944,  100,  897,  249,  1856, 289,
         1647, 1087, 33,   1222, 1811, 156,  1695, 380,  1827, 1220, 828,  17,
         108,  1114, 473,  568,  1944, 158,  1741, 1269, 831,  584,  507,  880,
         344,  1377, 464,  1718, 1457, 1814, 759}));

    REQUIRE(S->size() == static_cast<uint64_t>(4030387200));
    delete S;
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "028",
                          "perm. group C2 x C2 x C2 (order 8)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 8;
    using Perm          = libsemigroups::Perm<0, size_t>;
    auto S              = SchreierSims<N, size_t, Perm>();

    S.add_generator(Perm({1, 0, 2, 3, 4, 5, 6, 7}));
    S.add_generator(Perm({0, 1, 3, 2, 4, 5, 6, 7}));
    S.add_generator(Perm({0, 1, 2, 3, 4, 5, 7, 6}));

    REQUIRE(S.size() == 8);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "029",
                          "perm. group C2 x C2 x C2 x C2 (order 16)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 8;
    using Perm          = Perm<>;
    auto S              = SchreierSims<N, Perm::value_type, Perm>();

    S.add_generator(Perm({1, 0, 2, 3, 4, 5, 6, 7}));
    S.add_generator(Perm({0, 1, 3, 2, 4, 5, 6, 7}));
    S.add_generator(Perm({0, 1, 2, 3, 5, 4, 6, 7}));
    S.add_generator(Perm({0, 1, 2, 3, 4, 5, 7, 6}));

    REQUIRE(S.size() == 16);

    REQUIRE(S.contains(S.generator(0)));
    REQUIRE(S.contains(S.generator(1)));
    REQUIRE(S.contains(S.generator(2)));
    REQUIRE(S.contains(S.generator(3)));
    REQUIRE(S.contains(Perm({1, 0, 2, 3, 5, 4, 6, 7})));
    REQUIRE(S.contains(Perm({0, 1, 3, 2, 5, 4, 7, 6})));
    REQUIRE(!S.contains(Perm({6, 7, 0, 1, 2, 3, 4, 5})));
    REQUIRE(!S.contains(Perm({4, 1, 5, 6, 7, 0, 2, 3})));
    REQUIRE(!S.contains(Perm({6, 4, 7, 0, 1, 2, 3, 5})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "030",
                          "perm. group (S5 x S5) : C2 (order 28800)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 10;
    using Perm          = Perm<>;
    auto S              = SchreierSims<N, Perm::value_type, Perm>();

    S.add_generator(Perm({0, 9, 2, 3, 4, 5, 6, 7, 8, 1}));
    S.add_generator(Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 0}));

    REQUIRE(S.size() == 28800);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "031",
                          "perm. group C3 x D8 x A5 (order 1440)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 12;
    using Perm          = Perm<>;
    auto S              = SchreierSims<N, Perm::value_type, Perm>();

    S.add_generator(Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 10, 9}));
    S.add_generator(Perm({0, 1, 2, 3, 4, 5, 6, 7, 9, 8, 11, 10}));
    S.add_generator(Perm({0, 1, 2, 3, 4, 6, 7, 5, 8, 9, 10, 11}));
    S.add_generator(Perm({0, 1, 3, 4, 2, 5, 6, 7, 8, 9, 10, 11}));
    S.add_generator(Perm({0, 2, 1, 4, 3, 5, 6, 7, 8, 9, 10, 11}));
    S.add_generator(Perm({1, 0, 2, 4, 3, 5, 6, 7, 8, 9, 10, 11}));

    REQUIRE(S.size() == 1440);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "032",
                          "perm. group GL(4, 3) (order 24261120)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 81;
    auto             S  = SchreierSims<N>();
    using Perm          = std::remove_pointer<decltype(S)>::type::element_type;

    S.add_generator(Perm(
        {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16,
         17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 54, 55, 56, 57, 58, 59, 60,
         61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
         78, 79, 80, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
         41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}));
    S.add_generator(Perm(
        {0,  6,  3,  18, 24, 21, 9,  15, 12, 54, 60, 57, 72, 78, 75, 63, 69,
         66, 27, 33, 30, 45, 51, 48, 36, 42, 39, 55, 61, 58, 73, 79, 76, 64,
         70, 67, 28, 34, 31, 46, 52, 49, 37, 43, 40, 1,  7,  4,  19, 25, 22,
         10, 16, 13, 29, 35, 32, 47, 53, 50, 38, 44, 41, 2,  8,  5,  20, 26,
         23, 11, 17, 14, 56, 62, 59, 74, 80, 77, 65, 71, 68}));

    REQUIRE(S.contains(S.generator(0)));
    REQUIRE(S.contains(S.generator(1)));

    REQUIRE(S.contains(Perm(
        {0,  65, 46, 7,  69, 53, 5,  67, 48, 21, 59, 40, 19, 54, 38, 26, 61,
         42, 15, 80, 34, 13, 75, 32, 11, 73, 27, 45, 2,  64, 52, 6,  71, 50,
         4,  66, 39, 23, 58, 37, 18, 56, 44, 25, 60, 33, 17, 79, 31, 12, 77,
         29, 10, 72, 63, 47, 1,  70, 51, 8,  68, 49, 3,  57, 41, 22, 55, 36,
         20, 62, 43, 24, 78, 35, 16, 76, 30, 14, 74, 28, 9})));

    REQUIRE(S.contains(Perm(
        {0,  6,  3,  18, 24, 21, 9,  15, 12, 54, 60, 57, 72, 78, 75, 63, 69,
         66, 27, 33, 30, 45, 51, 48, 36, 42, 39, 55, 61, 58, 73, 79, 76, 64,
         70, 67, 28, 34, 31, 46, 52, 49, 37, 43, 40, 1,  7,  4,  19, 25, 22,
         10, 16, 13, 29, 35, 32, 47, 53, 50, 38, 44, 41, 2,  8,  5,  20, 26,
         23, 11, 17, 14, 56, 62, 59, 74, 80, 77, 65, 71, 68})));

    REQUIRE(S.contains(Perm(
        {0,  13, 26, 39, 52, 29, 78, 55, 68, 65, 75, 61, 23, 6,  10, 35, 36,
         49, 46, 32, 42, 58, 71, 72, 16, 20, 3,  5,  15, 19, 44, 45, 31, 74,
         57, 70, 67, 80, 54, 25, 2,  12, 28, 41, 51, 48, 34, 38, 60, 64, 77,
         9,  22, 8,  7,  11, 21, 37, 50, 33, 76, 62, 63, 69, 73, 59, 18, 4,
         17, 30, 43, 47, 53, 27, 40, 56, 66, 79, 14, 24, 1})));

    REQUIRE(!S.contains(Perm(
        {0,  13, 26, 39, 52, 29, 78, 55, 68, 65, 75, 61, 23, 4,  10, 35, 36,
         49, 46, 32, 42, 58, 71, 72, 16, 7,  3,  5,  15, 19, 44, 45, 31, 74,
         57, 70, 67, 80, 54, 25, 1,  12, 28, 41, 51, 48, 34, 38, 60, 64, 77,
         9,  63, 8,  22, 11, 21, 37, 50, 33, 76, 62, 53, 69, 73, 59, 18, 6,
         17, 30, 43, 47, 20, 27, 40, 56, 66, 79, 14, 24, 2})));

    REQUIRE(!S.contains(Perm(
        {0,  29, 55, 35, 61, 4,  58, 3,  32, 20, 79, 24, 76, 21, 50, 18, 47,
         73, 67, 12, 41, 9,  38, 64, 44, 70, 15, 13, 39, 68, 36, 65, 10, 71,
         16, 42, 27, 56, 2,  62, 22, 33, 6,  30, 59, 80, 25, 51, 63, 48, 77,
         45, 74, 19, 26, 52, 78, 49, 75, 23, 72, 7,  46, 40, 66, 14, 53, 11,
         37, 17, 43, 69, 54, 1,  28, 8,  34, 60, 31, 57, 5})));
    REQUIRE(!S.contains(Perm(
        {0,  13, 26, 39, 52, 29, 78, 55, 68, 65, 75, 61, 23, 4,  10, 35, 36,
         49, 46, 32, 42, 58, 71, 72, 16, 63, 3,  5,  15, 19, 44, 45, 31, 74,
         57, 70, 67, 80, 54, 25, 1,  12, 28, 41, 51, 48, 34, 38, 60, 64, 77,
         9,  20, 8,  53, 11, 21, 37, 50, 33, 76, 62, 7,  69, 73, 59, 18, 6,
         17, 30, 43, 47, 22, 27, 40, 56, 66, 79, 14, 24, 2})));
    REQUIRE(S.size() == 24261120);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "033",
                          "perm. group PSL(3, 7) (order 1876896)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    constexpr size_t N  = 57;
    using Perm          = Perm<>;
    auto S              = new SchreierSims<N, Perm::value_type, Perm>();

    S->add_generator(
        Perm({1,  8,  15, 22, 29, 36, 43, 50, 12, 19, 26, 33, 40, 47, 54,
              10, 45, 52, 17, 24, 31, 38, 14, 35, 42, 49, 56, 21, 28, 11,
              53, 18, 25, 32, 39, 46, 0,  5,  4,  3,  2,  7,  6,  13, 27,
              34, 41, 48, 55, 20, 9,  37, 44, 51, 16, 23, 30}));
    S->add_generator(
        Perm({0,  1,  3,  4,  5,  6,  7,  2,  8,  14, 9,  10, 11, 12, 13,
              43, 49, 44, 45, 46, 47, 48, 50, 56, 51, 52, 53, 54, 55, 15,
              21, 16, 17, 18, 19, 20, 22, 28, 23, 24, 25, 26, 27, 29, 35,
              30, 31, 32, 33, 34, 36, 42, 37, 38, 39, 40, 41}));

    REQUIRE(S->contains(S->generator(0)));
    REQUIRE(S->contains(S->generator(1)));
    REQUIRE(S->size() == 1876896);

    REQUIRE(S->contains(
        Perm({53, 51, 0,  54, 52, 56, 50, 55, 37, 35, 8,  27, 5,  19, 45,
              1,  39, 25, 32, 46, 11, 18, 16, 43, 41, 4,  12, 31, 28, 44,
              2,  33, 38, 21, 22, 13, 30, 26, 17, 14, 36, 48, 7,  9,  20,
              3,  47, 24, 42, 29, 23, 10, 49, 15, 34, 6,  40})));

    REQUIRE(S->contains(
        Perm({12, 40, 47, 19, 26, 54, 33, 1,  2,  25, 15, 55, 45, 42, 30,
              48, 50, 23, 35, 18, 38, 3,  24, 5,  34, 46, 51, 36, 21, 56,
              44, 6,  17, 29, 39, 27, 16, 31, 53, 4,  28, 41, 43, 32, 20,
              49, 22, 7,  37, 52, 8,  14, 10, 9,  13, 0,  11})));

    REQUIRE(S->contains(
        Perm({37, 5,  45, 27, 53, 19, 35, 8,  36, 39, 41, 40, 38, 0,  42,
              24, 33, 18, 14, 55, 6,  43, 46, 15, 56, 31, 26, 3,  13, 12,
              52, 22, 20, 49, 7,  32, 34, 28, 47, 50, 11, 2,  17, 21, 48,
              10, 25, 29, 4,  54, 51, 9,  30, 44, 16, 1,  23})));

    REQUIRE(!S->contains(
        Perm({37, 1,  19, 35, 8,  45, 27, 3,  36, 38, 2,  42, 39, 41, 40,
              29, 55, 4,  43, 33, 18, 14, 46, 53, 24, 13, 15, 56, 31, 12,
              49, 5,  32, 52, 22, 20, 34, 11, 0,  17, 28, 47, 50, 21, 26,
              7,  54, 48, 10, 25, 51, 16, 6,  23, 9,  30, 44})));

    REQUIRE(!S->contains(
        Perm({8,  12, 14, 11, 0,  13, 9,  10, 40, 16, 3,  56, 32, 2,  48,
              47, 31, 21, 39, 4,  55, 23, 19, 26, 7,  27, 37, 45, 35, 29,
              6,  34, 44, 52, 42, 18, 54, 28, 46, 1,  20, 30, 38, 33, 41,
              51, 17, 49, 25, 53, 5,  43, 36, 24, 22, 15, 50})));

    REQUIRE(!S->contains(
        Perm({51, 37, 4,  16, 44, 30, 9,  23, 6,  46, 12, 21, 36, 26, 34,
              8,  29, 49, 25, 41, 33, 17, 45, 13, 1,  53, 40, 18, 28, 27,
              15, 32, 5,  38, 14, 47, 24, 56, 52, 54, 2,  55, 50, 19, 31,
              22, 48, 42, 7,  11, 35, 3,  20, 10, 39, 43, 0})));
    delete S;
  }

  // The following are comment out since the "action" struct requires the
  // compiler intrinsic lz_cnt, which we don't currently want to rely on. This
  // is a POC, and works when lz_cnt is available and actually counts leading
  // 0s.

  //     LIBSEMIGROUPS_TEST_CASE("SchreierSims", "034", "BMat8 cyclic group
  //     order 2",
  //               "[quick][schreier-sims]") {
  //       SchreierSims<8, size_t, BMat8> S;
  //       S.add_generator(BMat8({{0, 1, 0, 0, 0, 0, 0, 0},
  //                              {1, 0, 0, 0, 0, 0, 0, 0},
  //                              {0, 0, 1, 0, 0, 0, 0, 0},
  //                              {0, 0, 0, 1, 0, 0, 0, 0},
  //                              {0, 0, 0, 0, 1, 0, 0, 0},
  //                              {0, 0, 0, 0, 0, 1, 0, 0},
  //                              {0, 0, 0, 0, 0, 0, 1, 0},
  //                              {0, 0, 0, 0, 0, 0, 0, 1}}));
  //       REQUIRE(S.size() == 2);
  //     }
  //
  //     LIBSEMIGROUPS_TEST_CASE("SchreierSims", "035", "BMat8 symmetric group
  //     8",
  //               "[quick][schreier-sims]") {
  //       SchreierSims<8, size_t, BMat8> S;
  //       S.add_generator(BMat8({{0, 1, 0, 0, 0, 0, 0, 0},
  //                              {1, 0, 0, 0, 0, 0, 0, 0},
  //                              {0, 0, 1, 0, 0, 0, 0, 0},
  //                              {0, 0, 0, 1, 0, 0, 0, 0},
  //                              {0, 0, 0, 0, 1, 0, 0, 0},
  //                              {0, 0, 0, 0, 0, 1, 0, 0},
  //                              {0, 0, 0, 0, 0, 0, 1, 0},
  //                              {0, 0, 0, 0, 0, 0, 0, 1}}));
  //       S.add_generator(BMat8({{0, 1, 0, 0, 0, 0, 0, 0},
  //                              {0, 0, 1, 0, 0, 0, 0, 0},
  //                              {0, 0, 0, 1, 0, 0, 0, 0},
  //                              {0, 0, 0, 0, 1, 0, 0, 0},
  //                              {0, 0, 0, 0, 0, 1, 0, 0},
  //                              {0, 0, 0, 0, 0, 0, 1, 0},
  //                              {0, 0, 0, 0, 0, 0, 0, 1},
  //                              {1, 0, 0, 0, 0, 0, 0, 0}}));
  //       REQUIRE(S.size() == 40320);
  //     }
  //
  //
  //     LIBSEMIGROUPS_TEST_CASE("SchreierSims", "036", "BMat8 dihedral group
  //     D_16",
  //               "[quick][schreier-sims]") {
  //       SchreierSims<8, size_t, BMat8> S;
  //       S.add_generator(BMat8({{1, 0, 0, 0, 0, 0, 0, 0},
  //                              {0, 0, 0, 0, 0, 0, 0, 1},
  //                              {0, 0, 0, 0, 0, 0, 1, 0},
  //                              {0, 0, 0, 0, 0, 1, 0, 0},
  //                              {0, 0, 0, 0, 1, 0, 0, 0},
  //                              {0, 0, 0, 1, 0, 0, 0, 0},
  //                              {0, 0, 1, 0, 0, 0, 0, 0},
  //                              {0, 1, 0, 0, 0, 0, 0, 0}}));
  //       S.add_generator(BMat8({{0, 1, 0, 0, 0, 0, 0, 0},
  //                              {0, 0, 1, 0, 0, 0, 0, 0},
  //                              {0, 0, 0, 1, 0, 0, 0, 0},
  //                              {0, 0, 0, 0, 1, 0, 0, 0},
  //                              {0, 0, 0, 0, 0, 1, 0, 0},
  //                              {0, 0, 0, 0, 0, 0, 1, 0},
  //                              {0, 0, 0, 0, 0, 0, 0, 1},
  //                              {1, 0, 0, 0, 0, 0, 0, 0}}));
  //       REQUIRE(S.size() == 16);
  //     }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "037",
                          "symmetric perm. group (degree 5)",
                          "[quick][schreier-sims]") {
    auto rg    = ReportGuard(REPORT);
    using Perm = Perm<>;
    SchreierSims<5, Perm::value_type, Perm> S;
    S.add_generator(Perm({1, 2, 3, 4, 0}));
    S.add_generator(Perm({1, 0, 2, 3, 4}));
    REQUIRE(S.size() == static_cast<uint64_t>(120));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "038",
                          "alternating perm. group (degree 17)",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<17> S;
    S.clear();
    using Perm = SchreierSims<17>::element_type;
    REQUIRE(S.size() == 1);
    S.add_generator(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 14}));
    REQUIRE(S.size() == static_cast<uint64_t>(177843714048000));
    REQUIRE(S.base(0) == 0);
    REQUIRE(S.contains(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0})));
    REQUIRE(!S.contains(
        Perm({1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16})));
    REQUIRE(S.contains(
        Perm({1, 0, 3, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16})));

    S.clear();
    REQUIRE(S.size() == 1);
    S.add_generator(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 14}));

    S.clear();
    REQUIRE_THROWS_AS(S.base(0), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.add_base_point(17), LibsemigroupsException);
    S.add_base_point(14);
    S.add_base_point(15);
    S.add_generator(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0}));
    S.add_base_point(1);
    S.add_base_point(3);
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 14}));
    REQUIRE(S.base_size() == 4);
    REQUIRE(S.size() == static_cast<uint64_t>(177843714048000));
    REQUIRE(S.base(0) == 14);
    REQUIRE(S.base(1) == 15);
    REQUIRE(S.base(2) == 1);
    REQUIRE(S.base(3) == 3);
    REQUIRE(S.base_size() == 15);
    REQUIRE_THROWS_AS(S.add_base_point(1), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.base(15), LibsemigroupsException);
    REQUIRE(S.contains(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0})));
    REQUIRE(!S.contains(
        Perm({1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16})));
    REQUIRE(S.contains(
        Perm({1, 0, 3, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16})));
    REQUIRE_THROWS_AS(S.add_base_point(1), LibsemigroupsException);

    S.clear();
    S.add_generator(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0}));
    REQUIRE(S.size() == 17);
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 14}));
    REQUIRE(S.size() == static_cast<uint64_t>(177843714048000));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "039",
                          "exceptions",
                          "[quick][schreier-sims]") {
    auto rg    = ReportGuard(REPORT);
    using Perm = Perm<>;
    SchreierSims<5, Perm::value_type, Perm> S;
    S.add_generator(Perm({1, 2, 3, 4, 0}));
    S.add_generator(Perm({1, 0, 2, 3, 4}));
    REQUIRE(S.size() == static_cast<uint64_t>(120));
    REQUIRE_THROWS_AS(S.add_generator(Perm({0, 1, 2})), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.add_generator(Perm({2, 3, 0, 1, 4, 6})),
                      LibsemigroupsException);

    REQUIRE_THROWS_AS(S.generator(10), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.generator(2), LibsemigroupsException);
    REQUIRE_NOTHROW(S.generator(0));
    REQUIRE_NOTHROW(S.generator(1));

    REQUIRE_THROWS_AS(S.sift(Perm({2, 3, 0, 1, 4, 6})), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.sift(Perm({2, 0, 1})), LibsemigroupsException);
    REQUIRE_NOTHROW(S.sift(S.generator(1)));

    REQUIRE(S.contains(S.generator(1)));
    REQUIRE(S.contains(S.generator(0)));
    REQUIRE(S.contains(Perm({0, 3, 1, 4, 2})));
    REQUIRE(!S.contains(Perm({2, 3, 0, 1, 4, 6})));
    REQUIRE(!S.contains(Perm({2, 0, 1})));
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "040",
                          "exceptions",
                          "[quick][schreier-sims]") {
    auto rg    = ReportGuard(REPORT);
    using Perm = Perm<>;
    SchreierSims<5, Perm::value_type, Perm> S;
    S.add_generator(Perm({1, 2, 3, 4, 0}));
    S.add_generator(Perm({1, 0, 2, 3, 4}));
    REQUIRE_THROWS_AS(S.add_base_point(0), LibsemigroupsException);
    for (size_t i = 1; i < 5; ++i) {
      REQUIRE_NOTHROW(S.add_base_point(i));
    }
    REQUIRE_THROWS_AS(S.add_base_point(5), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.add_base_point(100), LibsemigroupsException);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "041",
                          "trivial group",
                          "[quick][schreier-sims]") {
    auto            rg = ReportGuard(REPORT);
    SchreierSims<5> S;
    using Perm = typename decltype(S)::element_type;
    S.add_generator(Perm({1, 2, 3, 4, 0}));
    S.add_generator(Perm({1, 0, 2, 3, 4}));
    REQUIRE_THROWS_AS(S.add_base_point(0), LibsemigroupsException);
    for (size_t i = 1; i < 5; ++i) {
      REQUIRE_NOTHROW(S.add_base_point(i));
    }
    REQUIRE_THROWS_AS(S.add_base_point(6), LibsemigroupsException);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "042",
                          "A17 bug",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<17> S, T;
    using Perm = SchreierSims<17>::element_type;
    S.add_generator(
        Perm({0, 1, 2, 4, 16, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 3}));
    S.add_generator(
        Perm({0, 1, 2, 3, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 4}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 5}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 7, 16, 8, 9, 10, 11, 12, 13, 14, 15, 6}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 8, 16, 9, 10, 11, 12, 13, 14, 15, 7}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 9, 16, 10, 11, 12, 13, 14, 15, 8}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 16, 11, 12, 13, 14, 15, 9}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 16, 12, 13, 14, 15, 10}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 16, 13, 14, 15, 11}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 14, 15, 12}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 15, 13}));
    S.add_generator(
        Perm({0, 1, 14, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 15, 2}));
    S.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 14, 15}));
    S.add_generator(
        Perm({0, 15, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 1}));
    S.add_generator(
        Perm({15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 0}));

    T.add_generator(
        Perm({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0}));
    T.add_generator(
        Perm({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 14}));

    for (size_t i = 0; i < S.number_of_generators(); ++i) {
      REQUIRE(T.contains(S.generator(i)));
    }
    for (size_t i = 0; i < T.number_of_generators(); ++i) {
      REQUIRE(S.contains(T.generator(i)));
    }

    REQUIRE(T.size() == 177843714048000);
    REQUIRE(S.size() == 177843714048000);
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "043",
                          "orbits_lookup test",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<64> S, T;
    using Perm = typename decltype(S)::element_type;
    S.add_base_point(0);
    S.add_base_point(1);
    S.add_base_point(2);
    S.add_generator(
        Perm({0,  2,  59, 57, 16, 18, 43, 41, 36, 38, 31, 29, 52, 54, 15, 13,
              8,  10, 51, 49, 24, 26, 35, 33, 44, 46, 23, 21, 60, 62, 7,  5,
              32, 34, 27, 25, 48, 50, 11, 9,  4,  6,  63, 61, 20, 22, 47, 45,
              40, 42, 19, 17, 56, 58, 3,  1,  12, 14, 55, 53, 28, 30, 39, 37}));
    S.add_generator(
        Perm({0,  40, 51, 27, 1,  41, 50, 26, 2,  42, 49, 25, 3,  43, 48, 24,
              4,  44, 55, 31, 5,  45, 54, 30, 6,  46, 53, 29, 7,  47, 52, 28,
              16, 56, 35, 11, 17, 57, 34, 10, 18, 58, 33, 9,  19, 59, 32, 8,
              20, 60, 39, 15, 21, 61, 38, 14, 22, 62, 37, 13, 23, 63, 36, 12}));
    S.add_generator(
        Perm({1,  0,  3,  2,  5,  4,  7,  6,  9,  8,  11, 10, 13, 12, 15, 14,
              17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30,
              33, 32, 35, 34, 37, 36, 39, 38, 41, 40, 43, 42, 45, 44, 47, 46,
              49, 48, 51, 50, 53, 52, 55, 54, 57, 56, 59, 58, 61, 60, 63, 62}));
    S.run();

    detail::Array2<bool, 64> orbits_lookup_test;
    orbits_lookup_test[0]
        = {truetruetruetruetruetruetruetruetruetruetrue,
           truetruetruetruetruetruetruetruetruetruetrue,
           truetruetruetruetruetruetruetruetruetruetrue,
           truetruetruetruetruetruetruetruetruetruetrue,
           truetruetruetruetruetruetruetruetruetruetrue,
           truetruetruetruetruetruetruetruetrue};
    orbits_lookup_test[1]
        = {falsetruetruetruetruetruetruetruetruetruetrue,
           true,  truetruetruetruetruetruetruetruetruetrue,
           true,  truetruetruetruetruetruetruetruetruetrue,
           true,  truetruetruetruetruetruetruetruetruetrue,
           true,  truetruetruetruetruetruetruetruetruetrue,
           true,  truetruetruetruetruetruetruetrue};
    orbits_lookup_test[2]
        = {falsefalsetrue,  falsefalsefalsefalsefalsefalsefalse,
           falsetrue,  falsefalsefalsefalsefalsefalsefalsefalse,
           falsefalsefalsefalsefalsefalsefalsefalsefalsefalse,
           falsefalsetrue,  falsefalsefalsefalsefalsefalsefalse,
           falsefalsefalsefalsetrue,  falsefalsefalsefalsefalse,
           falsefalsefalsefalsefalsefalsetrue,  falsefalsefalse,
           true,  falsefalsefalse};
    REQUIRE_THROWS_AS(S.orbits_lookup(3, 0), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.orbits_lookup(4, 0), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.orbits_lookup(0, 64), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.orbits_lookup(0, 65), LibsemigroupsException);
    for (size_t i = 0; i < 3; ++i) {
      for (size_t j = 0; j < 64; ++j) {
        REQUIRE(S.orbits_lookup(i, j) == orbits_lookup_test[i][j]);
      }
    }

    T.add_base_point(0);
    T.add_base_point(1);
    T.add_base_point(4);
    T.add_generator(
        Perm({0,  30, 5,  27, 41, 55, 44, 50, 2,  28, 7,  25, 43, 53, 46, 48,
              4,  26, 1,  31, 45, 51, 40, 54, 6,  24, 3,  29, 47, 49, 42, 52,
              16, 14, 21, 11, 57, 39, 60, 34, 18, 12, 23, 9,  59, 37, 62, 32,
              20, 10, 17, 15, 61, 35, 56, 38, 22, 8,  19, 13, 63, 33, 58, 36}));
    T.add_generator(
        Perm({0,  10, 47, 37, 55, 61, 24, 18, 1,  11, 46, 36, 54, 60, 25, 19,
              32, 42, 15, 5,  23, 29, 56, 50, 33, 43, 14, 4,  22, 28, 57, 51,
              8,  2,  39, 45, 63, 53, 16, 26, 9,  3,  38, 44, 62, 52, 17, 27,
              40, 34, 7,  13, 31, 21, 48, 58, 41, 35, 6,  12, 30, 20, 49, 59}));
    T.add_generator(
        Perm({1,  0,  3,  2,  5,  4,  7,  6,  9,  8,  11, 10, 13, 12, 15, 14,
              17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30,
              33, 32, 35, 34, 37, 36, 39, 38, 41, 40, 43, 42, 45, 44, 47, 46,
              49, 48, 51, 50, 53, 52, 55, 54, 57, 56, 59, 58, 61, 60, 63, 62}));
    T.run();

    orbits_lookup_test[2]
        = {falsefalsefalsefalsetrue,  true,  true,  true,  true,  true,
           true,  true,  falsefalsefalsefalsefalsefalsefalsefalse,
           falsefalsefalsefalsefalsefalsefalsefalsefalsefalse,
           falsefalsefalsefalsefalsefalsefalsefalsefalsefalse,
           falsefalsefalsefalsefalsefalsefalsefalsefalsefalse,
           falsefalsefalsefalsefalsefalsefalsefalsefalsefalse,
           falsefalsefalsefalse};
    REQUIRE_THROWS_AS(T.orbits_lookup(3, 0), LibsemigroupsException);
    REQUIRE_THROWS_AS(T.orbits_lookup(4, 0), LibsemigroupsException);
    REQUIRE_THROWS_AS(T.orbits_lookup(0, 64), LibsemigroupsException);
    REQUIRE_THROWS_AS(T.orbits_lookup(0, 65), LibsemigroupsException);
    for (size_t i = 0; i < 3; ++i) {
      for (size_t j = 0; j < 64; ++j) {
        REQUIRE(T.orbits_lookup(i, j) == orbits_lookup_test[i][j]);
      }
    }
  }

  LIBSEMIGROUPS_TEST_CASE("SchreierSims",
                          "044",
                          "transversal_element and inversal_element test",
                          "[quick][schreier-sims]") {
    auto             rg = ReportGuard(REPORT);
    SchreierSims<64> S;
    using Perm   = typename decltype(S)::element_type;
    using Action = typename decltype(S)::Action;

    S.add_base_point(0);
    S.add_base_point(1);
    S.add_base_point(2);
    S.add_generator(
        Perm({0,  2,  59, 57, 16, 18, 43, 41, 36, 38, 31, 29, 52, 54, 15, 13,
              8,  10, 51, 49, 24, 26, 35, 33, 44, 46, 23, 21, 60, 62, 7,  5,
              32, 34, 27, 25, 48, 50, 11, 9,  4,  6,  63, 61, 20, 22, 47, 45,
              40, 42, 19, 17, 56, 58, 3,  1,  12, 14, 55, 53, 28, 30, 39, 37}));
    S.add_generator(
        Perm({0,  40, 51, 27, 1,  41, 50, 26, 2,  42, 49, 25, 3,  43, 48, 24,
              4,  44, 55, 31, 5,  45, 54, 30, 6,  46, 53, 29, 7,  47, 52, 28,
              16, 56, 35, 11, 17, 57, 34, 10, 18, 58, 33, 9,  19, 59, 32, 8,
              20, 60, 39, 15, 21, 61, 38, 14, 22, 62, 37, 13, 23, 63, 36, 12}));
    S.add_generator(
        Perm({1,  0,  3,  2,  5,  4,  7,  6,  9,  8,  11, 10, 13, 12, 15, 14,
              17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30,
              33, 32, 35, 34, 37, 36, 39, 38, 41, 40, 43, 42, 45, 44, 47, 46,
              49, 48, 51, 50, 53, 52, 55, 54, 57, 56, 59, 58, 61, 60, 63, 62}));
    S.run();

    REQUIRE_THROWS_AS(S.transversal_element(3, 0), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.transversal_element(4, 0), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.transversal_element(0, 64), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.transversal_element(0, 65), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.inversal_element(3, 0), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.inversal_element(4, 0), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.inversal_element(0, 64), LibsemigroupsException);
    REQUIRE_THROWS_AS(S.inversal_element(0, 65), LibsemigroupsException);
    for (size_t i = 0; i < 3; ++i) {
      for (size_t j = 0; j < 64; ++j) {
        if (S.orbits_lookup(i, j)) {
          REQUIRE(Action()(S.base(i), S.transversal_element(i, j)) == j);
          REQUIRE(Action()(j, S.inversal_element(i, j)) == S.base(i));
        } else {
          REQUIRE_THROWS_AS(S.transversal_element(i, j),
                            LibsemigroupsException);
          REQUIRE_THROWS_AS(S.inversal_element(i, j), LibsemigroupsException);
        }
      }
    }
  }

}  // namespace libsemigroups

Messung V0.5 in Prozent
C=97 H=95 G=95

¤ Dauer der Verarbeitung: 0.84 Sekunden  (vorverarbeitet am  2026-05-03) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.