Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Finding 59:29 in the Monster

This repository contains the code and verification artifacts for a computational construction of a subgroup 59:29 in the Monster group, using mmgroup.

The final output is a pair of reduced Monster words y,n satisfying

order(y) = 59
order(n) = 29
y**n = y**3

Here x**g means g**-1 * x * g, following the mmgroup convention. Thus <y,n> has order 59 * 29 = 1711 and structure 59:29.

Quick verification

CPython 3.10–3.12 and mmgroup==1.0.8 are supported.

python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python tools/verify_generators.py \
    artifacts/monster_59_29_generators.json

This reconstructs both generators from their strings and atom arrays and checks their orders and conjugation relation directly in the Monster.

Algorithm

  1. Fix an element y of order 59.
  2. Sample replayable Monster 2A axes and compare fingerprints along the 29 powers y^(3^k mod 59). A global collision reduces the conjugacy problem to K = 2.B.
  3. Run a second, two-list fingerprint search on K/H, where H = 2^(1+23).Co2.
  4. Descend the surviving conjugacy equations through the 24-dimensional Co2 action using Schreier transporters.
  5. Solve the remaining equation in the order-2^24 normal subgroup by a 2^12-by-2^12 meet-in-the-middle search.
  6. Unwind the transporters, standardize the order-29 generator, and certify the final pair.

The production search examined 286,000,000 axes in the first stage and found one exact candidate. The second stage compared two lists of 5,922,195 axes and found three exact candidates. Recovery succeeded for candidate index 1 (the second candidate); the other two recovery jobs were then stopped rather than disproved.

Why the C++ search is fast

The bulk search is implemented in C++ against the low-level shared-library ABI in the pinned mmgroup wheel; Python is not in the hot loop. Precomputed transition words reduce the global fingerprint from 58 to 29 Monster-vector actions. Stateless ChaCha20 sampling makes each axis depend only on (seed,counter), so results do not depend on thread scheduling or restarts.

Each axis produces a fixed 32-byte record. The reducers sort and join 128-bit hashes of the 87-byte MM59SIG2 fingerprint, but a hash match is only a filter: every candidate is reconstructed and all 87 entries are compared exactly in Python.

Build and test

A C++17 compiler and GNU Make are required for the production worker and reducers.

make -j8 all
make test
PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=python \
    .venv/bin/python -m pytest -q tests

The generated axis tables required by the C++ worker are included under data/config/. They can be regenerated with:

PYTHONPATH=python .venv/bin/python \
    python/export_axis_data.py --output-dir data/config

Repository layout

Path Contents
cpp/ C++ worker, fingerprints, fixed-record formats, and reducers
python/mm59/ Exact Python reference, recovery, manifests, and certificates
python/*.py Search, replay, validation, and Slurm orchestration tools
cluster/ Slurm scripts used for the production run on CREATE
data/config/ Exported axis data and the Co2 reference
data/candidates/ The selected order-59 word and benchmark shortlist
artifacts/ Compact generators, full certificate, and run manifest
tests/ C++/Python differential, recovery, and restart-safety tests

The 86 production source files are preserved byte-for-byte. Their aggregate hash and individual hashes are recorded in artifacts/final_certificate/run_manifest.json. The Slurm scripts retain the original CREATE defaults as part of that frozen snapshot; set MM59_ROOT (and MM59_GAP where needed) when adapting them to another cluster.

Certificate and reproducibility

The compact, portable result is artifacts/monster_59_29_generators.json. The complete recovery trace is artifacts/final_certificate/candidate_1.json, with its SHA-256 sidecar and an independent replay report in the same directory.

The full verifier deliberately checks the exact compiled mmgroup runtime used in production. It therefore requires the CPython 3.10, x86-64 Linux wheel for mmgroup==1.0.8:

PYTHONPATH=python python3.10 python/verify_certificate.py \
    artifacts/final_certificate/candidate_1.json

The optional --verify-artifacts mode additionally expects the original CREATE intermediate files at the absolute paths recorded in the certificate; those large search outputs are not included here. The immutable certificate and run manifest retain their original machine paths so their checksums remain valid.

License

No software license has yet been selected. Please contact the authors before redistributing or reusing the code.

About

Finding generators for the maximal subgroup 59:29 in the monster.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages