exact_checks.py

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

2507 bytes, as of the version from 2026-11-02 15:29 (current). Recorded here, not run.

"""Exact coefficient and enumeration checks for T680. Run: sage -python exact_checks.py."""
import math,json
import numberdb.sage as numberdb
from sage.rings.rational_field import QQ
from sage.rings.integer_ring import ZZ
from generate import TEMPLATES,upper_parameters,scale,CanonicalCoordinates
from checks import ALPHA,SCALES


def product(values):
    result=QQ(1)
    for v in values:result*=v
    return result


def harmonic(n):return sum((QQ(1)/k for k in range(1,n+1)),QQ(0))


def main():
    N=40;results=[]
    for template in TEMPLATES:
        a=upper_parameters(template); C=scale(template)
        assert sorted(a)==sorted(QQ(s) for s in ALPHA[template])
        assert len(a)==4 and sum(a)==2 and C==SCALES[template]
        c=[QQ(1)];h=[QQ(0)];g=[QQ(0)]
        for n in range(1,N+1):
            p=product(v+n-1 for v in a)
            dp=sum(product(a[k]+n-1 for k in range(4) if k!=j) for j in range(4))
            c.append(c[-1]*p/QQ(n)**4)
            h.append(h[-1]+sum(QQ(1)/(v+n-1) for v in a)-QQ(4)/n)
            g.append(c[n]*h[n])
            assert n**4*c[n]==p*c[n-1]
            assert n**4*g[n]-p*g[n-1]+4*n**3*c[n]-dp*c[n-1]==0
            if template=='5':
                assert c[n]*C**n==QQ(math.factorial(5*n))/QQ(math.factorial(n))**5
                assert h[n]==5*(harmonic(5*n)-harmonic(n))
            if template=='2.2.2.2':
                assert c[n]*C**n==QQ(math.factorial(2*n))**4/QQ(math.factorial(n))**8
                assert h[n]==8*(harmonic(2*n)-harmonic(n))
        F=[v*C**n for n,v in enumerate(c)];G=[v*C**n for n,v in enumerate(g)]
        R=[QQ(0)];E=[QQ(1)]
        for n in range(1,N+1):
            R.append(G[n]-sum(F[k]*R[n-k] for k in range(1,n+1)))
            E.append(sum(k*R[k]*E[n-k] for k in range(1,n+1))/QQ(n))
        assert all(e.denominator()==1 for e in E)
        if template=='5':assert E[:3]==[1,770,1014275]
        results.append({'template':template,'scale':C,'q_coefficients_checked_through_degree':N+1})
    params=list(CanonicalCoordinates().enumerate())
    assert len(params)==112 and len({tuple(p.values()) for p in params})==112
    for z in (QQ(-1),QQ(1)/2,QQ(2)):
        for x in (z,1-z):
            assert all(p==2 for p in (abs(x.numerator())*x.denominator()).prime_divisors())
    print(json.dumps({'passed':True,'templates':results,'entry_count':len(params),'coefficient_checks':'exact rational recurrence, first logarithmic solution, scaling and integrality'},indent=2))

if __name__=='__main__':main()