#!/usr/bin/env python3 """ Computation 64 -- Lemma 7(b) numerical-fit-stability diagnostic ================================================================ Comp 63 measured the leading constant c_1(k) in the finite-N gap expansion gap(k, N) := ratio(k, N) - 2 sqrt(k) = c_1(k)/N + c_2(k)/N^2 + O(1/N^3) for k = 1..12 with N up to 34 using a 2-parameter least-squares fit, and reported the empirical uniform bound |c_1(k)| <= 2.7. This computation diagnoses the STABILITY of that fit by re-extracting c_1(k) for k = 1..24 under a 3-parameter least-squares fit gap(k, N) ~= c_1/N + c_2/N^2 + c_3/N^3 on the SAME N range that Comp 63 used. The diagnostic finding is sharp: for k = 1 the 2-param and 3-param fits agree (c_1 = -1.000 to four decimals, matching the closed-form theorem of Comp 60), but for k >= 2 the two fits disagree both in magnitude and (frequently) in SIGN. This means the empirical "|c_1(k)| <= 2.7" certificate of Comp 63 was an underdetermined-fit artifact: at the moderate N values reachable on a single workstation (N <= 34, Bergman dim <= 620), the leading 1/N behaviour is not yet isolated from the 1/N^2, 1/N^3, ... structure for k >= 2. Reliable per-k extraction of c_1(k) requires N significantly larger than the bridge's characteristic scale m(k) -- a regime that is out of reach for direct dense linear algebra at k = 12 and above. Consequence: the FOUNDATIONAL content of Lemma 7(b) -- the uniform-in-k control of c_1(k) -- cannot rest on the empirical extraction alone. It is closed analytically in Comp 65 via the classical Bergman-Toeplitz polynomial-symbol convergence rate, giving the explicit bound |c_1(k)| <= C^* (m(k) + 1) for an absolute constant C^* with m(k) <= 2 sqrt(k) by Lemma 5(b), hence |c_1(k)| = O(sqrt(k)) uniformly. The QGH-convergence application at matched scaling N(D) ~ 2 sqrt(D), k <= k_D ~ 2 sqrt(D) gives the L_comm closure rate gamma_D = O(sqrt(k_D) / sqrt(D)) = O(D^{-1/4}) which is sufficient for Rieffel's theorem to yield QGH convergence of the Bergman truncation to the full Bergman algebra. The previous empirical estimate of O(1/sqrt(D)) was an artifact; the analytical O(D^{-1/4}) is the rigorous statement. The explicit per-k value of c_1(k) for k >= 2 remains a quantitative question deferred to large-N (N >> m(k)) numerical work; it does not affect the foundational closure. """ import math import numpy as np import numpy.linalg as la import sys sys.path.insert(0, "computations") from computation_59 import ( bergman_basis, J_matrices, D_alpha, T_bridge, lcomm_ratio, m_of_k, alpha_of_k, ) def fit_gap(k, N_values, n_params=2, dim_cap=620): """Least-squares fit of gap to (c_1/N + c_2/N^2 + ...) up to n_params terms.""" Ns_arr, gaps_arr = [], [] I2 = np.eye(2, dtype=complex) target = 2.0 * math.sqrt(k) for N in N_values: basis = bergman_basis(N) dim = len(basis) if dim > dim_cap: continue Jp, Jm, Jz = J_matrices(basis, alpha_Bergman := 0.0) D_op = D_alpha(Jp, Jm, Jz) T_b = T_bridge(basis, 0.0, k) if la.norm(T_b) < 1e-12: continue R = lcomm_ratio(T_b, D_op, dim, I2) Ns_arr.append(N) gaps_arr.append(R - target) if len(Ns_arr) < n_params + 1: return None Ns = np.array(Ns_arr, dtype=float) gs = np.array(gaps_arr, dtype=float) A = np.column_stack([1.0 / Ns ** (i + 1) for i in range(n_params)]) coef, _, _, _ = la.lstsq(A, gs, rcond=None) pred = A @ coef return tuple(float(c) for c in coef) + (float(np.max(np.abs(gs - pred))),) def main(): print("=" * 100) print(" Computation 64 -- Lemma 7(b) numerical-fit-stability diagnostic") print("=" * 100) print() print(" Compare 2-parameter vs 3-parameter least-squares fits of c_1(k) on N in [N_min, 34].") print(" A stable c_1 extraction requires both fits to AGREE. Disagreement = empirical c_1(k)") print(" cannot be trusted at this N range.") print() print(f" {'k':>3} {'m(k)':>5} {'alpha(k)':>10} " f"{'c_1 (2-param)':>15} {'c_1 (3-param)':>15} {'sign flip?':>11}") K_MAX = 24 sign_flip_count = 0 measurable_count = 0 max_abs_2p, max_abs_3p = 0.0, 0.0 for k in range(1, K_MAX + 1): m = m_of_k(k) a_k = alpha_of_k(k) N_min = 2 * (m + 1) + 2 N_max = 34 N_values = list(range(N_min, N_max + 1, 2)) if len(N_values) < 4: print(f" {k:>3} {m:>5} {a_k:>+10.4f} (N range too narrow; skip)") continue r2 = fit_gap(k, N_values, n_params=2) r3 = fit_gap(k, N_values, n_params=3) if r2 is None or r3 is None: continue c1_2 = r2[0] c1_3 = r3[0] sign_flip = (c1_2 * c1_3 < 0) and (abs(c1_2) > 0.05 and abs(c1_3) > 0.05) if sign_flip: sign_flip_count += 1 measurable_count += 1 max_abs_2p = max(max_abs_2p, abs(c1_2)) max_abs_3p = max(max_abs_3p, abs(c1_3)) flag = "*** YES ***" if sign_flip else "no" print(f" {k:>3} {m:>5} {a_k:>+10.4f} " f"{c1_2:>+15.4f} {c1_3:>+15.4f} {flag:>11}") print() print("=" * 100) print(" Diagnostic conclusion") print("=" * 100) print() print(f" Measured k: {measurable_count}.") print(f" Sign flips between 2-param and 3-param fits: {sign_flip_count}.") print(f" max |c_1| under 2-param fit: {max_abs_2p:.3f}") print(f" max |c_1| under 3-param fit: {max_abs_3p:.3f}") print() print(" For k = 1, both fits agree (with the Comp 60 closed-form theorem c_1 = -1).") print(" For k >= 2, the two fits disagree dramatically -- often by factor 2-10x in") print(" magnitude, and frequently in sign. This means c_1(k) for k >= 2 cannot be") print(" reliably extracted from the N <= 34 range; the leading 1/N term is not yet") print(" separated from the 1/N^2, 1/N^3 structure at moderate N.") print() print(" The foundational uniform-in-k bound is closed analytically in Comp 65 via the") print(" classical Bergman-Toeplitz polynomial-symbol convergence rate.") if __name__ == "__main__": main()