diff --git a/notes/p681-cylinder-sector-bridge-20260912.md b/notes/p681-cylinder-sector-bridge-20260912.md new file mode 100644 index 00000000..1a357ac5 --- /dev/null +++ b/notes/p681-cylinder-sector-bridge-20260912.md @@ -0,0 +1,177 @@ +# #681 reviewed: an exact width-two torus/cylinder bridge + +2026-09-12. Supersedes the first #705 retrieval note's proposed O1. Its useful +primary-source reading is retained below; the first version remains in Git +history. The missing small calculation is now completed, not a new task. + +## 1. Exact local object, not a tautological configuration-diagonal operator + +Take the axis square-site torus with periods (2,0),(0,m), m>=2. It has 2m sites; +every square has four distinct corners. Retain the two periodic edges between +the same two row vertices as different lifted edges, not a collapsed simple +edge. The occupied graph is NN, the complement matching graph NN+NNN. Use the +existing digital-Alexander observable M=P2-P0=E[r_black-1]. + +Put x=p(1-p), y=p^2. A row is empty, left-only, right-only or both, with weights +(1-p)^2,x,x,y. On the three NONEMPTY states (left,right,both), define + + K = [[1,0,1], [0,1,1], [1,1,1]], + T = K diag(x,x,y) = [[x,0,y], [0,x,y], [x,x,y]]. + +This is a local row transfer. tr(T^m) is the total Bernoulli weight of cyclic +nonempty row words with overlap between every pair of consecutive rows. + +**Lemma (event dictionary).** + + P2 = tr(T^m) - 2*x^m, + P0 = (1-p^2)^m - 2*x^m, + M_{2,m}(p) = tr(T^m) - (1-p^2)^m. (1) + +Proof. Without a fully occupied row there are no horizontal occupied edges. +A nonzero longitudinal cycle then exists only if every row is the same +singleton, left or right. Consequently no horizontal cycle and no longitudinal +cycle has weight [(1-p)^2+2x]^m-2x^m=(1-p^2)^m-2x^m. +If there is a both-occupied row, a transverse cycle is present. A longitudinal +cycle exists exactly when every interface has occupied overlap: an empty row +or adjacent opposite singletons is a cut; conversely overlapping interfaces can +be joined within each full row into a closed longitudinal walk. With no full +row, the two all-singleton words are rank one, so subtract 2x^m from tr(T^m). +The cycles coexist in a component (or directly use intersection), giving rank +2. This proves the configuration classification and hence (1), at every m>=2. +No census is used in the proof. + +For a fugacity convention v=p/(1-p), (1+v)^(2m) M is the corresponding signed +site-count polynomial. Do not confuse this site fugacity with an independent +FK bond variable or change the number of local cells without a geometry map. +The presentation uses normalized Bernoulli weights throughout. + +## 2. The complete spectrum settles the finite-length question + +The antisymmetric row vector has eigenvalue x. On the left/right-symmetric +subspace the transfer is [[x,y],[2x,y]], with characteristic equation + + lambda^2 - p*lambda - p^3(1-p) = 0. + +Thus + + lambda_± = p/2 [1 ± sqrt(1+4p-4p^2)], + M_{2,m} = lambda_+^m + lambda_-^m + x^m - lambda_c^m, + lambda_c = 1-p^2. (2) + +For 00 for EVERY m>=2. Since M is strictly +increasing (the existing monotone-rank argument), its unique interior root +p_{2,m} is strictly below q for every finite m. This gives a particularly clear +failure of finite-root equality despite equal leading coefficients. + +Let h(p)=log(lambda_+/lambda_c), r=x(q)/lambda_c(q)=q/(1+q). Then h'(q)>0 and + + p_{2,m}-q = - r^m/[m h'(q)] + * [1+(-q^2/(1-q^2))^m+O(r^m)]. (3) + +Here r=0.361103080528647... and h'(q)=3.353388815848793.... Divide (2) by +lambda_c^m, expand e^(m h) around q, and use the two uniform subleading ratios +strictly below one. The root displacement is O(r^m/m); differentiating the +subleading terms and the leading exponential changes the relative remainder +by O(r^m). This also proves convergence at fixed width without exchanging limits. + +Selected exact-root diagnostics (rational isolation intervals are in JSON): + +| m | p_{2,m} | (p_{2,m}-q) / [-r^m/(m h'(q))] | +|---|---|---| +| 2 | 0.5411961001461969844 | 1.23450 | +| 4 | 0.5638649868188458323 | 1.05138 | +| 8 | 0.5651869150079729083 | 1.00241 | +| 12 | 0.5651975952151489695 | 1.000115 | +| 20 | 0.5651977173624504152 | 1.00000027 | + +These are finite-width diagnostics, NOT estimates or bounds for the infinite +square-site p_c. Fixed width violates the expanding-geometry hypothesis of +#613; taking m->infinity here must not be confused with an all-directions limit. + +## 4. General conditional lemma: what coefficients actually do + +Suppose, at a fixed width near an isolated crossing p0, + + Z_o=c_o(p) lambda_o(p)^m [1+epsilon_o,m(p)], + Z_c=c_c(p) lambda_c(p)^m [1+epsilon_c,m(p)], + +with c_o,c_c positive and C2, simple positive leading eigenvalues, a uniform +spectral gap giving epsilon and its needed derivatives exponentially small, +and h=log(lambda_o/lambda_c), h(p0)=0, h'(p0)!=0. The nearby balance root obeys + + p_m-p0 = log[c_c(p0)/c_o(p0)]/[m h'(p0)] + + O(m^-2 + rho^m/m). + +Nonzero unequal coefficients can create a 1/m displacement without changing +the limiting crossing. Equal coefficients AT the crossing remove that 1/m +term; they do not remove subleading spectra. Width two is the explicit case +where those remaining terms and their coefficient are now known. An all-m +two-mode identity would require cancellation of EVERY other observable spectral +mode (including Jordan-polynomial terms), not merely equality of two prefactors. + +No width-uniform estimate is established here. A general local bridge needs a +specified closure and its full observable spectrum; an absent literature +formula is not a no-go theorem. The fixed-width correction above does not +supply any n^-4 or L^-4 outer-limit theorem. + +## 5. Primary reading retained, with corrections + +Jacobsen, J. Phys. A 48 (2015) 454003, arXiv:1507.03027v1: +https://arxiv.org/html/1507.03027v1 — PRIMARY_TEXT_READ, §§2–4,6.1,8–9. +Eqs. (4),(9),(11)–(13) describe the signed graph polynomial and the fixed-width +cylinder eigenvalue method. Eq. (32) gives the square-site local loop operator. +Table 2 supplies the n=2 comparison above. Eq. (50) is an OBSERVED convergence +law: the text after (50) explicitly says more ingredients are needed to deduce +it from (49). It is not a theorem supplied by that CFT argument. + +The spin-twist Eq. (55) is not a literal q=1 bridge: q=1 has only twist zero, +and its factor (1-1/q) vanishes, leaving 0=0. Work in the FK/loop construction +at q=1 unless an actual continuation is provided. Eq. (24)'s width-one Potts +example is not by itself a theorem for all square-site local operators. + +Mertens–Ziff, PRE 94 (2016) 062152, arXiv:1603.07289v2: +https://arxiv.org/html/1603.07289v2 — PRIMARY_TEXT_READ, §II, Eqs. (20)–(21). +These give the finite matching/event identity and its all-equals-none relation; +the quoted root exponent is empirical. Jacobsen 2024 Reply remains +ABSTRACT_ONLY in the original retrieval; no claim here needs its unavailable body. + +## 6. Executed checks and decision + +`scripts/width2_cylinder_exact.py` derives integer coefficients by the trace +recurrence. An independent lifted-homology traversal enumerated all 5456 +configurations across 2x2,...,2x6 and reproduced EVERY coefficient. It preserves +parallel periodic edges; no row-compatibility code is used by that verifier. +The 2x2 control is -1+4p^2-2p^4. A second integer matrix-power check at p=1/2 +agrees exactly. Three local tests passed. Finite roots carry 100-bisection exact +rational brackets; spectral decimals are explicitly diagnostic. + +Result: `results/research-control-20260912/width2-cylinder-exact.json`. +The suggested smallest #681 calculation is done and its premise corrected. +Do not commission it again. This is a useful local theorem, not a reason to +build a large transfer engine before defining an all-width scientific target. diff --git a/results/research-control-20260912/width2-cylinder-exact.json b/results/research-control-20260912/width2-cylinder-exact.json new file mode 100644 index 00000000..59c36bba --- /dev/null +++ b/results/research-control-20260912/width2-cylinder-exact.json @@ -0,0 +1,28 @@ +{ + "schema": "matching-one.width2-cylinder-exact.v1", + "scope": "axis square-site 2-by-m honest torus, m>=2; row transfer, not an all-width pTL intertwiner", + "cylinder_minimal_polynomial_low_first": [-1,0,2,2], + "cylinder_root_diagnostic": "0.565197717383639396437528013247030816098483976759553827555484", + "cylinder_root_isolation": ["716473225688995647843441073053/1267650600228229401496703205376","358236612844497823921720536527/633825300114114700748351602688"], + "published_n2_agrees_within_1e_minus_40": true, + "hprime_diagnostic": "3.35338881584879266732701434488", + "decay_ratio_diagnostic": "0.361103080528647377634646562159", + "finite_m_defect_at_crossing": "[p(1-p)]^m + lambda_minus^m > 0", + "equal_leading_coefficients": true, + "small_exact_checks": { + "2":{"configurations":16,"coefficient_identity":true,"power_coefficients":[-1,0,4,0,-2],"bernstein_counts":[-1,-4,-2,4,1]}, + "3":{"configurations":64,"coefficient_identity":true,"power_coefficients":[-1,0,3,2,-3],"bernstein_counts":[-1,-6,-12,-6,6,6,1]}, + "4":{"configurations":256,"coefficient_identity":true,"power_coefficients":[-1,0,4,0,-4,0,8,-8,2],"bernstein_counts":[-1,-8,-24,-32,-14,8,16,8,1]}, + "5":{"configurations":1024,"coefficient_identity":true,"power_coefficients":[-1,0,5,0,-10,2,10,10,-25,10],"bernstein_counts":[-1,-10,-40,-80,-80,-30,10,30,30,10,1]}, + "6":{"configurations":4096,"coefficient_identity":true,"power_coefficients":[-1,0,6,0,-15,0,22,0,3,-36,24,0,-2],"bernstein_counts":[-1,-12,-60,-160,-240,-192,-62,12,48,76,48,12,1]} + }, + "finite_roots": { + "2":{"exact_rational_bracket":["686047561191503557021216148973/1267650600228229401496703205376","343023780595751778510608074487/633825300114114700748351602688"],"root_diagnostic":"0.5411961001461969843997232054","root_minus_cylinder":"-0.024001617237442412038","leading_shift":"-0.019442337576693110926","shift_over_leading":"1.23450264880777"}, + "3":{"exact_rational_bracket":["355549303266821127964730592771/633825300114114700748351602688","711098606533642255929461185543/1267650600228229401496703205376"],"root_diagnostic":"0.5609578904515291298145210442","root_minus_cylinder":"-0.004239826932110266623","leading_shift":"-0.0046804586610811728968","shift_over_leading":"0.905857147583668"}, + "4":{"exact_rational_bracket":["357391894494296289553025491317/633825300114114700748351602688","714783788988592579106050982635/1267650600228229401496703205376"],"root_diagnostic":"0.5638649868188458323132883434","root_minus_cylinder":"-0.0013327305647935641242","leading_shift":"-0.0012675960306025498953","shift_over_leading":"1.0513842995864"}, + "6":{"exact_rational_bracket":["179082998271309469420869525275/316912650057057350374175801344","716331993085237877683478101101/1267650600228229401496703205376"],"root_diagnostic":"0.5650863045039923213956181244","root_minus_cylinder":"-0.00011141287964707504191","leading_shift":"-0.00011019249034646421821","shift_over_leading":"1.01107506779068"}, + "8":{"exact_rational_bracket":["358229766025499066655359611415/633825300114114700748351602688","716459532050998133310719222831/1267650600228229401496703205376"],"root_diagnostic":"0.565186915007972908279837917","root_minus_cylinder":"-0.00001080237566648815769","leading_shift":"-0.000010776448265112279807","shift_over_leading":"1.00240593196738"}, + "12":{"exact_rational_bracket":["716473070822035429147772801381/1267650600228229401496703205376","358236535411017714573886400691/633825300114114700748351602688"],"root_diagnostic":"0.5651975952151489694908387443","root_minus_cylinder":"-1.2216849042694668927e-7","leading_shift":"-1.221544134534600044e-7","shift_over_leading":"1.0001152391722"}, + "20":{"exact_rational_bracket":["89559153207766927876597427951/158456325028528675187087900672","716473225662135423012779423609/1267650600228229401496703205376"],"root_diagnostic":"0.5651977173624504151631723659","root_minus_cylinder":"-2.1188981274355647314e-11","leading_shift":"-2.1188975555815298611e-11","shift_over_leading":"1.00000026988281"} + } +} diff --git a/scripts/width2_cylinder_exact.py b/scripts/width2_cylinder_exact.py new file mode 100644 index 00000000..7f98f553 --- /dev/null +++ b/scripts/width2_cylinder_exact.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +"""Exact 2-by-m square-site torus probabilities and their cylinder limit. + +No new percolation production. Bernoulli-polynomial coefficients are integers. +A width-two occupied row makes a transverse cycle; both periodic bonds must +be retained even though their endpoint pairs coincide. m >= 2 is required. +""" +from __future__ import annotations +import argparse +from fractions import Fraction +import json +from math import comb +from pathlib import Path + + +def add(a, b): + out = [0] * max(len(a), len(b)) + for i, v in enumerate(a): out[i] += v + for i, v in enumerate(b): out[i] += v + while len(out)>1 and out[-1]==0: out.pop() + return out + + +def mul(a, b): + out = [0] * (len(a)+len(b)-1) + for i, u in enumerate(a): + for j, v in enumerate(b): out[i+j] += u*v + while len(out)>1 and out[-1]==0: out.pop() + return out + + +def power(a, m): + out = [1] + for _ in range(m): out = mul(out,a) + return out + + +def evaluate(a, p): + out = 0 + for v in reversed(a): out = out*p+v + return out + + +def matching_polynomial(m): + """Integer power coefficients, low degree first, from a 3-state trace.""" + if m < 2: raise ValueError('honest two-by-m torus requires m >= 2') + # Symmetric 2-state block: trace=p, determinant=-p^3(1-p). + # tr(block^m)=p*tr(block^(m-1))+p^3(1-p)*tr(block^(m-2)). + previous, current = [2], [0,1] + for _ in range(2,m+1): + previous,current = current,add(mul([0,1],current),mul([0,0,0,1,-1],previous)) + return add(add(current,power([0,1,-1],m)),[-x for x in power([1,0,-1],m)]) + + +def ambient_rank(mask, m): + """Independent lifted-edge graph traversal; not a row compatibility test.""" + if m < 2: raise ValueError('m >= 2 required') + n = 2*m + positions, span = {}, [] + for root in range(n): + if not (mask>>root)&1 or root in positions: continue + positions[root] = (0,0) + stack = [root] + while stack: + v=stack.pop(); x,y=v%2,v//2; px,py=positions[v] + for dx,dy in ((1,0),(-1,0),(0,1),(0,-1)): + u=((y+dy)%m)*2+(x+dx)%2 + if not (mask>>u)&1: continue + proposed=(px+dx,py+dy) + if u not in positions: + positions[u]=proposed;stack.append(u) + else: + wx,wy=proposed[0]-positions[u][0],proposed[1]-positions[u][1] + if wx%2 or wy%m: raise AssertionError('nonperiodic cycle displacement') + wx,wy=wx//2,wy//m + if wx or wy: + if not span: span.append((wx,wy)) + elif span[0][0]*wy-span[0][1]*wx: return 2 + return len(span) + + +def enumerated_polynomial(m): + """Tiny independent exact census, collapsed by occupation count.""" + n=2*m; bern=[0]*(n+1) + for mask in range(1<1 and poly[-1]==0: poly.pop() + return poly,bern + + +def root_bracket(poly, steps=100): + lo,hi=Fraction(0),Fraction(1) + for _ in range(steps): + mid=(lo+hi)/2 + if evaluate(poly,mid)<0: lo=mid + else: hi=mid + return [str(lo),str(hi)] + + +def report(max_check=6): + from mpmath import mp + with mp.workdps(70): + q=mp.findroot(lambda p:2*p**3+2*p**2-1,('0.55','0.58')) + x=q*(1-q); lc=1-q*q + lp_derivative=(lc+3*q*q-4*q**3)/(2*lc-q) + hprime=lp_derivative/lc+2*q/lc + checks={} + for m in range(2,max_check+1): + got,bern=enumerated_polynomial(m); expected=matching_polynomial(m) + if got!=expected: raise AssertionError(f'coefficient disagreement m={m}') + checks[str(m)]={'configurations':1<<(2*m),'coefficient_identity':True, + 'power_coefficients':expected,'bernstein_counts':bern} + roots={} + for m in (2,3,4,6,8,12,20): + poly=matching_polynomial(m); bracket=root_bracket(poly) + lo,hi=map(Fraction,bracket) + root=(mp.mpf(lo.numerator)/lo.denominator+mp.mpf(hi.numerator)/hi.denominator)/2 + predicted=-(x/lc)**m/(m*hprime) + roots[str(m)]={'exact_rational_bracket':bracket,'root_diagnostic':mp.nstr(root,28), + 'root_minus_cylinder':mp.nstr(root-q,20), + 'leading_shift':mp.nstr(predicted,20), + 'shift_over_leading':mp.nstr((root-q)/predicted,15)} + return {'schema':'matching-one.width2-cylinder-exact.v1', + 'scope':'axis square-site 2-by-m honest torus, m>=2; row transfer, not an all-width pTL intertwiner', + 'cylinder_minimal_polynomial_low_first':[-1,0,2,2], + 'cylinder_root_diagnostic':mp.nstr(q,60), + 'cylinder_root_isolation':root_bracket([-1,0,2,2]), + 'published_n2_agrees_within_1e_minus_40':bool(abs(q-mp.mpf('0.5651977173836393964375280132470308160984')) 0', + 'equal_leading_coefficients':True,'small_exact_checks':checks,'finite_roots':roots} + + +if __name__=='__main__': + ap=argparse.ArgumentParser();ap.add_argument('--out',type=Path);args=ap.parse_args() + text=json.dumps(report(),indent=2,allow_nan=False)+'\n' + if args.out: + args.out.parent.mkdir(parents=True,exist_ok=True) + with args.out.open('x') as f:f.write(text) + else: print(text,end='') diff --git a/tests/test_width2_cylinder_exact.py b/tests/test_width2_cylinder_exact.py new file mode 100644 index 00000000..e6874d67 --- /dev/null +++ b/tests/test_width2_cylinder_exact.py @@ -0,0 +1,24 @@ +import sys +from pathlib import Path +from fractions import Fraction +import unittest +sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'scripts')) +import width2_cylinder_exact as w + +class WidthTwo(unittest.TestCase): + def test_all_coefficients_from_independent_winding(self): + for m in (2,3,4,5): + self.assertEqual(w.matching_polynomial(m),w.enumerated_polynomial(m)[0]) + def test_known_l2_control(self): + self.assertEqual(w.matching_polynomial(2),[-1,0,4,0,-2]) + def test_probability_trace_at_half(self): + # At p=1/2, T=K/4. Check trace directly with integer powers. + k=[[1,0,1],[0,1,1],[1,1,1]] + a=[[int(i==j) for j in range(3)] for i in range(3)] + for m in range(1,8): + a=[[sum(a[i][l]*k[l][j] for l in range(3)) for j in range(3)] for i in range(3)] + if m>=2: + self.assertEqual(w.evaluate(w.matching_polynomial(m),Fraction(1,2)), + Fraction(sum(a[i][i] for i in range(3))-3**m,4**m)) + +if __name__=='__main__':unittest.main()