back to table · edit · history · where entries came from · files · download
5213 bytes, as of the version from 2026-10-25 18:21 (current). Recorded here, not run.
"""Independent checks of unimodular genus masses -- numberdb.org/T497.
sage -python checks.py
sage -python checks.py --stored
Keep generate.py, check.py, source_values.json and niemeier_orders.json beside
this file. The stored mode requires NUMBERDB_API_KEY while T497 is private.
Checks use Sage's general Conway-Sloane local-density implementation, which
shares no code with the elementary Bernoulli/Euler generator. Full-range
comparisons also use separately transcribed published rational values.
Independent class-sum controls cover dimensions 1..11 (odd), 0,8,16,24 (even).
"""
import json
import os
import sys
from pathlib import Path
from math import factorial
import numberdb.sage as numberdb
from sage.rings.integer_ring import ZZ
from sage.rings.rational_field import QQ
from sage.matrix.constructor import matrix
from sage.symbolic.ring import SR
from sage.symbolic.function import BuiltinFunction
# Genus.mass() simplifies its archimedean factors through Maxima. Importing
# the named rings alone does not initialize the functions Maxima translates.
import sage.functions.all
from sage.quadratic_forms.genera.genus import Genus, genera
from sage.env import SAGE_VERSION
from check import exactness, measure, agrees_with, names_its_rings
from generate import UnimodularMasses
HERE = Path(__file__).resolve().parent
def number(value):
return QQ(value['number'] if isinstance(value, dict) else value)
def from_document(doc):
return {(p, int(n)): number(v)
for p, rows in doc['Numbers'].items() for n, v in rows.items()}
def independent_mass(key):
parity, n = key
if n == 0:
return QQ(1)
if parity == 'I':
return Genus(matrix.identity(ZZ, n)).mass()
candidates = genera((n, 0), 1, even=True)
assert len(candidates) == 1
return candidates[0].mass()
def run(values, orders):
expected_keys = {('I',n) for n in range(1,33)} | {('II',n) for n in range(0,33,8)}
assert set(values) == expected_keys, 'missing or extra parameter values'
assert not exactness(values)
assert all(v > 0 for v in values.values())
assert not names_its_rings(str(HERE/'generate.py'))
print('Sage',SAGE_VERSION,'; entries',len(values),flush=True)
# Known controls come before trusting the general mass algorithm.
assert independent_mass(('I',1)) == QQ(1)/2
assert independent_mass(('I',2)) == QQ(1)/8
assert independent_mass(('II',8)) == QQ(1)/696729600
print('General genus-mass controls: ranks 1, 2 and E8 passed.',flush=True)
failures = agrees_with(values, independent_mass)
assert not failures, failures
print('General local-density mass computation: 37/37 exact agreements.',flush=True)
source = json.loads((HERE/'source_values.json').read_text())
source_values = {(p,int(n)): QQ(v) for p in ('I','II') for n,v in source[p].items()}
assert values == source_values
print('Published rational values: 36/36 agreements; rank 1 separately equals 1/2.',flush=True)
# Signed permutations give the whole group for the single odd class n<=8.
for n in range(1,9):
assert values['I',n] == QQ(1)/QQ(2**n * factorial(n))
# For n=9,10,11 there are precisely Z^n and E8 + Z^(n-8).
for n in range(9,12):
s = n-8
class_sum = (QQ(1)/QQ(2**n * factorial(n))
+ QQ(1)/QQ(696729600 * 2**s * factorial(s)))
assert values['I',n] == class_sum
assert values['II',0] == 1
assert values['II',8] == QQ(1)/696729600
assert values['II',16] == (QQ(1)/QQ(2 * 696729600**2)
+ QQ(1)/QQ(2**15 * factorial(16)))
assert len(orders) == 24 and 'Leech' in orders
assert values['II',24] == sum((QQ(1)/number(v) for v in orders.values()),QQ(0))
print('Class-sum controls: odd ranks 1..11; even ranks 0,8,16,24 passed.',flush=True)
for n in range(8,33,8):
k=n//2
assert 2*values['I',n] == (2**k-1)*(2**(k-1)+1)*values['II',n]
print('Odd/even mass relation: 4/4 exact agreements.',flush=True)
# Negative controls demonstrate that a factor-two convention mismatch
# and an omitted Niemeier class cannot silently pass.
assert 2*values['II',8] != independent_mass(('II',8))
assert values['II',24] != sum((QQ(1)/number(v) for k,v in orders.items() if k!='Leech'),QQ(0))
print('Negative controls: doubling the E8 mass and omitting Leech both fail.',flush=True)
print('Measurement:',measure(values),flush=True)
if __name__ == '__main__':
if os.environ.get('NUMBERDB_KEY_FROM_STDIN') == '1':
os.environ['NUMBERDB_API_KEY'] = sys.stdin.read().strip()
stored = '--stored' in sys.argv or os.environ.get('CHECK_STORED') == '1'
if stored:
values = from_document(numberdb.table('T497'))
orders = numberdb.table('T496')['Numbers']
print('Checking values read back from T497 and Niemeier orders from T496.')
else:
g = UnimodularMasses()
values = {(p['parity'],int(p['n'])):number(g.value(p)) for p in g.enumerate()}
orders = json.loads((HERE/'niemeier_orders.json').read_text())['orders']
print('Checking locally generated values and the dated T496 snapshot.')
run(values, orders)