From 67f12b6bef1e25f649bd62edae36cd144fe19899 Mon Sep 17 00:00:00 2001 From: Ali Romman <226877337+aliromman@users.noreply.github.com> Date: Sun, 25 Oct 2026 21:20:23 -0500 Subject: [PATCH 1/3] Prove all-order coupled-star obstruction with exact free-algebra certificates --- .../CERTIFICATE-SUMMARY.json | 11 + .../DISCOVERY-RESULTS.json.gz | Bin 0 -> 22054 bytes .../longer-coupled-port-caller/DISCOVERY.md | 92 ++++++++ .../ORDER-CERTIFICATES.json.gz | Bin 0 -> 108057 bytes research/longer-coupled-port-caller/PROOF.md | 197 ++++++++++++++++++ research/longer-coupled-port-caller/README.md | 74 +++++++ .../longer-coupled-port-caller/REFRESH.json | 17 ++ .../longer-coupled-port-caller/RESULT.json | 64 ++++++ .../longer-coupled-port-caller/SOURCES.json | 52 +++++ research/longer-coupled-port-caller/TASK.json | 102 +++++++++ .../VALIDATION.json | 20 ++ .../longer-coupled-port-caller/VERIFY.json | 21 ++ .../build_certificates.py | 32 +++ .../check_certificates.py | 152 ++++++++++++++ .../model_checks.py | 197 ++++++++++++++++++ .../longer-coupled-port-caller/nc_star.py | 116 +++++++++++ .../search_coupled.py | 137 ++++++++++++ .../search_orders.py | 56 +++++ .../longer-coupled-port-caller/search_star.py | 155 ++++++++++++++ research/longer-coupled-port-caller/verify.py | 67 ++++++ 20 files changed, 1562 insertions(+) create mode 100644 research/longer-coupled-port-caller/CERTIFICATE-SUMMARY.json create mode 100644 research/longer-coupled-port-caller/DISCOVERY-RESULTS.json.gz create mode 100644 research/longer-coupled-port-caller/DISCOVERY.md create mode 100644 research/longer-coupled-port-caller/ORDER-CERTIFICATES.json.gz create mode 100644 research/longer-coupled-port-caller/PROOF.md create mode 100644 research/longer-coupled-port-caller/README.md create mode 100644 research/longer-coupled-port-caller/REFRESH.json create mode 100644 research/longer-coupled-port-caller/RESULT.json create mode 100644 research/longer-coupled-port-caller/SOURCES.json create mode 100644 research/longer-coupled-port-caller/TASK.json create mode 100644 research/longer-coupled-port-caller/VALIDATION.json create mode 100644 research/longer-coupled-port-caller/VERIFY.json create mode 100644 research/longer-coupled-port-caller/build_certificates.py create mode 100644 research/longer-coupled-port-caller/check_certificates.py create mode 100644 research/longer-coupled-port-caller/model_checks.py create mode 100644 research/longer-coupled-port-caller/nc_star.py create mode 100644 research/longer-coupled-port-caller/search_coupled.py create mode 100644 research/longer-coupled-port-caller/search_orders.py create mode 100644 research/longer-coupled-port-caller/search_star.py create mode 100644 research/longer-coupled-port-caller/verify.py diff --git a/research/longer-coupled-port-caller/CERTIFICATE-SUMMARY.json b/research/longer-coupled-port-caller/CERTIFICATE-SUMMARY.json new file mode 100644 index 0000000000..4d4738071f --- /dev/null +++ b/research/longer-coupled-port-caller/CERTIFICATE-SUMMARY.json @@ -0,0 +1,11 @@ +{ + "orders": 75600, + "degree_counts": { + "2": 72020, + "3": 3580 + }, + "largest_witness_terms": 77, + "uncompressed_bytes": 6472926, + "compressed_bytes": 108057, + "sha256": "2e9279611423b0fc0488780e10cc8ac4ce3397f9c3f1809dd0ab294f4987ed1a" +} diff --git a/research/longer-coupled-port-caller/DISCOVERY-RESULTS.json.gz b/research/longer-coupled-port-caller/DISCOVERY-RESULTS.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..2d36583fe9802e13044e63d58de8e5e0dc9f4e25 GIT binary patch literal 22054 zcmcha@MRupOX9=M}GeuD;L#((x4ddZ^ z+O(L%D)kOUf zsaIjjV~ZYOb8>T(S;5cA#k&K8e8z}(zzw{g&9SOpt;Vs1LuEq;mJ z9EZlZqeY^y*4WMAnIsZ6tbFPmt$l{48Fq4xMjs{z@<;m^*ty^k-e6#n<>~?e_V*q%+M6G zV&+*zL$96PT#@_6K1z9|3;o&2?R0`qai(Fyx#Bg*S!Zuf0>AeOYx%e{7rCg=^{+e@hJ&@P5fb zc#*cC?toX+-9svLLO}6iUA+$B+n09JWe`cL--ugzWIa?@@jD|Tq^KqS*}bl@hq^!B zdQSp(7Y@4GY2Vi?Lj16xE@r>>d#`MSCcfvk1)=zbm(UsK?evpQ#fyC{@#<@>=yz5) z@1~zTRlMKyp`45I|Nos5{>5dXbF8|HjmNL2p)XDE67T5jj9eTq9pzor+wa*Yn65xX zbI0Kw9Iwc4Q+c*{zBhLdL2phKFWyUCyZ>hU{nuM!>|F(lzcXOCOANOdHLAOu$dPx6 zf7qX>u3{Nq4-<4e{_%Vx1Aod;3WxbaD#3`F+)W%^s0vnv)iHxZS?5knb(EIkpWHNQs0!tGaU<~qcDl3v zKK!Ywq^LHHwU&N$+2q|JpEpx1nU-M{WyQ0fznaL~VWqyp?w6$xJ56j2_~P5g^$+$O z_wtat=P{{_ugY7F->dF^$1s_=|E^L6rMuA*M=`md-i9=&+;LFF zHnLUv`oxlUzU>+9t>c{bU!L@$wBNsv!&&Mr&#TW@ta5z&wEc2wV>BZvA@yyqr?JU_ z=#!t&1Gi}m$ABaoB5hgMtMieX_};dz%M6;rPOzHQHfbaVP^dY&}47i&=O z^C#PN^;YRk>82`IIqvxBZe3amjiIn3>cNv(7oky!XHR$mW2k`e^wcr`XO;2Ys#qqw zpiV3)_gzSn${Xlzno5b6uFW5Yr~35lVxe7$<*xpkU)DKSkEu@gs_CL%GZcTT{<^OK z9hAQuZ=yEPBCoM?NxJ+vLFskRs*j&=Uzduue@>>>o%Rnt)QltlAw&G+>?~Y$HDC|p zwx^hS_|%Ah$!dH+0b0fAbWTUhY8zDQ)Yle`x*j2Gbm^mBt9VAvSvkfXMh?ahwZJhs zwch!|agz`^;=0mD0WwgCv6Q=X0mGmx>^R$($Q6?cY-D>*ewWLXl&%%ksNPPQcp}VJe4*&3prYou1m`Bks?>Fb&H=gwy*Rh2;}uqD(jy`l z_pm7lr>$n}ybD9rDct0*h~q4cxoG5{XhL_`@oDQNUE(bmlas7fsVXq8@mqSbF=F@; z?@}~A-Dq?o++`5>Y4rnN&mdzKy=$P(Gl6J$s;J4O(s9T2Cv#aY&)gg|Puay5!KjU@ z;~Yd)FORg0#YxyqxKA9Q>U?RVMm_Woz9_?X5|hiCh;|51S9Oj(A7Um)>~}U^+dX>F z!+G3ASUBoSGPT7_7hRcEXO`&ZxAb_$^><6_dtvSu?oeMrPEsv(KCYWW z+<)q=^RKd&>YJEjH|3Be{JDia`r1slk61{g!@|=YljMq}?wSg&S!l9#aDjhMHg_{y zRYI@1cQn|*XG7n;M;Bog7i(;%s3#LCUnP?@RCBm3AL0^5lMb!6Q15GcCgaj*=%4gO z9qs17Xt3b&>R0Wp$6gjDsTR+c<^7U+ou3FRx71eAbI{oK%hz2EGu%nnq4p_t2eG8d zHkVOvG4V@RQ$xfVE-qpTO6@MAz3Ua1yx+`MBqzk}_m3Fm9283pBK%y32sby=W2 z65Pvn7E4H-Lgh&uJ{h7MwaFQSxwHCeKs{rz_N(a6?9jKpnc^YZ>QQeM2iT4K&&+ZW z5s4ix^=s`%5601_&8DNvg;W{*fQL(IKh5b{5ft7POK+I1sF>>$o#Qo%vZm=p`meyL z#`l=0i%zra?6ArzS{Q%s6p6No(_{HWBWli&{kc(U26eDd8BuaQ+% z5fpp=s@{>!5vxkux}B5TRLZ49LSJf0^9D_pM`F4*rw?Go_D+Sw5E|T{(jq)j6?Q8 zt7i}7#~rwQzkS%5bg9)+(_J^~B>&P2YT3WXK=CPRjy3|(+laz0_oWYbv^cwdukAi6y)^rRcDvGrP5;M`Eppb4ukffqA*^b3)m zM=?p=`8EIkPfIXO8{bV(9&2f>i2j`)u*crr6!+7s<^yi0j;c0C4EjABz{Q^#2%@#9HO__YNUrLtg$=)%lIF z%=u3C>bTnV?7BtLTW!_np7c4)g#St_E)s1TuFNO;(h|HEySsC8Y?~U}x7@;U)pE=t zIFYyNj7^faGL;WWjIYm)#HXEiWA_=>H$_pxUaikMo2Bt(wsBlPlQMGl54}f}w`cx% zdGCEBLvxDvK5&;4*OW4@f9u4vuP^G(Ykz(3qI0ie*V2Bwp& zmrELV2t(9zi+jpNEI^mPm=WcsuU*_jER*^d{n(0$ z+lwxsi?1E{XID)3epoBJNG^3b(yzbCny=Gy=jDGX_Tjg;(sw9Z|D!X9F7D}&xc_fa zi!bc&sQi~GJC_w1L#O^ZTrYCBEtQE33zW_JFFB9D&B71bhHl(@D$)Cw{~9P55$3>u zw6J|?L(IB=>vMKRhP3|bf3{HZ__y=4^Iv<0 z-oHJ+qf_*k;E$M+94Cp85Qz|%giyBAunKPjTj8s$XjT7<*Z65x{LO-LJGAsnbF&FC zCUkHXcUHS+^P#++`wI54r171VvElWrImZqOU+{6dGkQDHrt|CVAAe2Hz4wsKe)xIy zZ%<#VQ)l_+hu?{`jix`an2`}C$F;rNfBdDt=Z*c1>FMD1-!I+Hz4g~Gi+_mN;P_*m z-tCdqs~4EtZngXVJ3e}wt5fyy@3L0~-TFbFH zWvzG5pd{r^hi&d@Won&2rfnx-aHV9XrNhK>OOeF%$ivpP5wmL}cCS{!+deOkxmOYM zR3*N#Pjc|sQ%SwC3bppR`-N#2I=pD6cV{V-Q>Pl2E!h^fA!N|vDY`&QI9{?9^OL_( zvn5#~iTqV=i>378Qr4Go$Cl7%9czd3Lz_dN?aq@gl0VnIPxQrXm(XdpRgrvTBtz8J zS?FmpzUso-;Fgh#=&4}ssbGt$Aqp#d^2Ovv^$vZS5c*g5lES2sYP*0HPN#Xodu3`i z^tAcP8IzCv^&7NnBOTdXTTA->3t2`!7i@6sFP0a@B zn}13{o^y}MH0hh9@3lU*kr%NZ6>s>?WOoC*U3>FZ)~0X2@x@b`DL21s%=ZdzYkrcs z=?9LDlbXGMDf{)D-9_y7#x_##56U5p1pV~AS@MQ|GnW8l zVmBF#(&`qd0SXOB{R=pUC=e4T^Q3x0Z1*}bUGH|j{}quEO_EVR|8OEQt0vo6c% ziL8sfo)#n1nP9Ku^78BH_b}*mx?^YMc)vpm-M;Q|rg(mbt#HV$JA_| zska%`*54+O<^S=mq?w>XB@373w_PBp$GrWz^0%g@XWoAkUdbBT{wJ{`^DpAzt$z~B z!~P;Z-t;Fi<@djcOE(CJWb{X?+%b8~^bijd%!y=GOm*?Y=KB1qNOL|xAwDDqlI3FR z>=q=smRQE3rw3En~WM|l1$`c~qZkf%IJR3a8NjZ?@C~B#&M|#uMcdX3AMsx2 zDC@qmaAx*ziM&h&x{+mHaiJ()CBK1R$}kdu0hVr_NT;LvxfYf*P7M1P>G29HBP_l(2f>l>{1@$_@f{7jkZ5wDCyIB ziU&RE4v&wF)9!YYsV#+WYA#JVEoUQ=C^!Z0Y!fK|Jwy-r%3bdkoAjEK1j2PwrSG|g zxXLloHLK5~_wScuhz{O**vZ-*Sra++=BT`@Ok_=bU)iPrk+`FYqzqNMkv^yolEo(9 z8l(F4t-Dr8zAqHlc;u$EuUeqHzsL1Q+NU<^raEf&{c(H5Klby9D5=K6=4yXkt+&;_ zCRFVJ?^r3r{jAx-2i=^l8movwn{(fos*e``zKi1MRacJ@hiut#kSQkAc${%$N#GSH~&Q0@`lgze24IK14fj zyGf0a-4Tz9t>HcwdYD5&Z&|NiqWRF-``opfXsT?U>JmoG+hf0Eg;(OLt7Y<5E@4R8 zB%9$%#M>k;u?<=zd_C3~#@uz7o<-}&G+KA_nk8McI#&`IwMP{)B#6u!Q%7$6M7v&u z)Dx1G8B<1gRb#sH)65#2VCMt{U?aP^=k8DuLhK^OTW@+?Lv{b z#6Y9zC8_#OX}j>9`*2sN4c6VOG-cMSgH-CG$eP3D8__y1)~T6e^B?4({FSe!IYY&R ztKy~b<~^&tWi$i@g&80w`2Mwr^w;d*@{OV9m)EP=VXv~9?_P0VMo-gPyJbBG1jZ;{ zt3iq>5%a|w_pVTx){2>KB4mm|<|Jt1yfWQ+Kxy=<(5<9gq(6@u5dMXDb9TQ{xvtbb z50}lV>v>;m6H4xgRbO#GOHZS2G58ow6*@M0RjlQP8wC{{T~n^B{b;E7sp@)8N#Cg$ zWdkSMK9Q!!4*N7un9F9_yt+bdOIT=eu?v;!_P$GFn%wiNyk1OQyFo=IFVdkwDU+L- zHftJQV)H&agI~BCUfP0c5-l=kO`}U_0Y5vXTI=+S#$@m{jvzc^d(8PI5vC*`+Rxk1 z*0tM9_wZ!7k=pJXxrIWC9GODDT`GB0%dP#XIrm_n%5fu$t}h!9eVuXq*sCdhG1y}H z&=%~zEX?XO=TVsf(ft_#x|DwuHP}l#j>ibZF3+)_xhG=1?9w%>uq}GD9#oV3wWI72 z-9W9iM|lNF==Fxf8B-1QI*-xot&?ycZH~ytIexb=`Ll0-0I>RGlmSh{dv(t{SI}@parcS`psNKYw7RWQBp2F5!BsG@?UT1_f1i}#6Dbp`f+CJBUr!YHjYg>wS?oPHfw1gQ09I+^q4Dj zwXT)CP%|7Mw2=I^wMfGL6VXUyXG{i0iIqfrKotyU#;6iZj>hGZPL(U2bNzVBMJO&` z4ll0J)KjnLWQ2?5X+K*bc{?CVs;6uxEW+eO);m3?EK1t`7_L8*{9teMVpK;_O>NzI zw|9)9oE>3GR}mdcn(iAQbGZpk`Z$Rj_*gHg%kJR>q7y4|Uf0ewR$n-qP=X-bq&pYQ}{H9*;hQRs~j#BB>#rdqnDA-yZ8OmtGW7q2#51rrs&2N zW2gjc@93?%?`+XhR~eH5C&e^u3qPGYm{1vL)(7Ln3u=+qao1%rQr zuc0E%-7)7Wcr|=`_2YV8p_U=aaK#b>kmd!|8djD>v`XOFRQ}rux%}m+j=x7uptF~! zN*|Ez*nYbb2R4><=MFqw#aP7nO58$b?2uU92b6{1juXgaUN5;0lPS~Y7tFCLS^R!aH6^6l2|cE%v|~4JHsnk&-U^u`LYTZ1 z>k6ohMzdLw)x6%*$W%eqQCVkXj)65ppp-lj$lBJNQx^q*IK-;f!f-;pyFqxN50oMUKd!4#LaQYXp0kF*uB*}y3+{Z zDkEq(2o!n6j_=bgIk@2x+xVzDfl^Zaie2vK4!fh9(^>jxd8+y-D$Q*v@=yRfk~q??CamxQxW)~}^QxQQg@6E{PxP8*a z#!J;Y)KAi7G<-vaQ*hLyj%+44EMuA}`}#73ab>P~+Re=4t{X)6Zyv%mG*4;>{45k1 zpK{5Jo0d+&5h`&e)z_fJ+X1_T;YiP~EtJ&d?bNvO`aUN`-QT0DwVBYfJk>BDW2297 zB~B>Q=uqF%R71YOW^>`Z}OJgGXLoyC^hO&GFSIIy3d)Od#}Ld+w;KuQ$1erJbq$+ zY4uG@X|Gkk#10OogSgGQ0t=7`gE7q%tQQ;%M6JMVxX^Qto55~?MTS%g()_E^P8Vbm zLZ$d72=XQ-2q+k;vwJdH%ujtPyO@xKsfZXKq%=%}+H%YEXsMvK`76PvvHoEi(XIf3 z4UL7c3}->E(8l?vw8H$8vl)3NJw(izBAU&}y@!($tR+NT_a4F8fClIawI5Kch#WTa zt)v*Tq;OD4Fv6Pzl?qJ%s^nn$t&;Ouo2YZqU~izi0a<7t@0X7vYetJ7$oT{>$w7i% z8Pr0iArf$S2Ij)|N$Hybn3u7Pi`crGz*y$0OC`QlC{gS$V*OS<~O&UOD zyqKpJoRZX~bmMH91Z|fjgkS4~d5Sh4ER-Uew}{=l03!*@Oc71m!2Tr3lr4-2RX}@& zN$BioFju)^D&OxJQPMQ<$5GOh@cI4|6_r&w!VjK2+=L^PR0mu*oodZrp<~r=L0oKX zGf;5;fVp)^ggMijX1_hNw*4T4G=sDjs_}{1uGY)90%BXA5Z0RYJz4Ez!`vm^gTh1$ zn>sx`)r8ik-S4)~{fRVgj}eJv%Z=f?;2c7e)3Izb{NZ@p?xjJO1tvFQ?1j)=s+dn29+F zWe5>Ysl`L3t-8DoKBX?A6izGIQJrvkH@f(vEIjcw}&?$Q@(jH5x3oCS5kx9<-L zA_jILX~$AENpI3R{TRbyZl{X(U|`rrDWcBK++Wfmn&#$c>@+BtK>c z3Av*f>c#H z2~+Emx%*=oJbE}*U@Loia5}ZzRmV3Eb&pKHP4@Js=kDI!Vs^tnwX1CKAPP*p&#Qne zx9QgRH&6{A);bufbgHx>>g$~B1VWE z9Qbsx{-e&Zg6Dnp$(Cy^l?cy;gwm_&q%r5-b%Z-YW9Y|Q)s8p2C8ilX7B_DHIl|nL zZ5^n-K#X3uI8gMC<<2!s4T6*o%b}8t_@#IeZ`GLA{Xj^^oT z8pbqO2fk;3JtSZ~yG3?{C!tvHl5c}`=?jh$zMa#Rs^^H6fts0@HIC^m!i#k?SWAL04JEE5_LE9v%l<1Ur8pKPokerJ#*JXt5@ z<0cUmN0%mJSSxE~AWlO1aY8^25yVx&Myx{#69f#);Z+E3zTQJO0uoV&ksrQ>Wx+vu zh4cc#X2kH83kgwhCZ+`lnJ*xN9?wqGtJ%|&;tJlv2qQvqLZU99AnL+;LK;TQ19({? zHqnbtP)+QY!X0{5#VM3YmELc25%)+Y6-G=^w~p3@5)?E*L80$5`WhU}6X)-T3f{54 z1o%fS-u19D3?*uAsH3XoY0y`~3Ye9iN+#bA_$) z+frfcE75Pt_Q!bINg*p+xyA}(J?*1DlNB^D4I@9h0Cp8*X~P1HH-XjQ(rwC>%( z?UnsX3CKQ!Z{+Cl7{DrF$2|eANZqmEI6fkvlKe!d4@9 zI(%qdd>v&p_#2!*QP$YKJ^RIx#^S_=(UCTbcq{tk{xsWjJuK zQ8q6mH>sg_L9xkpeOYd!#7voIe@1Tg-4NKYH5c;Xk=7}mM$|I43F=&OKzLxqRqQbJ z?!u;ZD_KoRdwJlm)N!}mlELJM)q%Pzj`YSY z8+f;8=WWAHSw>YWTVEbOC@nkXW>{E0%ZYuA6X{gHwRgV|Y#T3@@sc%ZCHF7*oyc!E z;6twrdZ?D*+6D1;vE9~7nMXrtXKboe8}<72-pEiI&agrf4GFyL4Ucp8gUfIX5jPl+ zimj<9%a&b^erV8t&77Wyj*`-t9dEA;+G^_hh~e-!)4)^CDCVkHB3fu6R&}pf;^%@F zPO*l?hlz_f;dBk0rxc?BTwAXmB7P-CRaNc1%LS`ttL%}_+dITG-@Di^v*~fCF4c9J zQk){d@#4Kp*N5`ef|E$vE|s^!LJ<2dns4y{7#s@wFme9|oF*FhqnltMz=`H_!KXUd zBB0uVK1B@>`3yXMc5&TQCUu&56sGC{+bKEiN8bGmcs z8X3Y(33E<}xZ{z+MeO{Byg(tAi~WaVG>N!Lw9w(c1Fyq}k-=%Oo#gWK>RZ#mS79D-l;}f$ieMsOar9f>Mb3gF({&$U zf4CDbU&5&Zwtz^4&if;h;J|qvf$M^a`|bJw2N^E7;uMQ$h0G;vG9a8kFS0EX+_c~| zM;v*5y^^r@jNa-7Qj+N`t^2;|TZzXk=9R@f8;@}F0l|03H@0Lq z^W_bObUN_taA2YO$4?45&p(XNSOS#Z&&{lNx`y`InfU!}eXCzs(V_xulU`cON-Fs{ zKi1jE>T7_4xD+iu?-XlBYHa~FUOP#|zLp(hN+N1`uu{in>!TOHBDZNM?_5`Kt0t|!0CQ{F*PHZ*yAbGG>koHGoY}l zX&B#Tb&mC%>PF~+(Ce^O1;%6JVQM&+Z+!wH>nEPEX%0%Z`n#|cw<|f^^*ISRw8bkx z_m1>B?$2V$*B>)6Rlu$hv+3zM2A`GUXyeyYGfJ5-xg5`JAiUWshy{2pLBZlBr3QpM zYz&T$76><$cEiQqb7H(08|xxyje-Z#8h0f~x2!@eD|`I_RMorbSJg`An2 zHJ`@@-d zLC!kFpF%xy%zO!U<9vPVWp+ppl(G?=52-^e-JEAa^QGZp3&3L%qK=86jCx|0D%1h}`gJog;u; z2L1z&>>ljAM<`BRO=axa zCHVF_XV8~@ZCR_1UAh5#XMKIB|_mTB#8 z!+CS{&B^lDHwd@_RW<*ids;8F->Un|HChXh41B-RC->;(sX+&5xY+&^$FO_Z=1wEJ zk4blNC^dx3AC6b>IRYmacvv|ME~qOr8C*t(j6`Vp#x$^w`yn0FEWx5cXla4n%TGih z7B{|+@R`~>(!SR<70x%{>{|8dg7TnDL3tT05g1T^*f{V|%=axmwfP!&W28ZS#B^KT zz@(AGOOE%?pe`Ao=|9G_>JPEOy*o61dT1-a4 zmG3`MUF}a7Ramq-G0Qa_H5e_%@(ao*CKI} zf)r(w2QB6_f;&9Q$p?JG8fToB?jGGjvW(L(q;&@zfhOb_*_m#NKcWw|iO1_qO<39= zuAEG6j523BbGs2>)SBbvxi69hGPs}T?LMF{WC$8>V;`W00{qd zaoRda9iBzT34$0so4V$C00PtpIQTmNQ4%J=fux74+)Zb}$ zfE2SG9c2*gfj^`!j-*yXevya*jJ1<26!jX;k0cb^8xk*Ve#Cqv)E(4$VTB}UigE;> z=MoDLYSZ!3>i|NOR|Tv?4w$lDDKX10hQEE4h=|BzC6?XJpD7e))2=jI4>I zq&&b(NLBb|3*|o;X}{S3vd`=04oXu5Y{+qxMf$~$h=5)H312BYE=mj}?R~9*@0_vm zYgpo||JzbG_%%R@3hvF_Jl@I8L>`Pm6}SkZ7iRh4dSaj`K@=}RHvdM;}o zfJHzAD}grwcjsj%gT0GIgOaiR7# zf&~D6cMpIGt2`_r3B!7KM}SsauTSg&B>c}p|K=l?%>i6Eft;m4R#oU#1cfgKWTUcn z4xGTndC7+bxgd}dkCH|(3K(}}nE{aT?#4W7q4Q*u67X|0cl1nACN1%=FN*gONAO5-XkecW5RDFhpAxRJSM;2l4JMN1; z-I*S{OT`Av=lBS9Uv!Ol`_E13;~(U5AXEK4KMmW^3E?X@9#$V>^x~+V$U{8G<`g7N;oc5BxbXt~5U8zI z(QGb3t4VM zAs0Iw)GAqWsQbSY>vBy|{WTvy$X=H0&oJbyd%tgrVg+yNt$r0IE8BRF585bS=ZmQ~ z93?&wVKEI3DQQ#Du#8W`lQXY4&Y3(SsnV=Udse1wG&ZeTd-g=2$8P|7 z6_;jvI4TQyH2h9nYwEBHhxzg zeXR-i>5zP=B)R=;nts^eCz~U40fty>nKCWqOV=Q37y3B+Z22~W;j7Eb(yl)==q%dh zZ*pphIl!(be}kOn4vj!Nhwz;I1lM&w7f#b1T%Qep!!yfOt~#ZrRZsOrzts?rOAFEQ zf3m?SrfhSP7u}nT@;6^`h~`Z`;zQd4u&5VX_*&*+cJd`ZoqG+3hff@F^&ghnq@ink zI*=LtR(#Q##7>P@hZ1(({*11A5Mi#~;bL$`NRQ@CTxa31I;U&KafVH!WFDSNxTMwR zWEzJzPn=acQfIB=idi@gNEP4bq@Ev&f_8h< zt~rfIeSAuFlIt?MW2XJ@LgX;&i?fw*TV}>Ffg1OCF$)t>E0Y;8GUGUpjLxdQs?JOL z1;|#*EL6Mrloi`6w`~fZOE_8*pRampgfJ{WfE&7{b*eN^hA;=osYjg-5NqzN-HBv% z3uYWe=zQcF1ccHsGCdI5hf$Z#Z#!rsBoQ_#IZW{e%9zH(OWs4gwSc7(lCDSw9k?q4 zE(l(Y&fDIt^^-wt-k?10JbJ@C<{|G^N601#^aVf!K|$o*Y9W{a$`bmcj|g0d6bjH* zq%hfwK6V~f#LaRM=*6W~`%QJ(fJ`|FuV(B%LL0}Uc7-i@jf12ATN&}yfI@A9!K}ok zWe6!EIp`3R)AaM`!j+HkZ(g)$ZAn$Pu>vIhBAZHaifmdXB ziy<>8_v}x|WJc!u4Gsh{Ss=%A00we}+mFok-xN3>CPvVKt*W^!g1rBn-ZEqq_glZyMF8bT@>GLfjNkYt$e} zhf5re2u|(@rVbu}kAaOd)e)Gw2F6h^b<2T@m^z&`9foW+f{L&`84DuWhe6b~?veJb zuF;SvNtg;~Pp*Qa5eQa7&PD751f6SOs3!Ix4_KwJDl=t~L`_VMl6( z^B7pPHV!ko*$>c}u$UIXgZ7C{Gb6Ecxf&Wtci}?Rri|}z`}sqRJ&xnF6K8fVjA_ww zW7RL;2~e-cJ$MR@cZ9iALf{emC_xedg@lTqQr@zn@}wQJ4EZ3eFXU;dyyR6Ak4!uv&^S(k-bn^sQd;g1(+4_|8B zzN(v7d@TNLeDrOrmCV3=eMKC)zjBk&y4IJ5yPKW1?z5iAprr1Lp+)GOkHIJAwU`>X z2}QXDQ^SFh^`IQP&wTQVQ1VdtnQii(_U}^^? zhyuV{Py$%X>+nQIxYaUqRr@~m<9Yyfsjo*vqg)iYdeB&ay(Gfu90O#C>e4R&T_z8Q z*!0X77maYmK_>v7k)#I5;KEua?cgL%S-b=g1~|8OA)K3xJ|Q`x^2;ErTV`PN48YzD zJ?L~<(89@WSJ_+GKAHA28pTF)6`S@5oFow=Sn~tVPr9AoF(8&NU#zyBH5lf6K zPIu3;!D#83?>@b8a0=zkG9~FpZK{A8y?LHm7+Hl(`X}(w zFr{&j)rItL23(WHg|}`6Yzp@vl#cjlpl*?lf^eLemeLIVm5Y0(ASoCt-@g0)L#s8a zAlG+zMrLrGp@6BpLBM1H3mu$MG*t|FfW|+;Im*}*?kM(fA@+BWb_8lmv%gC*AMU`k z&MbM)mrVHfN+qZBq(}I+gGbkT4a)coh9am zXJ=tZ#m{;jWY$mh4dXLQ05Aw$=+4UK3r~a;h_{kif3Uz;4DyBHdYPxtITrTRTe9`A zA`~`!BlbhB=OIDw_@rU27lWna^aV^#tBz1RfcJ=064t~FO7cD;F6D8<#*MfpvYUpx zAb&8kBt972g>~bhK!Tyx>aol;>0hUkq&iIBrpJ10xia2S;RwwST}abeG7-`qDX?UFfR$N1KuIxz6VKGST!`uEC8b*+Pz?ro%gtKZkPQ$pIa}Q%>QF$nr>_v4~^CsC@w@;zOH0RpiL2#NMLO*`2 zok2NIPx-o}X0;~)w`uLGK4MSOn~xWpr*S9EQ{aLMv8SZ^<30G4u};ukogC(I5Q$A| z_46m$&tn?LW9rJPQIOLRiKbyF+2OSpfF6(BDsd(BWLVWzh|$|7weGu>FW2rPFlL|- zjylB{%{duCZiB;s+{S?^lNG(@3mkldgx z1O?98=%34?p)Ou)2{iIvQkLtMs=NIv4KwT*b-CeT>G(EeoB+m8&y1U7huB0l#X8Al z+myIL`T|t@&+G;}PmtaCR-6{XJEz!PhQC%n$$|Sk(;O)c^#0&CDD^q`2MbgT(e?3B z0?rI9IdvMRz>{rcBu=u+sQfkOoniPnp)-U;WRTp}sj1Hq3iH9jQ!y@()FY~M7{|9? z6;v}C0CX07fcl&ayL~S>TQLd>ECdKVX$}?w$joEEWRAiR=h$;`AU9SCY=S_pAV>vK zo^Yy1DzqQU6I39r1mi))e9N35IxS@z@8?ad_6$c%I~8NN^L8epgV+(DYf{9p*iTaC z7#A4k=9di!_k8L^ASz#VzCu>`d<96MAT1dUfb{_%kQmm<1_KVF_yi83U4WfAn0EEK zvfNC#AdcismoY=uV+)6=-7>Q+Pyie4Pq`A5q7SezWU;)5)z?(kL( z^?Q>m;);u#A{*M5bM=wCgI|_&x2|__vfX5}<;k&`_8VYfh!!u3k9Px0`;yeXyQD6b$tX^o zoPU-sfCP@LYbv-Pm>v(?uqBK(E^a9G;__4o_{$)+?93r@;7nF#gCV^_E?7pju0k$Y zW={neKwJqPT*)5%Y>-5U`YK3OgEwwp?jwSDa4ntGDx7F$0Qgy$)AniKc`7NjiUXSx zxf}o!cnAC}941#Hmuf;>P0j=S#2a8sf{6hSZvC>_0rA}J8_ZWDo?ELPf)bd-BSrg0 z|4ah`_0k#vm9~CAa&qJ#w3#i=posq-@t>X*28^Yn9{ABsGB`?73A5$ znbNwpp5ajVD~loGx?RoW6CS%qGfWm_`eZK zQ*y&Tf1*vXu(lOJe4YlyFO1CgsT=My%6(I5vRt||a?s>f6;Z*)bn63`0bgm~E(|OX)rlNF~i#6;m<%$oHO(*LD zjT$SKA4w{$SRPaHEbN^Bblp_IbkQsi`CCk+P`Pv!<5+CY+|${yudm@>7$SdA!MsGIW4it@?Z!+vu?1?9N@kN*j?ZAI5PSO9`9h zd|b8VW6qXsmv8Bz)AZy5Pj7v&`fKg40i%qYJ#!OXeid_F$(ZR``1@URe65NC?A*Zk zRKLg7Uj_qBncNcJK(hA7-dPsfw&P@{Z3Umx%NTflH{++2Ppm7y9@aMbG~K_~h&jh{ ze&Ui`zC3xZGel0V!CB9l=Y(F*F;v4|zs+y--QGZU;MtA#Sr%ESed)3vbnCT!S%_(! z!A_9nekWVRlJ1?CRxuv8LInk<^0ozA+}C0%srRYWt9Fzr7(@wvAr{b_5+vztLd%^^iJ7x|e|{OpXkVae?Cz=_}@KD(eE z!{X#ig^WisW=B#u3t4PDrkCgYbmmMOzVsp8Hw@D@GZW0qWtWDPw{dn%xtpx|1CJ*D zzF|kl=T|o|KEy(oldPbbTGFDYbKy^dQqTdB@-sa>9+CBj4;-x>SZ%iDf$4#J*Y(z2 p*8BDH>R-1e=!i<+Mj>zCi(WI=m}Ske<|gJ=Efa}b#9#W;{|6jYY)AkA literal 0 HcmV?d00001 diff --git a/research/longer-coupled-port-caller/DISCOVERY.md b/research/longer-coupled-port-caller/DISCOVERY.md new file mode 100644 index 0000000000..ff8bf07078 --- /dev/null +++ b/research/longer-coupled-port-caller/DISCOVERY.md @@ -0,0 +1,92 @@ +# Longer coupled-port search + +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. + +This file records work in progress. No new kappa is established. +Base: 6cf7a683f447b9f1e2333791907fd92be5009a63. +Claim: https://github.com/CrocSwap/integer-mult-bounds/discussions/5593#discussioncomment-19186397 + +## A useful necessary condition + +Work in characteristic two. Let R_i be square-zero matrices and let their +sum be a diagonal projector E. Let P_i be diagonal coordinate projectors +with P_i R_i = R_i P_i = R_i. A coordinate on which E is one must occur in +at least three P_i. + +Proof: zero occurrences fail the diagonal equation. With one occurrence, +the row and column of that R_i are those of E, so its square has diagonal +entry one. With two occurrences, call their row vectors a and e_j+a, +and their column vectors b and e_j+b. Square zero gives a*b=0 and +(e_j+a)*(e_j+b)=0. But a_j=b_j, so the latter expression is 1+a*b=1. +Both cases are contradictions. + +For full rank-q queries in rank-2q coordinate supports, 3*rank(E) is at +most 2*q*L. The proof does not assume separate ports or any chronology. +If every full call has a private stage axis, the target basis makes its +projector diagonal. Thus this condition applies at every coupled rank. + +A second consequence applies when each stage occurs twice and has no +rank loss. Its two rank-2q projectors sum to a rank-4q idempotent. The +projectors are orthogonal. The sum of the two compatible queries is +square zero and is supported on the diagonal target stage projector. +The same three-occurrence argument applies to these grouped queries. +It rules out full stage capacity whenever 3*N > 2*q*L, at all lengths +and all coupled ranks. No chronological assumption is needed for this +necessary condition. Rank losses and noncommuting local projectors need +further work. + +## Query frame complement + +For sum R_i = I_N, equal rank q, write R_i=U_i V_i with V_i U_i=0. +Set U=[U_i], V=[V_i]^T, K=VU. Then UV=I and C=I-K is an idempotent +of rank h=q*L-N, with q by q identity diagonal blocks. +Factor C=A B, BA=I_h. Each B_i A_i is a rank-q idempotent and their sum +is I_h. When L is even, the complementary idempotents I_h-B_i A_i +have rank h-q and also sum to I_h. Therefore L*(h-q)>=h. In particular, +N<=q*L-q-ceil(q/(L-1)). The trace condition also requires N even over F2. +These are necessary frame conditions, not a caller construction. + +## Numerical discovery screens + +The initial screen used the pinned PR5599 local invoice. It assumed all +2*q*L stage incidences could be used and distributed them as evenly as +possible. For q=104, eight calls on 720 fields appeared to have a raw +crossing near .00348661. That frame is impossible: h=112, while the +complement inequality requires 8*(112-104)>=112. Other paired-stage +screens also lose capacity before an operator is built. These floating +numbers are rejected discovery hypotheses, not kappa claims. + +## Next experiments + +The remaining construction must use noncommuting local stage projectors +and pay for lost stage capacity, or change another stated hypothesis. +The current search keeps the local P104 supplier and independent helpers. +Use PR5631's mixed chronology condition before a full word replay. + +## Completed continuation + +The initial finite search checked 24^3 coupled splits in each of 144 +two-sweep orders: 1,990,656 assignments, with no chronology survivor. +The rank-two coupled search used Z3 5.3.2.0 on 144 orders and found all +unsatisfiable; this result alone was not used as a proof. Exact free-algebra +witnesses then covered all 75,600 order types, with no matrix-size bound. +The final theorem and its reduction are in PROOF.md. + +DISCOVERY-RESULTS.json.gz preserves all five JSON discovery reports. Its +SHA256 is ec6fbe62a74cb05750db45c24c2a14ca18cb6b4f6bfb88a8151b76df40120ef8. The retained scripts +can regenerate these reports. The registered checker uses only the exact +order witnesses and standard-library matrix checks. + +Commands, from the repository root: + +```sh +python3 -B research/longer-coupled-port-caller/search_star.py +python3 -B research/longer-coupled-port-caller/search_orders.py --degree 2 +python3 -B research/longer-coupled-port-caller/nc_star.py --degree 3 --limit 144 +python3 -B research/longer-coupled-port-caller/build_certificates.py +``` + +The optional search_coupled.py command requires z3-solver==5.3.2.0. It is +not a verification dependency. Its finite negative output is superseded +by the exact algebra certificates. The numeric invoice screens do not +supply an operator, compiler or kappa result. diff --git a/research/longer-coupled-port-caller/ORDER-CERTIFICATES.json.gz b/research/longer-coupled-port-caller/ORDER-CERTIFICATES.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..045480c58aa4deb1fb6693716f460f47ce603e28 GIT binary patch literal 108057 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≦y|!Tkuq(0D67q6JG|)rs@|-Q?ARa;5FcQKANw_H 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%0DZo5t4wa@h@1u}5d2M?)t3ztv4 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 JWRoSue*iK%Zeaib literal 0 HcmV?d00001 diff --git a/research/longer-coupled-port-caller/PROOF.md b/research/longer-coupled-port-caller/PROOF.md new file mode 100644 index 0000000000..7df31b1dac --- /dev/null +++ b/research/longer-coupled-port-caller/PROOF.md @@ -0,0 +1,197 @@ +# All-order exclusion of the coupled star query frame + +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. + +## 1. Result and scope + +The constant-loss frame in PR5631 passes the earlier stage-rank and +intersection cuts at arbitrarily large sizes. This package permits arbitrary +matrix coupling inside every good stage pair. It excludes every call order, +every coupled channel dimension, and every odd leaf count g>=3 for this +frame. It also supplies a small exact proof format for other matrix searches. + +This is a theorem in the binary normalized model. It is not a reduction of +all complex or dyadic native callers to that model. It gives no new kappa. +Other query frames and connector contracts remain open. + +Let F be any field of characteristic two. Let W have positive dimension d. +The main space is W_0 plus W_1 plus ... plus W_g, with W_0 the core. Let +E_j select W_0 and W_j. On these two blocks put + + T_j = [[I,I],[I,I]]. + +All other blocks of T_j are zero. Split each good stage into two calls. +Their projectors P_j and P'_j have sum E_j, are orthogonal, and their +queries R_j and R'_j have sum T_j. Require P_j R_j = R_j P_j = R_j and +P'_j R'_j = R'_j P'_j = R'_j. These conditions cover every compatible +split at full stage rank. No separate-port restriction is imposed. + +The four remaining queries are F_C, G_C, F_(I+C), G_(I+C), where C is any +idempotent on W. F_H has block H from each leaf input to the core output. +G_H has block H from the core input to each leaf output. All other blocks +are zero. These are the connector queries of the source star frame, after +an arbitrary common channel basis change. Their stage projectors are not +used in the exclusion. They can be thin calls. There can be arbitrary +constant basis changes already absorbed into the displayed matrices. + +For odd g, the sum of all queries is I: the sum of the T_j has identity +diagonal and identity core/leaf cross blocks; the four connectors cancel +the cross blocks. Thus the frame passes the query-sum condition. + +For the native equal-rank instance, d=2q, rank A_j=rank C=q. Each good +projector has rank 2q, each query has rank q, N=2q(g+1), and L=2g+4. +The theorem is stronger than that instance: its algebra does not use the +ranks of A_j or C. + +**Theorem.** No order of these calls has an endpoint with the central +involution Q on every main field and the declared independent good-stage +projectors E_j, if g>=3 is odd. This holds for every d>0 and every F of +characteristic two. Failure already occurs in a mixed first derivative. + +## 2. All coupled splits have a matrix parameterization + +Since the two projectors are orthogonal and sum to E_j, both act inside +W_0 plus W_j. Also P_j T_j = T_j P_j = R_j. The centralizer of T_j has +block form + + P_j = [[A_j+B_j, B_j], [B_j, A_j+B_j]], + R_j = [[A_j, A_j], [A_j, A_j]], + P'_j = E_j + P_j, R'_j = T_j + R_j. + +To see completeness, write a general four-block matrix and equate its +products with T_j on the two sides. Its two diagonal blocks are equal, +and its two off-diagonal blocks are equal. Idempotence is equivalent to + + A_j^2 = A_j, + A_j B_j + B_j A_j = B_j. + +For example, in a basis with T_j=[[0,I],[0,0]], the projector is +[[A_j,B_j],[0,A_j]]. This also gives rank P_j=2 rank A_j. These are full +matrix parameters. Their entries can mix every channel. They are not +scalar choices or copies of a one-port calculation. + +## 3. Necessary chronology equations + +Put Q=1+e and z_j=1+d_j, with e^2=d_j^2=0. After normalization a good +call is (I+d_j P)(I+e R). Calls act in listed order, with later factors +on the left. The query sum is I. The coefficient of e*d_j is + + E_j + sum_(i in stage j) [P_i, sum_(k later than i) R_k]. + +The desired endpoint has coefficient E_j. Therefore its defect must be +zero. This is PR5631's mixed chronology condition. The bracket is AB+BA +in characteristic two. An exact local matrix word supplies a separate +check of this formula in the verifier. + +For each good stage j, retain only defect blocks whose row and column +are not both in {0,j}. A nonzero retained block involves stage j and +one other leaf k. A query at a third leaf contributes zero to this block: +its only nonzero rows and columns are at the core and that third leaf. +A connector contributes H or zero, independent of the number of leaves. +Thus these retained equations depend only on the relative order of the +two good stages and the four connectors. + +Choose any three good stages. Delete every other good call from the order. +The retained equations on those three stages do not change. Rename the +three stages in order of first occurrence. If a stage's second labelled +call occurs first, replace A_j by I+A_j and leave B_j unchanged. This +preserves all local equations and exchanges the two calls. Consequently +there are exactly + + 10! / (2^3 * 3!) = 75600 + +order types to check. This finite reduction is independent of g and d. +It is the step that turns a finite order certificate into an unbounded +length and matrix-size theorem. + +## 4. Exact certificates in a free algebra + +Use the free associative algebra F2. A word records +the order of its factors. In particular A0*B1 and B1*A0 are different +words. The equations are the six local relations in Section 2, C^2+C, +and the retained chronology blocks from Section 3. + +For each of the 75600 order types, ORDER-CERTIFICATES.json.gz gives +explicit finite words u_l,v_l and equation indices i_l such that + + sum_l u_l * equation_(i_l) * v_l = 1. + +The separate checker expands this sum and cancels equal words modulo two. +There are 72020 witnesses of degree at most two and 3580 of degree at most +three. The largest has 77 terms. No SAT or numerical solver is needed to +check them. The search code uses finite linear algebra on words to find +these identities; the checker does not import that code. + +If a tuple of matrices solved the equations, evaluation of each witness +would give 0=I_d. This is impossible for d>0. Evaluation preserves word +order, so no commutativity of the matrices is assumed. Since F contains +F2, the same identities work over every characteristic-two field. +This proves the theorem. + +For a short example, put all first good calls before all connectors, and +put second good calls in reverse order. Four retained equations are + + I + A0 + A1 + B1 = 0, + B1 = 0, + I + A0 + A2 + B2 = 0, + I + A1 + A2 + B2 = 0. + +Their sum is I=0. The other order types need the certificates above; +this example is not used as a substitute for their complete coverage. + +## 5. What the search removes + +The source relaxed profile has 2q jobs of rank 1+8g and 2gq jobs of rank +9, against 2g+4 full calls and their complete independent helper bill. +For q=104 and g=1023, the PR5599 bill gives a positive relaxed moment at +saving .003125. The exact integer-power enclosure is in RESULT.json. +This exceeds the selected .00310045 but is not an attainable caller. +The theorem excludes every coupled split and every order of this frame, +including large cases that were not individually instantiated. + +The preliminary eight-call, 720-field price screen also failed a frame +condition. If rank-q square-zero queries sum to I_N, their Gram complement +has rank h=qL-N and identity q by q diagonal blocks. Factoring it gives +rank-q idempotents E_i on an h-dimensional space with sum I_h. For even L, +the complements I_h-E_i also sum to I_h. Hence L(h-q)>=h. The proposed +q=104,L=8,N=720 has h=112 and 8(h-q)=64, so it is impossible. + +A separate useful test is the three-occurrence lemma. If square-zero +matrices R_i sum to a diagonal projector E and are supported on diagonal +projectors P_i, each coordinate where E=1 must occur in at least three +P_i. With two occurrences, their rows are a and e_j+a and their columns +are b and e_j+b. Square zero gives a*b=0, but +(e_j+a)*(e_j+b)=1+a*b because a_j=b_j. This is a contradiction. One +occurrence also contradicts square zero. Thus 3 rank E <= sum rank P_i. +This covers arbitrary coupled queries whose local projectors commute. +For paired stages at full rank, group the two orthogonally supported +queries. Their sum is square zero and supported on the target stage +projector. The same test applies. Rank loss requires another argument; +the star theorem above supplies one for the declared frame. + +## 6. Verification boundary and next routes + +The order reduction and free-algebra evaluation argument are written +proofs. The executable checker verifies the complete finite order cover +and every exact identity. A different matrix implementation checks the +local identities, query frame and mixed coefficient formula on coupled +noncommuting examples. The one-leaf case is a genuine full polynomial +word and is retained as a positive control. Corrupted certificates and +changed query data must fail. No proof assistant or independent human +acceptance is claimed. + +This theorem does not exclude a different query Gram frame, a different +connector map, more connector queries interleaved with good calls, nonfull +stage ranks, different main outputs, noninvolutive stages, helper feedback, +or arbitrary complex/dyadic callers. It does not price or certify a new +native multiplication algorithm. A future search can change one of these +premises, or use the same free-algebra certificate format on another exact +frame before it allocates large matrices and a complete native bill. + +Credit Cinna Davis / 1337isnot1337 for the controller, simplex and private +projector lineage; PR5617 for stage/intersection cuts; PR5631 for the +constant-loss star and mixed chronology equation; and the P104, helper, +native, compiler and outer-framework authors retained by those sources. +Free associative algebras and linear combinations of polynomial equations +are standard tools. The all-order coupled-frame reduction and its exact +witnesses are the contribution of this package. diff --git a/research/longer-coupled-port-caller/README.md b/research/longer-coupled-port-caller/README.md new file mode 100644 index 0000000000..accdaed16e --- /dev/null +++ b/research/longer-coupled-port-caller/README.md @@ -0,0 +1,74 @@ +# An all-order obstruction for coupled star callers + +The constant-loss star frame cannot be repaired by port coupling or by a +longer order. In the binary normalized model, this package excludes every +odd leaf count g>=3, every coupled channel dimension and every order of +its calls. It keeps the star query frame and four complementary connector +queries fixed. **No new kappa is claimed.** + +[PROOF.md](PROOF.md) gives the complete contract and the three-stage +reduction. There are only 75,600 relative order types after that reduction. +For each type, an exact identity in a free noncommutative algebra proves +0=I. The identities apply to matrices of every size. This is stronger than +a bounded search over matrix entries or port counts. + +[RESULT.json](RESULT.json) records the independent replay. The compressed +[certificates](ORDER-CERTIFICATES.json.gz) contain every witness. The +[checker](check_certificates.py) expands them without importing the search +code or using a solver. There are 72,020 witnesses of degree at most two +and 3,580 of degree at most three. None has more than 77 terms. + +The package also checks actual coupled matrices, the mixed coefficient +formula, a complete one-leaf positive word, and corrupted data. The pinned +PR5599 bill gives a positive relaxed moment at saving 1/320 for g=1023; +the theorem shows why that price screen cannot become a caller in this +frame. The selected record advanced upstream to .00310045 during this +work. It was not changed by this contribution. + +## Reproduce + +Use Python 3.12 and the standard library: + +```sh +python3 scripts/research_package.py --package research/longer-coupled-port-caller --check-only +python3.12 scripts/research_package.py --package research/longer-coupled-port-caller +python3.12 -I -O -B research/longer-coupled-port-caller/verify.py +``` + +The registered check uses the saved exact witnesses. To rebuild witnesses: + +```sh +python3.12 -B research/longer-coupled-port-caller/build_certificates.py +``` + +The optional discovery searches and their complete receipts are described +in [DISCOVERY.md](DISCOVERY.md). Their Z3 results are not proof inputs. +Exact source commits, Git blobs and SHA256 hashes are in +[SOURCES.json](SOURCES.json). The package began at canonical main +6cf7a683f447b9f1e2333791907fd92be5009a63; the refresh at +df0137efd35e11b4445734bf612bdd4c7ebc330c changed the selected record but +not the priority or working instructions. + +## Open next questions + +- Change the query Gram frame. Test its chronological matrix equations + before any full native construction or favorable price claim. +- Change the connector maps or add interleaved paid queries. Recompute + every equation and keep the complete bill. +- Establish a valid characteristic-zero statement for a concrete caller. + General dyadic coefficients cannot be reduced modulo two. + +Other frames, connector contracts, nonfull stage ranks, noninvolutive +stages, changed targets and productive helper feedback remain outside the +theorem. No native replay, proof-assistant proof, independent human review +or global obstruction to improving kappa is claimed. + +## Credit + +Ali Romman with substantial OpenAI Codex assistance; no subagents. +Apache-2.0. Credit Cinna Davis / 1337isnot1337 for the controller and simplex +lineage, PR5617 for the stage/intersection cuts, PR5631 for the star frame +and mixed chronology condition, and all P104/helper/native/compiler/outer +source authors retained by those packages. Free-algebra identities and +finite linear algebra are standard tools. The new work is the coupled +parameterization, the all-order reduction and its exact certificates. diff --git a/research/longer-coupled-port-caller/REFRESH.json b/research/longer-coupled-port-caller/REFRESH.json new file mode 100644 index 0000000000..0ffe8709e9 --- /dev/null +++ b/research/longer-coupled-port-caller/REFRESH.json @@ -0,0 +1,17 @@ +{ + "checked_at_utc": "2026-10-26T01:59:00Z", + "main": "df0137efd35e11b4445734bf612bdd4c7ebc330c", + "selected": "0.00310045", + "selected_record_sha256": "2a0220e866417774606e0f991e41b9c1d26b1f43b97857238cf478dbc7d330b5", + "priorities_or_working_instructions_changed": false, + "active_claims_checked": [ + 5600, + 5636, + 5638, + 5642, + 5125, + 1166 + ], + "own_scope": "Global caller with fixed supplier; no overlap with local contact/history/G20 construction", + "coverage": "Live latest Discussion updates plus the initial full open-PR and Discussion overlap cache; sparse local notes remain a limitation" +} diff --git a/research/longer-coupled-port-caller/RESULT.json b/research/longer-coupled-port-caller/RESULT.json new file mode 100644 index 0000000000..8a16db2123 --- /dev/null +++ b/research/longer-coupled-port-caller/RESULT.json @@ -0,0 +1,64 @@ +{ + "authenticated_inputs": 2, + "certificate_check": { + "certificate_sha256": "2e9279611423b0fc0488780e10cc8ac4ce3397f9c3f1809dd0ab294f4987ed1a", + "corruptions_rejected": [ + "empty_witness", + "extra_nonzero_equation" + ], + "degree_counts": { + "2": 72020, + "3": 3580 + }, + "largest_witness_terms": 77, + "order_sha256": "1c50783fff7ff426b0aac677f1d59a7b605affd72f66ee18ef678a2e303170f0", + "orders": 75600 + }, + "limits": [ + "No native or characteristic-zero reduction", + "No new kappa", + "Other query frames and connector contracts are not excluded", + "No proof-assistant or independent human acceptance" + ], + "matrix_controls": { + "coupled_frames": 24, + "deleted_query_rejected": true, + "mixed_coefficients": 96, + "noncommuting_local_controls": 91, + "one_leaf_full_word_coefficients": 4, + "symbolic_blocks_checked": 206, + "three_leaf_restriction_blocks": 432, + "three_occurrence_row_controls": 1365 + }, + "pricing": { + "excluded_relaxation": { + "denominator": "281474976710656", + "full_calls": 2050, + "g": 1023, + "main_fields": 212992, + "main_targets": { + "8185": 208, + "9": 212784 + }, + "moment_interval_numerators": [ + "582017993691966270", + "582017993695381362" + ], + "q": 104, + "saving": "1/320", + "status": "POSITIVE_PRICE_SCREEN_BUT_NO_CALLER_IN_THE_DECLARED_FRAME" + }, + "net_rank_mass": 1720, + "rejected_eight_call_frame": { + "L": 8, + "N": 720, + "h": 112, + "left": 64, + "q": 104, + "right": 112 + }, + "supplier": "PR5599 09dd0965711ca7eeb169057a420abab1c9052137" + }, + "scope": "All odd g>=3, all positive channel dimensions, all characteristic-two fields, all call orders; fixed star queries and four complementary connectors", + "status": "PASS_ALL_ORDER_COUPLED_STAR_EXCLUSION" +} diff --git a/research/longer-coupled-port-caller/SOURCES.json b/research/longer-coupled-port-caller/SOURCES.json new file mode 100644 index 0000000000..a4bdb5b8cb --- /dev/null +++ b/research/longer-coupled-port-caller/SOURCES.json @@ -0,0 +1,52 @@ +{ + "schema_version": 1, + "base_commit": "6cf7a683f447b9f1e2333791907fd92be5009a63", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "fc3d4ba105e1f097d0d7d051a308281e86ab1446", + "sha256": "66974efdced4083c00025f97d95d83909a226cdf801edb9301c195c6641f6903" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "f126dd2e2dad2b669e75d1d0d0bd05c600725602", + "sha256": "f7a48bfa2659b88378282a8eee7d9fe52cdf505594124c4d1686b58510fffd72" + }, + { + "path": "research/p104-helper-subspace-splits/RESULT.json", + "usage": "input", + "git_blob": "35f75c8555193c6e845cd52cc562ca23fd5924cb", + "sha256": "1d92e587915052110dfb3aca8890df5afdaf496164efa5a4a52e69ceeb3c70f3" + }, + { + "path": "research/productive-controller-basis-search/algebra.py", + "usage": "input", + "pin": "head:6cf7a683f447b9f1e2333791907fd92be5009a63:research/productive-controller-basis-search/algebra.py", + "git_blob": "2f0d4f290c280cfdfc17714009a2ae0f220556d4", + "sha256": "ab85b113cd70e20c38f6b0c0e0501876b751206bcd2a7ea5a61054ce3b92f2b2" + }, + { + "path": "research/productive-controller-basis-search/GLOBAL-PROOF.md", + "usage": "provenance", + "pin": "head:6cf7a683f447b9f1e2333791907fd92be5009a63:research/productive-controller-basis-search/GLOBAL-PROOF.md", + "git_blob": "74b67e22e6c063193a83825207cdec19a8fef7a4", + "sha256": "adc377b13924701bf5b0b50b091d8b69c90195d50ce0f6808f7fb4c7e0b16457" + }, + { + "path": "research/shortest-controller-stage-capacity/PROOF.md", + "usage": "provenance", + "pin": "head:6c088037e13b87faf7cfe3233c53d0ae51850dd8:research/shortest-controller-stage-capacity/PROOF.md", + "git_blob": "3e1a1f6b1f773780927f01e20be6719fe08ca5f3", + "sha256": "df8c53e3b04fdfa9ea10dd02a8bf770ba3111c7fa2d561075e7dd00d2297613e" + }, + { + "path": "research/paired-stage-chronology-cut/PROOF.md", + "usage": "provenance", + "pin": "head:533a5f463e89e6fb74287ffe93c815fe83da10bb:research/paired-stage-chronology-cut/PROOF.md", + "git_blob": "c4bb728b8584144a0e1d58910fbc0ef7c2614ed1", + "sha256": "f93d3e62a9b3f41f49833575d95097777eb112d1068dc7035ee6b7d5304ce2d9" + } + ] +} diff --git a/research/longer-coupled-port-caller/TASK.json b/research/longer-coupled-port-caller/TASK.json new file mode 100644 index 0000000000..fc389f9481 --- /dev/null +++ b/research/longer-coupled-port-caller/TASK.json @@ -0,0 +1,102 @@ +{ + "schema_version": 1, + "task_id": "joint-query-controller", + "priority_revision": 7, + "base_commit": "6cf7a683f447b9f1e2333791907fd92be5009a63", + "original_card": { + "id": "joint-query-controller", + "question": "Can the installed QQ16 caller win a complete matched protocol bill, or can a changed demand eliminate actual paid work?", + "starting_points": [ + "docs/research/research-family-status.md", + "certificates/selected-result.json", + "research/qq16-caller-install/README.md" + ], + "methods": [ + "Derive the matched whole-caller physical bill for installed and baseline protocols.", + "Change the actual demanded observations and prove a cheaper legal producer/consumer contract." + ], + "acceptance_gate": "Name the changed premise of the fixed F0/B1 observation obstruction. Show exactly which query is recovered, legal native reads and restoration, and a full favorable budget including cover maps, helpers and endpoints. Local inverse identities alone do not close the global controller. A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read #4166 COST.md and ADMISSION.json. An actual caller connection is now proposed. Its native-component profile loses; parent park/restore versus external-call costs remain unresolved. Retain the producer and recovery lineage rather than rebuild it.", + "scope": "Source-binding orientation only; no scientific replay, theorem acceptance or supplier admission. Budget any heavy replay separately." + }, + "first_experiment": "At the actual installed cut, compare matched complete parent park/restore and external input/return protocols at the same bank/packet geometry, including every later root call and service cost. Alternatively pin both bridge observations and derive a genuinely smaller source-compatible demand. Stop if the complete necessary inequality fails or an essential cost is unknown; no larger decoder scan from a local tape-action saving.", + "bottleneck_link": "The native local words exist; retained query information and its physical access are the missing link to a composed recursive interface.", + "allowed_variations": [ + "One paid query, one changed first pair, or one precisely specified affine helper state.", + "A counterexample or lower bound for that exact proposed repair.", + "One unresolved obligation of a newer local decoder, with exact source heads and a distinct claim/domain." + ], + "scope_change_triggers": [ + "Retaining the fixed first pair and ordinary schedule while allowing only homogeneous selected-only control, already excluded by the witness.", + "Treating cover-map counts as zero-cost physical address operations.", + "Recreating the pending complete local decoder or early-record/output-bank coalescing already under investigation without a distinct audit or changed premise.", + "Treating a completed-output defect inequality as a producer-interior, dirty-range or physical-cost certificate.", + "Recreating completed-output recovery or caller wiring already supplied by #4166 without new independent coverage.", + "Dropping retained later root calls or claiming native-profile dominance from the isolated publication saving." + ], + "overlap_terms": [ + "QQ16", + "joint-query", + "changing-chart controller", + "selected observation", + "1969", + "2540", + "early record", + "output-bank retention", + "complete native decoder", + "2965", + "producer defect", + "dirty-helper range", + "F17 consumer", + "4166", + "qq16-caller-install" + ], + "existing_checks": [ + { + "scope": "PR #4166: author-checked installed producer/service/return/bridge connection; native-component comparison loses.", + "evidence": "research/qq16-caller-install/README.md", + "remaining": "Complete matched physical protocol bill, or changed source-compatible demand/circuit; no affordable supplier yet.", + "status": "author-checked", + "source_commit": "0b082d22a0e9a442d264ab0633e35ef26c790630", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ] + }, + "scope_status": "changed", + "actual_scope": "An all-order, all-dimension obstruction for the coupled constant-loss star query frame; exact noncommutative rejection certificates for future caller searches", + "scope_change_reason": "The user assigned a longer coupled-port caller search after PR5617 and PR5631. This does not reroll the catalogue card.", + "bottleneck_link": "A better global caller must turn the full local interface into enough independent Gaussian targets to pay its complete recursive bill.", + "budget_minutes": 60, + "stop_rule": "Complete the all-order reduction, replay every exact witness independently, retain a full positive word and fault controls, and publish the scope with exact sources.", + "outcome": "negative-result", + "evidence": "PROOF.md, ORDER-CERTIFICATES.json.gz, check_certificates.py, model_checks.py and RESULT.json", + "author": "Ali Romman with substantial OpenAI Codex assistance", + "ai_assistance": "Substantial OpenAI Codex assistance; no subagents.", + "open_questions": [ + { + "question": "Can a different Gram frame support a profitable longer coupled-port caller?", + "why_it_matters": "The theorem fixes the star grouped query maps, not all rank-q callers.", + "first_step": "Generate a complement frame that is not conjugate to the star; test the mixed chronology equations before full word replay.", + "blocked_by": "A positive relaxed invoice does not supply a compatible ordered word." + }, + { + "question": "Can a changed connector map or more interleaved connector queries evade these identities?", + "why_it_matters": "The four complementary connector queries are part of the excluded contract.", + "first_step": "Write the changed block query matrices, preserve their complete cost, and generate new free-algebra equations.", + "blocked_by": "The current certificates cannot be reused after an equation changes." + }, + { + "question": "Can the binary obstruction be related to a stated characteristic-zero caller contract?", + "why_it_matters": "General dyadic coefficients do not reduce modulo two.", + "first_step": "Identify an integral invariant or a valid denominator-preserving reduction for a concrete caller.", + "blocked_by": "No general reduction is supplied here." + } + ] +} diff --git a/research/longer-coupled-port-caller/VALIDATION.json b/research/longer-coupled-port-caller/VALIDATION.json new file mode 100644 index 0000000000..c4a703ab02 --- /dev/null +++ b/research/longer-coupled-port-caller/VALIDATION.json @@ -0,0 +1,20 @@ +{ + "status": "LOCAL_REPLAY_PASSED_PUBLICATION_CHECKS_PENDING", + "python": "CPython 3.12.13", + "registered_normal": "PASS_REGISTERED_RESEARCH_PACKAGE research/longer-coupled-port-caller outcome=negative-result", + "optimized": "python3.12 -I -O -B research/longer-coupled-port-caller/verify.py; byte-identical RESULT.json", + "metadata_and_pins": "PASS_PACKAGE_METADATA_AND_PINS", + "exact_certificates": 75600, + "matrix_controls": "24 frames, 96 literal mixed coefficients, 206 symbolic blocks, 432 three-leaf restrictions, a full one-leaf word and 1365 parity controls", + "not_run": [ + "Native P104 replay", + "Characteristic-zero reduction", + "Proof-assistant verification", + "Independent human review" + ], + "remaining_publication_checks": [ + "Committed-byte preflight", + "Git-free read-only export", + "GitHub objects and rendered PR readback" + ] +} diff --git a/research/longer-coupled-port-caller/VERIFY.json b/research/longer-coupled-port-caller/VERIFY.json new file mode 100644 index 0000000000..46bda421dc --- /dev/null +++ b/research/longer-coupled-port-caller/VERIFY.json @@ -0,0 +1,21 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/p104-helper-subspace-splits/RESULT.json", + "research/productive-controller-basis-search/algebra.py" + ], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 300, + "checks": "Authenticate inputs; independently expand all 75600 free-algebra witnesses; check coupled matrices, a complete positive word, corruption controls and an exact positive relaxed bill." + } + ] +} diff --git a/research/longer-coupled-port-caller/build_certificates.py b/research/longer-coupled-port-caller/build_certificates.py new file mode 100644 index 0000000000..93caf39361 --- /dev/null +++ b/research/longer-coupled-port-caller/build_certificates.py @@ -0,0 +1,32 @@ +"""Build exact rejection witnesses. Verification does not import this file. + +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. +""" +import gzip +import hashlib +import json +from pathlib import Path +import time +import nc_star as N +import search_orders as S + + +def main(): + N.equations=S.pair_equations + records=[];counts={2:0,3:0};maximum=0;start=time.monotonic() + for index,order in enumerate(S.orders()): + result=N.certificate(3,order,2) + if 'one' not in result['certificates']:result=N.certificate(3,order,3) + if 'one' not in result['certificates']:raise ValueError(('Unproved order',order)) + witness=result['certificates']['one'];degree=result['degree'] + records.append([degree,witness]);counts[degree]+=1;maximum=max(maximum,len(witness)) + if (index+1)%10000==0:print(index+1,round(time.monotonic()-start,2),flush=True) + raw=(json.dumps({'schema':1,'order_rule':'search_orders.orders; first good occurrences 0,1,2','witnesses':records},separators=(',',':'))+'\n').encode() + payload=gzip.compress(raw,compresslevel=9,mtime=0) + folder=Path(__file__).resolve().parent + (folder/'ORDER-CERTIFICATES.json.gz').write_bytes(payload) + summary={'orders':len(records),'degree_counts':counts,'largest_witness_terms':maximum,'uncompressed_bytes':len(raw),'compressed_bytes':len(payload),'sha256':hashlib.sha256(payload).hexdigest()} + (folder/'CERTIFICATE-SUMMARY.json').write_text(json.dumps(summary,indent=2)+'\n') + print(json.dumps(summary),flush=True) + +if __name__=='__main__':main() diff --git a/research/longer-coupled-port-caller/check_certificates.py b/research/longer-coupled-port-caller/check_certificates.py new file mode 100644 index 0000000000..ce0ef0f873 --- /dev/null +++ b/research/longer-coupled-port-caller/check_certificates.py @@ -0,0 +1,152 @@ +"""Check free-algebra witnesses without the search or solver code. + +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. +""" +from collections import Counter +import gzip +import hashlib +import itertools +import json +from pathlib import Path + + +def require(condition,message): + if not condition:raise ValueError(message) + +# A polynomial is a dictionary of words with coefficient one over F2. +def toggle(out,word): + if word in out:del out[word] + else:out[word]=1 + +def xor(*polys): + out={} + for p in polys: + for word in p:toggle(out,word) + return out + +def times(p,q): + out={} + for left in p: + for right in q:toggle(out,left+right) + return out + +ONE={():1} + +def letter(k):return {(k,):1} + +def zeros():return [[{} for _ in range(4)] for _ in range(4)] + +def matrix_sum(a,b):return [[xor(a[i][j],b[i][j]) for j in range(4)] for i in range(4)] + +def matrix_product(a,b): + return [[xor(*(times(a[i][k],b[k][j]) for k in range(4))) for j in range(4)] for i in range(4)] + + +def setup(): + gates=[];base=[] + for s in range(3): + a,b=letter(2*s),letter(2*s+1) + p,r,e,all_r=zeros(),zeros(),zeros(),zeros() + for i in (0,s+1): + e[i][i]=ONE + for j in (0,s+1): + p[i][j]=xor(a,b) if i==j else b + r[i][j]=a;all_r[i][j]=ONE + gates.extend(((p,r),(matrix_sum(p,e),matrix_sum(r,all_r)))) + base.extend((xor(times(a,a),a),xor(times(a,b),times(b,a),b))) + c=letter(6);base.append(xor(times(c,c),c)) + for h in (c,xor(ONE,c)): + p,forward,backward=zeros(),zeros(),zeros() + p[0][0]=h + for i in range(1,4): + forward[0][i]=h;backward[i][0]=h + for j in range(1,4):p[i][j]=h + gates.extend(((p,forward),(p,backward))) + # Compute ordered-pair contributions once. This uses pair sums, not the + # search program's suffix accumulator. + commutators={} + for i in range(6): + for j in range(10): + commutators[i,j]=matrix_sum(matrix_product(gates[i][0],gates[j][1]),matrix_product(gates[j][1],gates[i][0])) + return base,commutators + + +def equations(order,base,commutators,with_labels=False): + out=[zeros() for _ in range(3)] + for earlier,i in enumerate(order): + if i>=6:continue + for j in order[earlier+1:]:out[i//2]=matrix_sum(out[i//2],commutators[i,j]) + result=list(base);labels=[None]*len(base) + for s,mat in enumerate(out): + for r in range(4): + for c in range(4): + if r in (0,s+1) and c in (0,s+1):continue + if mat[r][c]: + result.append(mat[r][c]);labels.append((s,r,c)) + return (result,labels) if with_labels else result + + +def all_orders(): + # Build the order list independently from permutations of six good slots. + # Canonical first occurrences remove exactly the six good-stage renamings. + good=[] + def extend(prefix,counts): + if len(prefix)==6: + good.append(tuple(prefix));return + for s in range(3): + if counts[s]==2:continue + if counts[s]==0 and any(counts[t]==0 for t in range(s)):continue + updated=counts.copy();updated[s]+=1 + extend(prefix+[s],updated) + extend([], [0,0,0]) + for word in good: + for occupied in itertools.combinations(range(10),6): + positions=set(occupied) + for extra in itertools.permutations((6,7,8,9)): + ni=nj=0;seen=[0,0,0];order=[] + for k in range(10): + if k in positions: + s=word[ni];ni+=1;order.append(2*s+seen[s]);seen[s]+=1 + else:order.append(extra[nj]);nj+=1 + yield tuple(order) + + +def check_witness(eqs,witness,degree): + total={} + for index,left,right in witness: + require(type(index) is int and 0<=index>j&1) + rows[j],rows[pivot]=rows[pivot],rows[j] + for i in range(n): + if i!=j and rows[i]>>j&1:rows[i]^=rows[j] + require(tuple(x&((1<>n for x in rows) + +def choose(q,rng): + d=2*q;g=list(eye(d)) + for _ in range(8*d): + i,j=rng.sample(range(d),2);g[i]^=g[j] + gi=inverse(g);diagonal=tuple(1<>i&1 else 0 for i in range(n)) + +def block_put(rows,block,rr,cc,d): + for i,row in enumerate(block):rows[rr*d+i]^=row<<(cc*d) + + +def frame(q,g,rng): + d=2*q;n=d*(g+1);calls=[];target=[];noncommuting=0;parameters=[] + for j in range(g): + a,b=choose(q,rng);p=[0]*n;r=[0]*n;e=[0]*n;t=[0]*n + parameters.extend((a,b)) + noncommuting+=mul(a,b)!=mul(b,a) + for row in (0,j+1): + block_put(e,eye(d),row,row,d) + for col in (0,j+1): + block_put(p,add(a,b) if row==col else b,row,col,d) + block_put(r,a,row,col,d);block_put(t,eye(d),row,col,d) + calls.extend(((j,tuple(p),tuple(r)),(j,add(e,p),add(t,r)))) + target.append(tuple(e)) + c,_=choose(q,rng) + parameters.append(c) + for half,h in enumerate((c,add(eye(d),c))): + p=[0]*n;ra=[0]*n;rb=[0]*n + block_put(p,h,0,0,d) + for j in range(1,g+1): + block_put(ra,h,0,j,d);block_put(rb,h,j,0,d) + for k in range(1,g+1):block_put(p,h,j,k,d) + calls.extend(((g+half,tuple(p),tuple(ra)),(g+half,tuple(p),tuple(rb)))) + target.append(zero(n)) + total=zero(n) + for _,p,r in calls: + require(mul(p,p)==p and rank(p)==2*q,'Native projector') + require(mul(r,r)==zero(n) and rank(r)==q,'Native query') + require(mul(p,r)==r and mul(r,p)==r,'Native compatibility') + total=add(total,r) + require(total==eye(n),'Query sum') + return calls,target,noncommuting,parameters + + +def polynomial_product(a,b): + n=len(next(iter(a.values())));out={} + for x,ax in a.items(): + for y,by in b.items(): + if x&y:continue + key=x|y;out[key]=add(out.get(key,zero(n)),mul(ax,by)) + return {key:mat for key,mat in out.items() if any(mat)} + + +def literal(calls,order,stage=None): + n=len(calls[0][1]);out={0:eye(n)} + for index in order: + group,p,r=calls[index] + gate={0:eye(n),1:r} + if stage is None or group==stage: + bit=1<<(group+1) if stage is None else 2 + gate[bit]=p;gate[bit|1]=r + out=polynomial_product(gate,out) + return out + + +def defects(calls,order,group): + result=zero(len(calls[0][1])) + for i,left in enumerate(order): + if calls[left][0]!=group:continue + p=calls[left][1] + for right in order[i+1:]: + r=calls[right][2];result=add(result,add(mul(p,r),mul(r,p))) + return result + + +def submatrix(matrix,indices): + return tuple(sum(((matrix[i]>>j)&1)<0,'Excluded frame passed all necessary equations');cases+=1 + d=2*q + if g==3 and checker is not None: + base,commutators=checker.setup() + eqs,labels=checker.equations(order,base,commutators,with_labels=True) + for polynomial,label in zip(eqs,labels): + actual=evaluate(polynomial,parameters) + if label is None:require(actual==zero(d),'Local symbolic equation') + else: + stage,row,col=label + expected=tuple((numeric[stage][row*d+i]>>(col*d))&((1<=g] + mapping={old:new for new,old in enumerate(selected)} + reduced=[(chosen.index(stage) if stage0,'Coupled controls must include noncommuting matrices') + # An actual one-leaf word: each channel uses its three-query identity. + calls,targets,_,_=frame(1,1,random.Random(37));order=list(range(6));n=4 + result=literal(calls,order) + expected={0:eye(n),1:eye(n),2:eye(n),3:eye(n)} + require(result==expected,'One-leaf positive word') + changed=list(calls);group,p,r=changed[0];changed[0]=(group,p,zero(n)) + require(literal(changed,order)!=expected,'Deleted query control') + # The two-row argument can be checked without a matrix inventory. + row_cases=0 + for dimension in range(1,7): + for a in range(1<>i&1] + # Independent literal expansion of the relation. + check=ZERO + for ei,left,right in terms:check^=frozenset(tuple(left)+w+tuple(right) for w in eq[ei][1]) + if check!=p:raise ValueError('Bad ideal certificate') + tested[label]=terms + return {'g':g,'order':order,'degree':degree,'names':names,'equations':[(label,[list(w) for w in sorted(p)]) for label,p in eq],'monomials':len(words),'rows':len(generators),'rank':len(basis),'certificates':tested} + + +def main(): + ap=argparse.ArgumentParser();ap.add_argument('--degree',type=int,default=3);ap.add_argument('--limit',type=int,default=1);args=ap.parse_args() + g=3;records=[];start=time.monotonic() + for second in itertools.permutations(range(g)): + for bad in itertools.permutations(((3,0),(3,1),(4,0),(4,1))): + order=[(j,0) for j in range(g)]+list(bad)+[(j,1) for j in second] + r=certificate(g,order,args.degree);records.append(r) + print(json.dumps({k:r[k] for k in ('order','rows','rank','monomials')}|{'certificates':{k:len(v) for k,v in r['certificates'].items()},'seconds':round(time.monotonic()-start,2)}),flush=True) + if len(records)>=args.limit:break + if len(records)>=args.limit:break + Path(__file__).with_name(f'NC-STAR-D{args.degree}.json').write_text(json.dumps(records,indent=2)+'\n') + +if __name__=='__main__':main() diff --git a/research/longer-coupled-port-caller/search_coupled.py b/research/longer-coupled-port-caller/search_coupled.py new file mode 100644 index 0000000000..d7d4be9a4c --- /dev/null +++ b/research/longer-coupled-port-caller/search_coupled.py @@ -0,0 +1,137 @@ +"""Solve chronology constraints for a coupled star frame. + +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. +Discovery only. A solver result is not a native endpoint. +""" +import argparse +import itertools +import json +from pathlib import Path +import time +import z3 +import search_star as S + +# A polynomial is a set of square-free Boolean monomials. An integer gives +# the variable set of one monomial. Zero denotes its constant term. +def plus(a,b): return a^b + +def prod(a,b): + out=set() + for x in a: + for y in b: + z=x|y + if z in out: out.remove(z) + else: out.add(z) + return frozenset(out) + +ZERO=frozenset();ONE=frozenset((0,)) + +def madd(a,b): return [[x^y for x,y in zip(ar,br)] for ar,br in zip(a,b)] + +def mmul(a,b): + n=len(a);out=[[ZERO for _ in range(n)] for _ in range(n)] + for i in range(n): + for k in range(n): + if not a[i][k]: continue + for j in range(n): + if b[k][j]:out[i][j]=out[i][j]^prod(a[i][k],b[k][j]) + return out + +def mcomm(a,b):return madd(mmul(a,b),mmul(b,a)) + +def constant(rows):return [[ONE if row>>j&1 else ZERO for j in range(len(rows))] for row in rows] + + +def model(q,g): + d=2*q;n=d*(g+1);nextvar=0;As=[];Bs=[];vars=[] + for c in range(g): + local=[] + for label in ('a','b'): + mat=[] + for i in range(d): + row=[] + for j in range(d): + row.append(frozenset((1<>j&1 else z3.Not(bit) for i in range(d) for j,bit in enumerate(bits[i*d:(i+1)*d])]) for rows in projectors])) + else:raise ValueError('Use q=2 for this discovery entry point.') + return n,gates,bad,vars,base,expr + + +def solve(q,g,order,timeout): + n,gates,bad,variables,base,expr=model(q,g) + defects=[[[ZERO for _ in range(n)] for _ in range(n)] for _ in range(g+2)] + tail=[[ZERO for _ in range(n)] for _ in range(n)] + for c,k in reversed(order): + p,r=gates[c][k] if c=args.limit:break + if len(records)>=args.limit:break + Path(__file__).with_name('COUPLED-SEARCH.json').write_text(json.dumps({'z3':z3.get_version_string(),'records':records},indent=2)+'\n') + +if __name__=='__main__':main() diff --git a/research/longer-coupled-port-caller/search_orders.py b/research/longer-coupled-port-caller/search_orders.py new file mode 100644 index 0000000000..afbdb06c55 --- /dev/null +++ b/research/longer-coupled-port-caller/search_orders.py @@ -0,0 +1,56 @@ +"""Search all order types of three leaves and four fixed connectors. + +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +import itertools +import json +from pathlib import Path +import time +import nc_star as N + +_original=N.equations + +def pair_equations(g,order): + names,eq=_original(g,order);out=[] + for label,p in eq: + if not label.startswith('chronology'): + out.append((label,p));continue + head,rc=label.split(':');c=int(head.split()[1]);r,col=map(int,rc.split(',')) + if c>=g:continue + if r in (0,c+1) and col in (0,c+1):continue + out.append((label,p)) + return names,out + + +def orders(): + good_words=sorted(set(itertools.permutations((0,0,1,1,2,2)))) + good_words=[w for w in good_words if w.index(0)=args.limit:break + r=N.certificate(3,order,args.degree) + if 'one' in r['certificates']: + hits+=1 + if len(examples)<3:examples.append(r) + else:misses.append(order) + if (i+1)%1000==0:print(json.dumps({'orders':i+1,'certificates':hits,'unresolved':len(misses),'seconds':round(time.monotonic()-start,2)}),flush=True) + report={'scope':'All order types of three good pairs and the four fixed connectors; no matrix size bound','degree':args.degree,'orders':hits+len(misses),'certificates':hits,'unresolved':misses,'examples':examples} + Path(__file__).with_name(f'ORDER-SEARCH-D{args.degree}.json').write_text(json.dumps(report,indent=2)+'\n') + print(json.dumps({k:report[k] for k in ('scope','degree','orders','certificates')}|{'unresolved':len(misses)}),flush=True) + +if __name__=='__main__':main() diff --git a/research/longer-coupled-port-caller/search_star.py b/research/longer-coupled-port-caller/search_star.py new file mode 100644 index 0000000000..3091607d92 --- /dev/null +++ b/research/longer-coupled-port-caller/search_star.py @@ -0,0 +1,155 @@ +"""Search the coupled split of the constant-loss star frame. + +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. +This is a binary necessary-condition search, not a native caller. +""" +import importlib.util +import itertools +import json +from pathlib import Path +import time + +ROOT = Path(__file__).resolve().parents[2] +spec = importlib.util.spec_from_file_location('predecessor', ROOT/'research/productive-controller-basis-search/algebra.py') +old = importlib.util.module_from_spec(spec) +spec.loader.exec_module(old) + +def mul(a, b): + out = [] + for row in a: + value = 0 + while row: + bit = row & -row + value ^= b[bit.bit_length()-1] + row ^= bit + out.append(value) + return tuple(out) + +def add(a, b): + return tuple(x^y for x,y in zip(a,b)) + +def comm(a, b): + return add(mul(a,b),mul(b,a)) + +def packed(a): + n=len(a) + return sum(x << (n*i) for i,x in enumerate(a)) + +def outer(a,b,n): + return tuple(b if a>>i&1 else 0 for i in range(n)) + +def embed(a, indices, n): + out=[0]*n + for i,row in enumerate(a): + out[indices[i]]=sum((1<>j&1) + return tuple(out) + + +def frame(g): + if g<3 or g%2!=1: + raise ValueError('Use an odd leaf count at least three.') + n=2*(g+1) + # Two core coordinates, then two coordinates for each leaf. + local=(5,10,5,10) + identity=(1,2,4,8) + ps=sorted(set(p for p,_ in old.FULL)) + options=[] + for p in ps: + if mul(p,local)!=mul(local,p): continue + r=mul(p,local) + if old.rank(r)!=1: continue + other=add(identity,p) + options.append(((p,r),(other,add(local,r)))) + good=[] + for j in range(g): + indices=(0,1,2+2*j,3+2*j) + good.append([tuple((embed(p,indices,n),embed(r,indices,n)) for p,r in pair) for pair in options]) + bad=[] + for k in range(2): + c=1<1: + mid=(lo+hi)//2 + if pow(mid,320)<=goal:lo=mid + else:hi=mid + return lo,lo if pow(lo,320)==goal else lo+1 + + +def pricing(): + source=json.loads((ROOT/'research/p104-helper-subspace-splits/RESULT.json').read_text())['local'] + net={int(r):v for r,v in source['paid'].items()} + for r,v in source['helpers'].items():net[int(r)]=net.get(int(r),0)-v + require(sum(r*v for r,v in net.items())==1720,'Pinned full rank mass') + g=1023;q=104;coeff={r:-2*(g+2)*v for r,v in net.items()} + coeff[8*g+1]=coeff.get(8*g+1,0)+2*q;coeff[9]=coeff.get(9,0)+2*q*g + lower=upper=0 + for r,count in coeff.items(): + lo,hi=bound_power(r) + lower+=count*(lo if count>=0 else hi) + upper+=count*(hi if count>=0 else lo) + require(lower>0,'The excluded relaxed profile must pass its price screen') + require(20000000>320*62009,'Screen saving exceeds the refreshed selected saving') + h=104*8-720 + require(8*(h-104)=3, all positive channel dimensions, all characteristic-two fields, all call orders; fixed star queries and four complementary connectors','authenticated_inputs':len(inputs),'certificate_check':checker.verify(),'matrix_controls':local('model_checks').run(checker),'pricing':pricing(),'limits':['No native or characteristic-zero reduction','No new kappa','Other query frames and connector contracts are not excluded','No proof-assistant or independent human acceptance']} + encoded=json.dumps(result,indent=2,sort_keys=True)+'\n' + if '--write-result' in sys.argv:(PACKAGE/'RESULT.json').write_text(encoded) + else:require((PACKAGE/'RESULT.json').read_text()==encoded,'Committed result differs from replay') + print(encoded,end='') + +if __name__=='__main__':run() From b904e2748d2374082ceb1a95bdfcfd4b528742db Mon Sep 17 00:00:00 2001 From: Ali Romman <226877337+aliromman@users.noreply.github.com> Date: Sun, 25 Oct 2026 21:23:17 -0500 Subject: [PATCH 2/3] Record independent and Git-free coupled-star verification --- research/longer-coupled-port-caller/DISCOVERY.md | 3 ++- research/longer-coupled-port-caller/VALIDATION.json | 13 ++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/research/longer-coupled-port-caller/DISCOVERY.md b/research/longer-coupled-port-caller/DISCOVERY.md index ff8bf07078..a1ba8e1a79 100644 --- a/research/longer-coupled-port-caller/DISCOVERY.md +++ b/research/longer-coupled-port-caller/DISCOVERY.md @@ -2,7 +2,8 @@ Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. -This file records work in progress. No new kappa is established. +This file records discovery steps. The final result is in PROOF.md. +No new kappa is established. Base: 6cf7a683f447b9f1e2333791907fd92be5009a63. Claim: https://github.com/CrocSwap/integer-mult-bounds/discussions/5593#discussioncomment-19186397 diff --git a/research/longer-coupled-port-caller/VALIDATION.json b/research/longer-coupled-port-caller/VALIDATION.json index c4a703ab02..26642196d5 100644 --- a/research/longer-coupled-port-caller/VALIDATION.json +++ b/research/longer-coupled-port-caller/VALIDATION.json @@ -1,5 +1,5 @@ { - "status": "LOCAL_REPLAY_PASSED_PUBLICATION_CHECKS_PENDING", + "status": "LOCAL_AND_GIT_FREE_REPLAY_PASSED", "python": "CPython 3.12.13", "registered_normal": "PASS_REGISTERED_RESEARCH_PACKAGE research/longer-coupled-port-caller outcome=negative-result", "optimized": "python3.12 -I -O -B research/longer-coupled-port-caller/verify.py; byte-identical RESULT.json", @@ -13,8 +13,11 @@ "Independent human review" ], "remaining_publication_checks": [ - "Committed-byte preflight", - "Git-free read-only export", - "GitHub objects and rendered PR readback" - ] + "GitHub rendered PR and published-body readback" + ], + "proof_commit": "67f12b6bef1e25f649bd62edae36cd144fe19899", + "committed_bytes": "PASS_RESEARCH_COMMIT_BYTES; 22 files", + "git_free_export": "PASS_RESEARCH_EXPORT; 22 files; read-only optimized replay with PATH=/nonexistent; identical result", + "source_corruption": "Changed invoice bytes rejected before computation, then restored", + "github_proof_objects": "Proof, result, sources and independent checker match exact Git blobs at the proof commit" } From 0c27282f56a0e8ec6c1fbad0f2ccca646d0d8442 Mon Sep 17 00:00:00 2001 From: Ali Romman <226877337+aliromman@users.noreply.github.com> Date: Sun, 25 Oct 2026 21:32:30 -0500 Subject: [PATCH 3/3] Record publication status and remove unused discovery helpers --- .../longer-coupled-port-caller/VALIDATION.json | 18 ++++++++++++++---- .../longer-coupled-port-caller/model_checks.py | 3 --- .../search_coupled.py | 2 -- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/research/longer-coupled-port-caller/VALIDATION.json b/research/longer-coupled-port-caller/VALIDATION.json index 26642196d5..632e52fcc3 100644 --- a/research/longer-coupled-port-caller/VALIDATION.json +++ b/research/longer-coupled-port-caller/VALIDATION.json @@ -12,12 +12,22 @@ "Proof-assistant verification", "Independent human review" ], - "remaining_publication_checks": [ - "GitHub rendered PR and published-body readback" - ], "proof_commit": "67f12b6bef1e25f649bd62edae36cd144fe19899", "committed_bytes": "PASS_RESEARCH_COMMIT_BYTES; 22 files", "git_free_export": "PASS_RESEARCH_EXPORT; 22 files; read-only optimized replay with PATH=/nonexistent; identical result", "source_corruption": "Changed invoice bytes rejected before computation, then restored", - "github_proof_objects": "Proof, result, sources and independent checker match exact Git blobs at the proof commit" + "github_proof_objects": "Proof, result, sources and independent checker match exact Git blobs at the proof commit", + "publication": { + "pr": "https://github.com/CrocSwap/integer-mult-bounds/pull/5649", + "rendered_and_read_back": true, + "proof_links_checked_against_github_blobs": true, + "canonical_discussion_read_back": true + }, + "hosted_ci": { + "head": "b904e2748d2374082ceb1a95bdfcfd4b528742db", + "run": 40258944381, + "planner": "Failed two upstream selected-record navigation tests", + "package_replay": "Skipped" + }, + "cleanup": "Removed one unused import and two unused discovery helpers after replay; matrix controls still match the result." } diff --git a/research/longer-coupled-port-caller/model_checks.py b/research/longer-coupled-port-caller/model_checks.py index acb43599c2..3091733bc4 100644 --- a/research/longer-coupled-port-caller/model_checks.py +++ b/research/longer-coupled-port-caller/model_checks.py @@ -2,7 +2,6 @@ Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. """ -from itertools import permutations import random @@ -50,8 +49,6 @@ def choose(q,rng): off=tuple(sum((rng.randrange(2)<>i&1 else 0 for i in range(n)) - def block_put(rows,block,rr,cc,d): for i,row in enumerate(block):rows[rr*d+i]^=row<<(cc*d) diff --git a/research/longer-coupled-port-caller/search_coupled.py b/research/longer-coupled-port-caller/search_coupled.py index d7d4be9a4c..296daa8d50 100644 --- a/research/longer-coupled-port-caller/search_coupled.py +++ b/research/longer-coupled-port-caller/search_coupled.py @@ -13,8 +13,6 @@ # A polynomial is a set of square-free Boolean monomials. An integer gives # the variable set of one monomial. Zero denotes its constant term. -def plus(a,b): return a^b - def prod(a,b): out=set() for x in a: