parse_census.py

back to table · edit · history · where entries came from · files · download

3783 bytes, as of the version from 2026-10-24 20:50 (current). Recorded here, not run.

"""Parse the pinned Maple census as data, never execute it."""
import re, hashlib, json
from pathlib import Path

def split_top(text):
    pieces=[]; start=0; depth=0
    for i,c in enumerate(text):
        if c in '[{(': depth+=1
        if c in ']})': depth-=1
        if c==',' and depth==0: pieces.append(text[start:i].strip());start=i+1
        assert depth>=0
    assert depth==0
    pieces.append(text[start:].strip())
    return pieces

def parse(text):
    result={}
    text=re.sub(r'#.*','',text)
    records=re.findall(r'PeriodNonPhi4\[(\d+),(\d+)\]\s*:=\s*\[(.*?)\]\s*:',text,re.S)
    assert len(records)==text.count('PeriodNonPhi4[')
    for l,k,body in records:
        fields=split_top(body)
        assert len(fields)==5
        edges=[]
        for e in split_top(fields[0][1:-1]):
            vertices=[int(x) for x in split_top(e[1:-1])]
            assert len(vertices)==2
            edges.append({'vertices':vertices,'weight':1 if e[0]=='{' else -1})
        result[f'{l},{k}']={'loops':int(l),'index':int(k),'edges':edges,'f_alphabet':fields[1], 'expression':fields[2],'source_decimal':fields[3],'c2':fields[4]}
    return result

if __name__=='__main__':
    from collections import Counter
    p=Path(__file__).parent
    raw=p.joinpath('PeriodsNonPhi4').read_text()
    data=parse(raw)
    p.joinpath('parsed-census.json').write_text(json.dumps(data,indent=2))
    print('SHA256',hashlib.sha256(raw.encode()).hexdigest())
    print('Total',len(data),'by loop',dict(Counter(r['loops'] for r in data.values())))
    print('FAIL',[(k,r['expression'],r['source_decimal']) for k,r in data.items() if 'FAIL' in r['expression']])
    print('Distinct known expressions',len({r['expression'] for r in data.values() if 'FAIL' not in r['expression']}))
    print('Nested zeta tokens',sorted(set(re.findall(r'zeta\[\[[^\]]+\]',raw))))
    print('Other symbols', sorted(set(re.findall('[A-Za-z_]+',' '.join(r['expression'] for r in data.values())))))


def canonical(expression):
    """Exact polynomial in named zeta/MPL constants and pi, over Fraction."""
    import ast
    from fractions import Fraction
    def add(a,b):
        c=dict(a)
        for k,v in b.items():c[k]=c.get(k,Fraction(0))+v
        return {k:v for k,v in c.items() if v}
    def mul(a,b):
        c={}
        for k,u in a.items():
            for l,v in b.items():
                m=tuple(sorted(k+l)); c[m]=c.get(m,Fraction(0))+u*v
        return {k:v for k,v in c.items() if v}
    def visit(n):
        if isinstance(n,ast.Constant) and type(n.value) is int:return {():Fraction(n.value)}
        if isinstance(n,ast.Name) and n.id=='Pi':return {('Pi',):Fraction(1)}
        if isinstance(n,ast.Subscript) and isinstance(n.value,ast.Name) and n.value.id=='zeta':
            return {(ast.dump(n.slice),):Fraction(1)}
        if isinstance(n,ast.UnaryOp):
            a=visit(n.operand)
            if isinstance(n.op,ast.USub):return {k:-v for k,v in a.items()}
            if isinstance(n.op,ast.UAdd):return a
        if isinstance(n,ast.BinOp):
            a,b=visit(n.left),visit(n.right)
            if isinstance(n.op,ast.Add):return add(a,b)
            if isinstance(n.op,ast.Sub):return add(a,{k:-v for k,v in b.items()})
            if isinstance(n.op,ast.Mult):return mul(a,b)
            if isinstance(n.op,ast.Div):
                assert list(b)==[()]
                return {k:v/b[()] for k,v in a.items()}
            if isinstance(n.op,ast.Pow):
                assert list(b)==[()] and b[()].denominator==1 and b[()]>=0
                c={():Fraction(1)}
                for _ in range(int(b[()])):c=mul(c,a)
                return c
        raise ValueError(ast.dump(n))
    return tuple(sorted(visit(ast.parse(expression.replace('^','**'),mode='eval').body).items()))