"""Bounded foundations audit, 6 November 2026. Python 3.10+, standard library.
Original checkpoints: Hawking 1976 pp2463,2466-67,2471-73, Eqs3.10,3.13,5.1,5.7-8.
These are independent finite examples/algebra checks, not a full QFT derivation,
a nonperturbative gravity calculation or a claim of a new physics result.
"""
import math
import json


def thermal_checks():
    cases=[]
    for x in (0.05,0.37,0.8):
        for transmission in (0.0,0.23,0.61,1.0):
            denominator=1-(1-transmission)*x
            q=transmission*x/denominator
            probabilities=[(1-x)*(transmission*x)**n/denominator**(n+1) for n in range(200)]
            norm=sum(probabilities)
            mean=sum(n*p for n,p in enumerate(probabilities))
            expected=transmission*x/(1-x)
            # Independent binomial thinning of the horizon geometric law.
            max_error=0.0
            for n in range(12):
                direct=sum((1-x)*x**m*math.comb(m,n)*transmission**n*(1-transmission)**(m-n) for m in range(n,200))
                max_error=max(max_error,abs(direct-probabilities[n]))
            assert abs(norm-1)<1e-12
            assert abs(mean-expected)<1e-12
            assert max_error<1e-12
            cases.append({'x':x,'transmission':transmission,'normalisation_error':abs(norm-1),'mean_error':abs(mean-expected),'binomial_thinning_error':max_error})
    return cases


def multiply(a,b):
    return [[sum(a[i][k]*b[k][j] for k in range(2)) for j in range(2)] for i in range(2)]
def dagger(a):
    return [[a[j][i].conjugate() for j in range(2)] for i in range(2)]
def add(a,b):
    return [[a[i][j]+b[i][j] for j in range(2)] for i in range(2)]
def distance(a,b):
    return max(abs(a[i][j]-b[i][j]) for i in range(2) for j in range(2))


def channel_checks():
    # TP need not imply unital: a standard amplitude-damping counterexample.
    p=0.4
    k0=[[1+0j,0j],[0j,complex(math.sqrt(1-p))]]
    k1=[[0j,complex(math.sqrt(p))],[0j,0j]]
    ident=[[1+0j,0j],[0j,1+0j]]
    tp=add(multiply(dagger(k0),k0),multiply(dagger(k1),k1))
    unital=add(multiply(k0,dagger(k0)),multiply(k1,dagger(k1)))
    assert distance(tp,ident)<1e-12
    assert abs(distance(unital,ident)-p)<1e-12
    # Dephasing is both TP and unital, yet maps |+> to a mixed state.
    a=[[1+0j,0j],[0j,0j]];b=[[0j,0j],[0j,1+0j]]
    plus=[[.5+0j,.5+0j],[.5+0j,.5+0j]]
    mixed=add(multiply(multiply(a,plus),a),multiply(multiply(b,plus),b))
    purity=sum(mixed[i][j]*mixed[j][i] for i in range(2) for j in range(2)).real
    assert abs(purity-.5)<1e-12
    return {'trace_preserving_error':distance(tp,ident),'nonunital_deviation':distance(unital,ident),'tp_and_unital_dephasing_output_purity':purity,'scope':'Abstract quantum-channel counterexamples, not energy-conserving black-hole models; no CPT properties asserted.'}


def marginal_checks():
    # A pure entangled state and a classical mixture have identical marginals.
    # |psi>=sqrt(1-x)|00>+sqrt(x)|11>. Joint purity differs.
    x=.37
    v=[math.sqrt(1-x),0.0,0.0,math.sqrt(x)]
    pure=[[v[i]*v[j] for j in range(4)] for i in range(4)]
    mixture=[[0.0]*4 for _ in range(4)]
    mixture[0][0]=1-x;mixture[3][3]=x
    def partial(r):
        return [[sum(r[2*i+k][2*j+k] for k in range(2)) for j in range(2)] for i in range(2)]
    def purity(r):return sum(r[i][j]*r[j][i] for i in range(len(r)) for j in range(len(r)))
    error=distance(partial(pure),partial(mixture))
    assert error<1e-12
    assert abs(purity(pure)-1)<1e-12
    assert purity(mixture)<1
    return {'marginal_difference':error,'pure_joint_purity':purity(pure),'classical_joint_purity':purity(mixture),'scope':'Two-qubit illustration; identical small marginals do not determine full radiation state or an evaporation law.'}

print(json.dumps({'scope':'Bounded foundations audit, not full derivation verification','thermal_cases':thermal_checks(),'channel_conditions':channel_checks(),'marginal_vs_joint':marginal_checks()},indent=2))
