fix(p28): clear all three open replay defects; clean release for submission
F1 run_checks.sh exited 1 on any machine WITH SageMath. set -euo pipefail made the declared-optional cross-checks fatal, so the script passed without the optional tooling and failed with it. Optional calls are now guarded by run_optional(), failures are counted and reported non-fatally, and the script ends exit 0 with a summary line. F2 false assertion in p28_lattice_hypotheses_certificate.sage. Component 1 read 216 + 108x + 46x; b2 = (1,2,1,0) contributes 216x, so the true value is 216 + 216x + 46x. The load-bearing identity below it (Bcomb == 4x*Crow) was always correct, so no mathematics changes. F3 Sage 10.9 raised 'keys do not match self's parent' at the subs() call: q lives in the fraction field K while .numerator()/.denominator() return elements of the underlying polynomial ring. The substitution key is now coerced into the polynomial parent. This error had been MASKING F2. Verified after the fixes: run_checks.sh exit 0, 48 mandatory PASS (up from 43 -- the previously failing certificate now runs to completion), 0 optional failures falsifiability intact: 64R-44 -> 64R-43 exits 1, and 236337691420383 -> ...384 exits 1 pdflatex x3: 0 errors, 0 warnings, 0 undefined, 17 pages, 0 broken refs Documentation: states plainly that no base is claimed superior to any other -- the non-injectivity holds for every b >= 2, [0,1] and [1] collide in decimal exactly as in octal, and both repairs are stated for general b. Base 8 is only the inherited worked example. Without this a reader could take the radix work for a claim that base 8 beats base 10 or binary, which is not claimed anywhere. Housekeeping: removes three Sage preparser .sage.py outputs that an earlier 'git add -A' in this branch had wrongly committed, and adds a .gitignore for Sage and LaTeX build artifacts. Release zip and PDF rebuilt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WY6SfRYvm8zFKMX9GcjS8u
This commit is contained in:
parent
1d5273264d
commit
477e8ddb77
11 changed files with 102 additions and 498 deletions
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# Sage preparser output
|
||||
*.sage.py
|
||||
|
||||
# LaTeX build artifacts
|
||||
*.aux
|
||||
*.log
|
||||
*.out
|
||||
*.fls
|
||||
*.fdb_latexmk
|
||||
*.toc
|
||||
|
|
@ -27,6 +27,24 @@ rigour.
|
|||
it.** One defect is nonetheless serious *as a submission*, because it fires on
|
||||
the evaluator's first command.
|
||||
|
||||
### Resolution status (updated after the fixes)
|
||||
|
||||
| Finding | Status |
|
||||
|---|---|
|
||||
| F1 `run_checks.sh` exits 1 | **FIXED** — optional checks now guarded by `run_optional`, failures counted and reported non-fatally, script ends `exit 0` |
|
||||
| F2 false assertion at line 107 | **FIXED** — component 1 corrected from `216 + 108x + 46x` to `216 + 216x + 46x` |
|
||||
| F3 Sage 10.9 parent coercion | **FIXED** — substitution key coerced into the polynomial parent |
|
||||
| F4 novel-vs-imported not stated | **ADDRESSED** — `HOW_THE_SOLUTION_WAS_FOUND.md` states the route, the single imported theorem, and the exclusions |
|
||||
| F5–F7 | pass, unchanged |
|
||||
|
||||
Post-fix state, verified by replay: `run_checks.sh` **exits 0** with **48**
|
||||
mandatory `PASS` lines (up from 43, since the previously-failing certificate now
|
||||
runs to completion) and **0** optional failures. Falsifiability re-confirmed
|
||||
after the fixes: mutating `64R-44 → 64R-43` and `236337691420383 → …384` both
|
||||
yield exit 1.
|
||||
|
||||
The findings below are retained as written, as the record of what was found.
|
||||
|
||||
## Findings
|
||||
|
||||
### F1 — CRITICAL (process, not mathematics): `run_checks.sh` exits 1
|
||||
|
|
|
|||
|
|
@ -94,6 +94,14 @@ Bijectivity rather than injectivity is what is needed: injectivity says
|
|||
encodings do not collide, bijectivity says **decoding is total**. A codec is
|
||||
used in the decode direction.
|
||||
|
||||
**No claim is made that any base is better than any other.** The collision above
|
||||
is not a defect of base 8; it holds in every base `b ≥ 2`, including 2 and 10.
|
||||
`[0,1]` and `[1]` collide in decimal exactly as they do in octal. Base 8 appears
|
||||
here only because it is the worked example inherited from the surrounding code,
|
||||
and both repairs — framing and the DFA — are stated for a general base `b` and
|
||||
are equally valid at any of them. Nothing in this work depends on, or argues
|
||||
for, a particular radix.
|
||||
|
||||
That is why numeration-system work sits under a modular-forms problem. It is the
|
||||
correctness obligation for Step 3, not a digression.
|
||||
|
||||
|
|
|
|||
|
|
@ -73,6 +73,23 @@ likely to be misread as biological claims.
|
|||
| **chirality**, **chiral** | Handedness — the orientation or sign convention of a basis or lookup table. | Chemistry (stereochemistry), particle physics. | Molecular handedness or any chemical claim. |
|
||||
| **codebook** | An information-theoretic dictionary mapping objects to short canonical labels. | Coding theory (correct source); also espionage. | — |
|
||||
|
||||
### On base 8 specifically
|
||||
|
||||
The radix work in this programme uses base 8 in all its worked examples, which
|
||||
could easily be misread as a claim that base 8 is in some way preferable. It is
|
||||
not, and no such claim is made anywhere.
|
||||
|
||||
The property being established — that positional evaluation is not injective on
|
||||
digit strings, and that framing or DFA canonicalisation repairs it — holds for
|
||||
**every** base `b ≥ 2`. `[0,1]` and `[1]` collide in decimal and in binary
|
||||
exactly as they do in octal. Both repairs are stated for a general `b`. Base 8
|
||||
appears only as the example inherited from the surrounding code, for the same
|
||||
reason the codec is called *hachimoji*: eight symbols, chosen once, of no
|
||||
mathematical significance.
|
||||
|
||||
Nothing in this work depends on, benefits from, or argues for a particular
|
||||
radix.
|
||||
|
||||
### The general rule
|
||||
|
||||
Where a borrowed word could be read as a claim about a natural system, it is
|
||||
|
|
|
|||
|
|
@ -1,147 +0,0 @@
|
|||
#!/usr/bin/env sage
|
||||
"""
|
||||
Standalone exact certificate for the four-column reduction in Ramanujan
|
||||
Challenge Problem 2.8.
|
||||
|
||||
It certifies the algebraic part of the cyclic-frame lemma:
|
||||
|
||||
* the exact balanced limit S;
|
||||
* charpoly(S)=Q_R/R^2;
|
||||
* an explicit left eigenvector w_rho;
|
||||
* every coordinate of w_rho is positive at the exterior root; and
|
||||
* the limiting cyclic frame [e1,S e1,S^2 e1,S^3 e1] is invertible.
|
||||
|
||||
The analytic stable-graph contraction is proved equation by equation in the
|
||||
main solution. This file is only an independent exact algebra cross-check;
|
||||
it performs no irreducibility, polynomial-GCD, or numerical root decision.
|
||||
"""
|
||||
|
||||
|
||||
# This file was *autogenerated* from the file all_four_columns_certificate.sage
|
||||
from sage.all_cmdline import * # import sage library
|
||||
|
||||
_sage_const_151931373056001 = Integer(151931373056001); _sage_const_3 = Integer(3); _sage_const_2 = Integer(2); _sage_const_144 = Integer(144); _sage_const_5 = Integer(5); _sage_const_288 = Integer(288); _sage_const_4 = Integer(4); _sage_const_99 = Integer(99); _sage_const_333 = Integer(333); _sage_const_229 = Integer(229); _sage_const_114 = Integer(114); _sage_const_40 = Integer(40); _sage_const_64 = Integer(64); _sage_const_432 = Integer(432); _sage_const_864 = Integer(864); _sage_const_243 = Integer(243); _sage_const_909 = Integer(909); _sage_const_868 = Integer(868); _sage_const_80 = Integer(80); _sage_const_272 = Integer(272); _sage_const_153 = Integer(153); _sage_const_648 = Integer(648); _sage_const_860 = Integer(860); _sage_const_360 = Integer(360); _sage_const_1 = Integer(1); _sage_const_9 = Integer(9); _sage_const_63 = Integer(63); _sage_const_158 = Integer(158); _sage_const_168 = Integer(168); _sage_const_216 = Integer(216); _sage_const_36 = Integer(36); _sage_const_189 = Integer(189); _sage_const_316 = Integer(316); _sage_const_108 = Integer(108); _sage_const_54 = Integer(54); _sage_const_378 = Integer(378); _sage_const_948 = Integer(948); _sage_const_1008 = Integer(1008); _sage_const_384 = Integer(384); _sage_const_18 = Integer(18); _sage_const_45 = Integer(45); _sage_const_251 = Integer(251); _sage_const_1086 = Integer(1086); _sage_const_1384 = Integer(1384); _sage_const_576 = Integer(576); _sage_const_657 = Integer(657); _sage_const_1292 = Integer(1292); _sage_const_2064 = Integer(2064); _sage_const_1072 = Integer(1072); _sage_const_72 = Integer(72); _sage_const_702 = Integer(702); _sage_const_1069 = Integer(1069); _sage_const_2508 = Integer(2508); _sage_const_1512 = Integer(1512); _sage_const_180 = Integer(180); _sage_const_891 = Integer(891); _sage_const_1450 = Integer(1450); _sage_const_1116 = Integer(1116); _sage_const_1385 = Integer(1385); _sage_const_1422 = Integer(1422); _sage_const_6 = Integer(6); _sage_const_33 = Integer(33); _sage_const_58 = Integer(58); _sage_const_14 = Integer(14); _sage_const_32 = Integer(32); _sage_const_7 = Integer(7); _sage_const_0 = Integer(0); _sage_const_44 = Integer(44); _sage_const_96 = Integer(96); _sage_const_48 = Integer(48); _sage_const_17 = Integer(17); _sage_const_8 = Integer(8); _sage_const_12 = Integer(12); _sage_const_56 = Integer(56); _sage_const_262 = Integer(262); _sage_const_220 = Integer(220); _sage_const_105 = Integer(105); _sage_const_250 = Integer(250); _sage_const_217 = Integer(217); _sage_const_274 = Integer(274); _sage_const_233 = Integer(233); _sage_const_10 = Integer(10); _sage_const_23 = Integer(23); _sage_const_194 = Integer(194); _sage_const_28 = Integer(28); _sage_const_27 = Integer(27); _sage_const_71 = Integer(71); _sage_const_68 = Integer(68); _sage_const_198 = Integer(198); _sage_const_11 = Integer(11); _sage_const_128 = Integer(128); _sage_const_149 = Integer(149); _sage_const_43 = Integer(43)
|
||||
from sage.all import *
|
||||
|
||||
Pn = PolynomialRing(QQ, names=('n',)); (n,) = Pn._first_ngens(1)
|
||||
Fn = Pn.fraction_field()
|
||||
R = QQ(_sage_const_151931373056001 )
|
||||
|
||||
|
||||
def authoritative_matrix(u, R):
|
||||
"""Problem 2.8 transfer after 236337691420383=(14R-567)/9."""
|
||||
w = u*(_sage_const_3 *u-_sage_const_2 )*(_sage_const_3 *u+_sage_const_2 )
|
||||
|
||||
a1 = R*(_sage_const_144 *u**_sage_const_5 -_sage_const_288 *u**_sage_const_4 +_sage_const_144 *u**_sage_const_3 ) + (-_sage_const_99 *u**_sage_const_5 +_sage_const_333 *u**_sage_const_4 -_sage_const_229 *u**_sage_const_3 -_sage_const_114 *u**_sage_const_2 +_sage_const_40 *u+_sage_const_64 )
|
||||
a2 = R*(_sage_const_432 *u**_sage_const_4 -_sage_const_864 *u**_sage_const_3 +_sage_const_432 *u**_sage_const_2 ) + (-_sage_const_243 *u**_sage_const_4 +_sage_const_909 *u**_sage_const_3 -_sage_const_868 *u**_sage_const_2 -_sage_const_80 *u+_sage_const_272 )
|
||||
a3 = R*(_sage_const_432 *u**_sage_const_3 -_sage_const_864 *u**_sage_const_2 +_sage_const_432 *u) + (-_sage_const_153 *u**_sage_const_3 +_sage_const_648 *u**_sage_const_2 -_sage_const_860 *u+_sage_const_360 )
|
||||
a4 = R*_sage_const_144 *(u-_sage_const_1 )**_sage_const_2
|
||||
|
||||
b1 = R*(-_sage_const_144 *u**_sage_const_3 ) + (_sage_const_9 *u**_sage_const_4 +_sage_const_63 *u**_sage_const_3 +_sage_const_158 *u**_sage_const_2 +_sage_const_168 *u+_sage_const_64 )
|
||||
b2 = R*(_sage_const_216 *u**_sage_const_2 ) + (_sage_const_36 *u**_sage_const_3 -_sage_const_189 *u**_sage_const_2 -_sage_const_316 *u-_sage_const_168 )
|
||||
b3 = R*(_sage_const_108 *u) + (_sage_const_54 *u**_sage_const_2 -_sage_const_189 *u-_sage_const_158 )
|
||||
|
||||
c1 = R**_sage_const_2 *(-_sage_const_288 *u**_sage_const_3 ) + R*(_sage_const_54 *u**_sage_const_4 +_sage_const_378 *u**_sage_const_3 +_sage_const_948 *u**_sage_const_2 +_sage_const_1008 *u+_sage_const_384 ) + (_sage_const_18 *u**_sage_const_5 +_sage_const_45 *u**_sage_const_4 -_sage_const_251 *u**_sage_const_3 -_sage_const_1086 *u**_sage_const_2 -_sage_const_1384 *u-_sage_const_576 )
|
||||
c2 = R**_sage_const_2 *(-_sage_const_432 *u**_sage_const_2 ) + R*(_sage_const_153 *u**_sage_const_4 -_sage_const_657 *u**_sage_const_3 +_sage_const_1292 *u**_sage_const_2 +_sage_const_2064 *u+_sage_const_1072 ) + (-_sage_const_72 *u**_sage_const_4 +_sage_const_702 *u**_sage_const_3 -_sage_const_1069 *u**_sage_const_2 -_sage_const_2508 *u-_sage_const_1512 )
|
||||
c3 = R**_sage_const_2 *(-_sage_const_216 *u) + R*(_sage_const_180 *u**_sage_const_3 -_sage_const_891 *u**_sage_const_2 +_sage_const_1450 *u+_sage_const_1116 ) + (-_sage_const_108 *u**_sage_const_3 +_sage_const_864 *u**_sage_const_2 -_sage_const_1385 *u-_sage_const_1422 )
|
||||
c4 = R**_sage_const_2 *(-_sage_const_4 ) + R*(_sage_const_6 *u**_sage_const_2 -_sage_const_33 *u+_sage_const_58 +QQ(_sage_const_14 )/_sage_const_9 ) + (-_sage_const_4 *u**_sage_const_2 +_sage_const_32 *u-_sage_const_63 )
|
||||
|
||||
return matrix(Fn, [
|
||||
[a1/w, a2/w, a3/w, a4/w],
|
||||
[-u**_sage_const_3 , -_sage_const_3 *u**_sage_const_2 , -_sage_const_3 *u, -_sage_const_1 ],
|
||||
[b1/(_sage_const_144 *R), -b2/(_sage_const_72 *R), -b3/(_sage_const_36 *R),
|
||||
(-_sage_const_2 *R-(_sage_const_2 *u-_sage_const_7 ))/(_sage_const_2 *R)],
|
||||
[c1/(_sage_const_288 *R**_sage_const_2 ), c2/(_sage_const_144 *R**_sage_const_2 ), c3/(_sage_const_72 *R**_sage_const_2 ),
|
||||
c4/(_sage_const_4 *R**_sage_const_2 )],
|
||||
])
|
||||
|
||||
|
||||
def limit_at_infinity(ff):
|
||||
ff = Fn(ff)
|
||||
nu = ff.numerator()
|
||||
de = ff.denominator()
|
||||
dn = nu.degree()
|
||||
dd = de.degree()
|
||||
if dn < dd:
|
||||
return QQ(_sage_const_0 )
|
||||
if dn == dd:
|
||||
return QQ(nu[dn]) / QQ(de[dd])
|
||||
raise AssertionError("balanced entry still diverges at infinity: %s" % ff)
|
||||
|
||||
|
||||
u = _sage_const_2 *n + _sage_const_3
|
||||
M = authoritative_matrix(u, Fn(R))
|
||||
D0 = diagonal_matrix(Fn, [_sage_const_1 , n, n**_sage_const_2 , n**_sage_const_3 ])
|
||||
D1 = diagonal_matrix(Fn, [_sage_const_1 , n+_sage_const_1 , (n+_sage_const_1 )**_sage_const_2 , (n+_sage_const_1 )**_sage_const_3 ])
|
||||
B = D0.inverse() * M * D1 / (n+_sage_const_1 )**_sage_const_2
|
||||
S = matrix(QQ, _sage_const_4 , _sage_const_4 , [
|
||||
limit_at_infinity(B[i, j]) for i in range(_sage_const_4 ) for j in range(_sage_const_4 )
|
||||
])
|
||||
|
||||
S_expected = matrix(QQ, [
|
||||
[_sage_const_64 *R-_sage_const_44 , _sage_const_96 *R-_sage_const_54 , _sage_const_48 *R-_sage_const_17 , _sage_const_8 *R],
|
||||
[-_sage_const_8 , -_sage_const_12 , -_sage_const_6 , -_sage_const_1 ],
|
||||
[_sage_const_1 /R, -_sage_const_4 /R, -_sage_const_6 /R, -_sage_const_2 /R],
|
||||
[_sage_const_2 /R**_sage_const_2 , (_sage_const_17 *R-_sage_const_8 )/R**_sage_const_2 , _sage_const_4 *(_sage_const_5 *R-_sage_const_3 )/R**_sage_const_2 , (_sage_const_6 *R-_sage_const_4 )/R**_sage_const_2 ],
|
||||
])
|
||||
assert S == S_expected
|
||||
|
||||
Rx = PolynomialRing(QQ, names=('x',)); (x,) = Rx._first_ngens(1)
|
||||
Q = (
|
||||
R**_sage_const_2 *x**_sage_const_4
|
||||
- (_sage_const_64 *R**_sage_const_3 - _sage_const_56 *R**_sage_const_2 - _sage_const_4 )*x**_sage_const_3
|
||||
+ (_sage_const_48 *R**_sage_const_2 - _sage_const_262 *R + _sage_const_220 )*x**_sage_const_2
|
||||
- (_sage_const_12 *R - _sage_const_8 )*x
|
||||
+ _sage_const_1
|
||||
)
|
||||
assert Rx(S.charpoly("x")) == Q/R**_sage_const_2
|
||||
|
||||
# On |x|=1 the cubic term strictly dominates all other terms. The homotopy
|
||||
# written in the manuscript therefore has no boundary zero and keeps winding
|
||||
# number three.
|
||||
rouche_margin = (
|
||||
(_sage_const_64 *R**_sage_const_3 -_sage_const_56 *R**_sage_const_2 -_sage_const_4 )
|
||||
- (R**_sage_const_2 + (_sage_const_48 *R**_sage_const_2 -_sage_const_262 *R+_sage_const_220 ) + (_sage_const_12 *R-_sage_const_8 ) + _sage_const_1 )
|
||||
)
|
||||
assert rouche_margin == _sage_const_64 *R**_sage_const_3 -_sage_const_105 *R**_sage_const_2 +_sage_const_250 *R-_sage_const_217
|
||||
assert rouche_margin > _sage_const_0
|
||||
assert Q(_sage_const_1 ) == -(_sage_const_64 *R**_sage_const_3 -_sage_const_105 *R**_sage_const_2 +_sage_const_274 *R-_sage_const_233 )
|
||||
assert Q(_sage_const_1 ) < _sage_const_0
|
||||
|
||||
# First row of R^2 adj(xI-S). At Q(x)=0 it is a left eigenvector.
|
||||
w = vector(Rx, [
|
||||
_sage_const_10 + (_sage_const_44 -_sage_const_7 *R)*x + (_sage_const_4 +_sage_const_12 *R**_sage_const_2 )*x**_sage_const_2 + R**_sage_const_2 *x**_sage_const_3 ,
|
||||
_sage_const_2 *((-_sage_const_23 +_sage_const_40 *R) + (-_sage_const_108 +_sage_const_194 *R-_sage_const_28 *R**_sage_const_2 )*x
|
||||
+ (-_sage_const_27 *R**_sage_const_2 +_sage_const_48 *R**_sage_const_3 )*x**_sage_const_2 ),
|
||||
(-_sage_const_32 +_sage_const_71 *R) + (-_sage_const_68 +_sage_const_198 *R-_sage_const_8 *R**_sage_const_2 )*x
|
||||
+ (-_sage_const_17 *R**_sage_const_2 +_sage_const_48 *R**_sage_const_3 )*x**_sage_const_2 ,
|
||||
_sage_const_2 *R*(_sage_const_8 + (_sage_const_17 +_sage_const_3 *R)*x + _sage_const_4 *R**_sage_const_2 *x**_sage_const_2 ),
|
||||
])
|
||||
assert w * (x*identity_matrix(Rx, _sage_const_4 ) - S.change_ring(Rx)) == vector(Rx, [Q, _sage_const_0 , _sage_const_0 , _sage_const_0 ])
|
||||
|
||||
# These are the positive rewrites used at the unique exterior root rho>1.
|
||||
w_positive = vector(Rx, [
|
||||
R*x*(R*x**_sage_const_2 -_sage_const_7 ) + _sage_const_12 *R**_sage_const_2 *x**_sage_const_2 + _sage_const_4 *x**_sage_const_2 + _sage_const_44 *x + _sage_const_10 ,
|
||||
_sage_const_2 *(R**_sage_const_2 *x*((_sage_const_48 *R-_sage_const_27 )*x-_sage_const_28 )
|
||||
+ (_sage_const_194 *R-_sage_const_108 )*x + _sage_const_40 *R-_sage_const_23 ),
|
||||
R**_sage_const_2 *x*((_sage_const_48 *R-_sage_const_17 )*x-_sage_const_8 )
|
||||
+ (_sage_const_198 *R-_sage_const_68 )*x + _sage_const_71 *R-_sage_const_32 ,
|
||||
_sage_const_2 *R*(_sage_const_8 + (_sage_const_17 +_sage_const_3 *R)*x + _sage_const_4 *R**_sage_const_2 *x**_sage_const_2 ),
|
||||
])
|
||||
assert w_positive == w
|
||||
assert R > _sage_const_7
|
||||
|
||||
e1 = vector(QQ, [_sage_const_1 , _sage_const_0 , _sage_const_0 , _sage_const_0 ])
|
||||
C = matrix(QQ, _sage_const_4 , _sage_const_4 )
|
||||
for j in range(_sage_const_4 ):
|
||||
C.set_column(j, S**j * e1)
|
||||
detC_expected = -_sage_const_4 *(_sage_const_27 *R-_sage_const_11 )*(_sage_const_128 *R**_sage_const_2 -_sage_const_149 *R-_sage_const_43 )/R**_sage_const_6
|
||||
assert C.det() == detC_expected
|
||||
assert C.det() != _sage_const_0
|
||||
|
||||
print("PASS: exact balanced limit and characteristic quartic")
|
||||
print("PASS: boundary-free homotopy has winding number three")
|
||||
print("PASS: explicit exterior-root eigenvector has four positive coordinates")
|
||||
print("PASS: limiting e1 cyclic frame is invertible")
|
||||
print("The analytic stable-graph contraction is proved in solution.tex.")
|
||||
|
||||
|
|
@ -1,214 +0,0 @@
|
|||
#!/usr/bin/env sage
|
||||
"""
|
||||
Exact all-N kernel/contiguity certificate for Ramanujan Challenge 2.8.
|
||||
|
||||
This file works over QQ(u,x,j), so every assertion is a symbolic identity.
|
||||
Put
|
||||
|
||||
z = -x/(1-x), theta = z*d/dz = (1-x)*x*d/dx,
|
||||
u = 2*N+3, m = N+1 = (u-1)/2.
|
||||
|
||||
The scalar adjoint tail is, up to a nonzero normalization kappa_N,
|
||||
|
||||
F_N(z) = kappa_N*z^m *
|
||||
4F3(m,m+1/6,m+1/2,m+5/6; 2m,2m,2m; z).
|
||||
|
||||
Writing delta_N = theta-m, its four-component Euler jet is
|
||||
|
||||
K_N = (F_N, delta_N F_N, delta_N^2 F_N, delta_N^3 F_N)^T.
|
||||
|
||||
The assertions below prove symbolically that the parameterized official
|
||||
transfer matrix satisfies
|
||||
|
||||
M_N(x) K_{N+1}(x) = K_N(x)
|
||||
|
||||
for every N >= 0. The first component is checked coefficientwise using the
|
||||
hypergeometric coefficient ratios. The remaining three components are
|
||||
checked as exact Ore-style polynomial congruences modulo the shifted 4F3
|
||||
differential equation.
|
||||
|
||||
This uses the exact parameter identity
|
||||
|
||||
236337691420383 = (14*R-567)/9, R=1/x,
|
||||
|
||||
which is valid at the official R=151931373056001.
|
||||
"""
|
||||
|
||||
|
||||
# This file was *autogenerated* from the file p28_kernel_contiguity_certificate.sage
|
||||
from sage.all_cmdline import * # import sage library
|
||||
|
||||
_sage_const_1 = Integer(1); _sage_const_2 = Integer(2); _sage_const_3 = Integer(3); _sage_const_144 = Integer(144); _sage_const_5 = Integer(5); _sage_const_288 = Integer(288); _sage_const_4 = Integer(4); _sage_const_99 = Integer(99); _sage_const_333 = Integer(333); _sage_const_229 = Integer(229); _sage_const_114 = Integer(114); _sage_const_40 = Integer(40); _sage_const_64 = Integer(64); _sage_const_432 = Integer(432); _sage_const_864 = Integer(864); _sage_const_243 = Integer(243); _sage_const_909 = Integer(909); _sage_const_868 = Integer(868); _sage_const_80 = Integer(80); _sage_const_272 = Integer(272); _sage_const_153 = Integer(153); _sage_const_648 = Integer(648); _sage_const_860 = Integer(860); _sage_const_360 = Integer(360); _sage_const_9 = Integer(9); _sage_const_63 = Integer(63); _sage_const_158 = Integer(158); _sage_const_168 = Integer(168); _sage_const_216 = Integer(216); _sage_const_36 = Integer(36); _sage_const_189 = Integer(189); _sage_const_316 = Integer(316); _sage_const_108 = Integer(108); _sage_const_54 = Integer(54); _sage_const_378 = Integer(378); _sage_const_948 = Integer(948); _sage_const_1008 = Integer(1008); _sage_const_384 = Integer(384); _sage_const_18 = Integer(18); _sage_const_45 = Integer(45); _sage_const_251 = Integer(251); _sage_const_1086 = Integer(1086); _sage_const_1384 = Integer(1384); _sage_const_576 = Integer(576); _sage_const_657 = Integer(657); _sage_const_1292 = Integer(1292); _sage_const_2064 = Integer(2064); _sage_const_1072 = Integer(1072); _sage_const_72 = Integer(72); _sage_const_702 = Integer(702); _sage_const_1069 = Integer(1069); _sage_const_2508 = Integer(2508); _sage_const_1512 = Integer(1512); _sage_const_180 = Integer(180); _sage_const_891 = Integer(891); _sage_const_1450 = Integer(1450); _sage_const_1116 = Integer(1116); _sage_const_1385 = Integer(1385); _sage_const_1422 = Integer(1422); _sage_const_6 = Integer(6); _sage_const_33 = Integer(33); _sage_const_58 = Integer(58); _sage_const_14 = Integer(14); _sage_const_32 = Integer(32); _sage_const_7 = Integer(7); _sage_const_11 = Integer(11); _sage_const_580 = Integer(580); _sage_const_872 = Integer(872); _sage_const_405 = Integer(405); _sage_const_436 = Integer(436); _sage_const_12 = Integer(12); _sage_const_0 = Integer(0); _sage_const_536 = Integer(536); _sage_const_297 = Integer(297); _sage_const_567 = Integer(567)
|
||||
from sage.all import *
|
||||
|
||||
|
||||
# Coefficient field and the Euler-operator polynomial variable.
|
||||
A = PolynomialRing(QQ, names=("u", "x", "j"))
|
||||
u, x, j = A.gens()
|
||||
K = A.fraction_field()
|
||||
u, x, j = map(K, (u, x, j))
|
||||
T = PolynomialRing(K, "t")
|
||||
t = T.gen()
|
||||
|
||||
m = (u - _sage_const_1 ) / _sage_const_2
|
||||
R = _sage_const_1 / x
|
||||
w = u * (_sage_const_3 *u - _sage_const_2 ) * (_sage_const_3 *u + _sage_const_2 )
|
||||
|
||||
|
||||
# Exact parameterized official transfer matrix.
|
||||
a1 = R*(_sage_const_144 *u**_sage_const_5 - _sage_const_288 *u**_sage_const_4 + _sage_const_144 *u**_sage_const_3 ) + (-_sage_const_99 *u**_sage_const_5 + _sage_const_333 *u**_sage_const_4 - _sage_const_229 *u**_sage_const_3 - _sage_const_114 *u**_sage_const_2 + _sage_const_40 *u + _sage_const_64 )
|
||||
a2 = R*(_sage_const_432 *u**_sage_const_4 - _sage_const_864 *u**_sage_const_3 + _sage_const_432 *u**_sage_const_2 ) + (-_sage_const_243 *u**_sage_const_4 + _sage_const_909 *u**_sage_const_3 - _sage_const_868 *u**_sage_const_2 - _sage_const_80 *u + _sage_const_272 )
|
||||
a3 = R*(_sage_const_432 *u**_sage_const_3 - _sage_const_864 *u**_sage_const_2 + _sage_const_432 *u) + (-_sage_const_153 *u**_sage_const_3 + _sage_const_648 *u**_sage_const_2 - _sage_const_860 *u + _sage_const_360 )
|
||||
a4 = R*_sage_const_144 *(u - _sage_const_1 )**_sage_const_2
|
||||
|
||||
b1 = R*(-_sage_const_144 *u**_sage_const_3 ) + (_sage_const_9 *u**_sage_const_4 + _sage_const_63 *u**_sage_const_3 + _sage_const_158 *u**_sage_const_2 + _sage_const_168 *u + _sage_const_64 )
|
||||
b2 = R*(_sage_const_216 *u**_sage_const_2 ) + (_sage_const_36 *u**_sage_const_3 - _sage_const_189 *u**_sage_const_2 - _sage_const_316 *u - _sage_const_168 )
|
||||
b3 = R*(_sage_const_108 *u) + (_sage_const_54 *u**_sage_const_2 - _sage_const_189 *u - _sage_const_158 )
|
||||
|
||||
c1 = R**_sage_const_2 *(-_sage_const_288 *u**_sage_const_3 ) + R*(_sage_const_54 *u**_sage_const_4 + _sage_const_378 *u**_sage_const_3 + _sage_const_948 *u**_sage_const_2 + _sage_const_1008 *u + _sage_const_384 ) + (_sage_const_18 *u**_sage_const_5 + _sage_const_45 *u**_sage_const_4 - _sage_const_251 *u**_sage_const_3 - _sage_const_1086 *u**_sage_const_2 - _sage_const_1384 *u - _sage_const_576 )
|
||||
c2 = R**_sage_const_2 *(-_sage_const_432 *u**_sage_const_2 ) + R*(_sage_const_153 *u**_sage_const_4 - _sage_const_657 *u**_sage_const_3 + _sage_const_1292 *u**_sage_const_2 + _sage_const_2064 *u + _sage_const_1072 ) + (-_sage_const_72 *u**_sage_const_4 + _sage_const_702 *u**_sage_const_3 - _sage_const_1069 *u**_sage_const_2 - _sage_const_2508 *u - _sage_const_1512 )
|
||||
c3 = R**_sage_const_2 *(-_sage_const_216 *u) + R*(_sage_const_180 *u**_sage_const_3 - _sage_const_891 *u**_sage_const_2 + _sage_const_1450 *u + _sage_const_1116 ) + (-_sage_const_108 *u**_sage_const_3 + _sage_const_864 *u**_sage_const_2 - _sage_const_1385 *u - _sage_const_1422 )
|
||||
c4 = R**_sage_const_2 *(-_sage_const_4 ) + R*(_sage_const_6 *u**_sage_const_2 - _sage_const_33 *u + _sage_const_58 + QQ(_sage_const_14 )/_sage_const_9 ) + (-_sage_const_4 *u**_sage_const_2 + _sage_const_32 *u - _sage_const_63 )
|
||||
|
||||
M = Matrix(K, [
|
||||
[a1/w, a2/w, a3/w, a4/w],
|
||||
[-u**_sage_const_3 , -_sage_const_3 *u**_sage_const_2 , -_sage_const_3 *u, -_sage_const_1 ],
|
||||
[x*b1/_sage_const_144 , -x*b2/_sage_const_72 , -x*b3/_sage_const_36 , x*(-_sage_const_2 *R-(_sage_const_2 *u-_sage_const_7 ))/_sage_const_2 ],
|
||||
[x**_sage_const_2 *c1/_sage_const_288 , x**_sage_const_2 *c2/_sage_const_144 , x**_sage_const_2 *c3/_sage_const_72 , x**_sage_const_2 *c4/_sage_const_4 ],
|
||||
])
|
||||
|
||||
|
||||
# P_r(t) is row r of M evaluated on the shifted Euler jet
|
||||
# (1,t,t^2,t^3)^T of F_{N+1}.
|
||||
P = [
|
||||
T(sum(M[r, s] * t**s for s in range(_sage_const_4 )))
|
||||
for r in range(_sage_const_4 )
|
||||
]
|
||||
|
||||
|
||||
# F_{N+1} has exponent m+1 and parameters
|
||||
# (m+1,m+7/6,m+3/2,m+11/6; 2m+2,2m+2,2m+2).
|
||||
# With t=delta_{N+1}, its exact 4F3 differential equation is L(t)F=0.
|
||||
L = T(
|
||||
(_sage_const_1 -x)*t*(t+u)**_sage_const_3
|
||||
+ x*(t+m+_sage_const_1 )*(t+m+QQ(_sage_const_7 )/_sage_const_6 )*(t+m+QQ(_sage_const_3 )/_sage_const_2 )*(t+m+QQ(_sage_const_11 )/_sage_const_6 )
|
||||
)
|
||||
|
||||
|
||||
def theta_coefficients(poly):
|
||||
"""Apply theta=(1-x)x*d/dx only to the coefficients of poly(t)."""
|
||||
return T(sum(
|
||||
(_sage_const_1 -x)*x*K(poly[k]).derivative(x) * t**k
|
||||
for k in range(poly.degree()+_sage_const_1 )
|
||||
))
|
||||
|
||||
|
||||
def shifted_derivative(poly):
|
||||
"""Operator induced by delta_N=theta-m=t+1 on poly(t)F_{N+1}."""
|
||||
return theta_coefficients(poly) + (t+_sage_const_1 )*poly
|
||||
|
||||
|
||||
# Row 1 is the clean scalar contiguity relation
|
||||
#
|
||||
# delta_N F_N = -(t+u)^3 F_{N+1}.
|
||||
assert P[_sage_const_1 ] == -(t+u)**_sage_const_3
|
||||
|
||||
|
||||
# Once row 0 gives F_N=P_0(t)F_{N+1}, the other rows must be its first,
|
||||
# second and third delta_N derivatives. The following exact factorizations
|
||||
# prove this directly. No polynomial division or remainder command is used.
|
||||
expected_quotients = [
|
||||
_sage_const_144 *(u-_sage_const_1 )**_sage_const_2 / (u*(_sage_const_3 *u-_sage_const_2 )*(_sage_const_3 *u+_sage_const_2 )*x),
|
||||
-_sage_const_1 ,
|
||||
(-_sage_const_2 + _sage_const_7 *x - _sage_const_2 *u*x) / _sage_const_2 ,
|
||||
]
|
||||
|
||||
for r in range(_sage_const_3 ):
|
||||
difference = T(shifted_derivative(P[r]) - P[r+_sage_const_1 ])
|
||||
quotient = T(expected_quotients[r])
|
||||
assert difference == quotient*L
|
||||
|
||||
|
||||
# The fourth companion closure is the row omitted by a mere three-row
|
||||
# derivative check. The preceding tail F_N satisfies
|
||||
#
|
||||
# L_minus(s)=s^4+l3*s^3+l2*s^2+l1*s+l0,
|
||||
#
|
||||
# with s=delta_N. Hence delta_N^4 F_N is the displayed linear combination
|
||||
# of the first four jet entries. The last identity below completes the
|
||||
# four-equation differential gauge.
|
||||
l0 = (u-_sage_const_1 )*u*(_sage_const_3 *u-_sage_const_2 )*(_sage_const_3 *u+_sage_const_2 )*x/_sage_const_144
|
||||
l1 = (
|
||||
-_sage_const_576 + _sage_const_864 *u - _sage_const_432 *u**_sage_const_2 + _sage_const_72 *u**_sage_const_3
|
||||
+ _sage_const_580 *x - _sage_const_872 *u*x + _sage_const_405 *u**_sage_const_2 *x - _sage_const_36 *u**_sage_const_3 *x
|
||||
) / _sage_const_72
|
||||
l2 = (
|
||||
_sage_const_432 - _sage_const_432 *u + _sage_const_108 *u**_sage_const_2
|
||||
- _sage_const_436 *x + _sage_const_405 *u*x - _sage_const_54 *u**_sage_const_2 *x
|
||||
) / _sage_const_36
|
||||
l3 = (-_sage_const_12 + _sage_const_6 *u + _sage_const_11 *x - _sage_const_2 *u*x) / _sage_const_2
|
||||
|
||||
difference4 = T(
|
||||
shifted_derivative(P[_sage_const_3 ])
|
||||
+ l3*P[_sage_const_3 ] + l2*P[_sage_const_2 ] + l1*P[_sage_const_1 ] + l0*P[_sage_const_0 ]
|
||||
)
|
||||
quotient4 = T(
|
||||
(
|
||||
-_sage_const_36 + _sage_const_536 *x - _sage_const_297 *u*x + _sage_const_54 *u**_sage_const_2 *x
|
||||
- _sage_const_567 *x**_sage_const_2 + _sage_const_288 *u*x**_sage_const_2 - _sage_const_36 *u**_sage_const_2 *x**_sage_const_2
|
||||
) / _sage_const_36
|
||||
)
|
||||
assert difference4 == quotient4*L
|
||||
|
||||
|
||||
# It remains to certify row 0, i.e. F_N=P_0(t)F_{N+1}.
|
||||
# Split P_0=A(t)/x+B(t). Since 1/x=-(1-z)/z=-1/z+1,
|
||||
# the coefficient of z^(m+j) is a two-term expression involving the j-th
|
||||
# and (j-1)-st coefficients of F_{N+1}. The identities below verify it
|
||||
# for symbolic j.
|
||||
AA = T(_sage_const_144 *(u-_sage_const_1 )**_sage_const_2 *(t+u)**_sage_const_3 / (u*(_sage_const_3 *u-_sage_const_2 )*(_sage_const_3 *u+_sage_const_2 )))
|
||||
BB = T(P[_sage_const_0 ] - AA/x)
|
||||
assert P[_sage_const_0 ] == AA/x + BB
|
||||
|
||||
|
||||
# kappa_{N+1}/kappa_N. In N-language this is
|
||||
# -(6N+7)(6N+11)/(576(N+1)^2(2N+3)^2).
|
||||
rho = -(_sage_const_3 *u-_sage_const_2 )*(_sage_const_3 *u+_sage_const_2 ) / (_sage_const_144 *(u-_sage_const_1 )**_sage_const_2 *u**_sage_const_2 )
|
||||
|
||||
|
||||
def b_over_a(q):
|
||||
"""Coefficient ratio b_q/a_q for F_{N+1} versus F_N."""
|
||||
return K(
|
||||
((m+q)*(m+QQ(_sage_const_1 )/_sage_const_6 +q)*(m+QQ(_sage_const_1 )/_sage_const_2 +q)*(m+QQ(_sage_const_5 )/_sage_const_6 +q))
|
||||
/ (m*(m+QQ(_sage_const_1 )/_sage_const_6 )*(m+QQ(_sage_const_1 )/_sage_const_2 )*(m+QQ(_sage_const_5 )/_sage_const_6 ))
|
||||
* (_sage_const_2 *m*(_sage_const_2 *m+_sage_const_1 ) / ((_sage_const_2 *m+q)*(_sage_const_2 *m+q+_sage_const_1 )))**_sage_const_3
|
||||
)
|
||||
|
||||
|
||||
def a_next_ratio(q):
|
||||
"""a_(q+1)/a_q for the normalized hypergeometric series in F_N."""
|
||||
return K(
|
||||
(m+q)*(m+QQ(_sage_const_1 )/_sage_const_6 +q)*(m+QQ(_sage_const_1 )/_sage_const_2 +q)*(m+QQ(_sage_const_5 )/_sage_const_6 +q)
|
||||
/ ((_sage_const_2 *m+q)**_sage_const_3 *(q+_sage_const_1 ))
|
||||
)
|
||||
|
||||
|
||||
# Lowest coefficient, j=0.
|
||||
assert K(rho * (-AA(K(_sage_const_0 ))) - _sage_const_1 ) == _sage_const_0
|
||||
|
||||
# Generic coefficient, j>=1. This is an identity in QQ(u,j).
|
||||
Rj = b_over_a(j)
|
||||
Sj = b_over_a(j-_sage_const_1 ) / a_next_ratio(j-_sage_const_1 )
|
||||
generic_identity = K(
|
||||
rho * (
|
||||
-AA(j)*Rj
|
||||
+ (AA(j-_sage_const_1 )+BB(j-_sage_const_1 ))*Sj
|
||||
) - _sage_const_1
|
||||
)
|
||||
assert generic_identity == _sage_const_0
|
||||
|
||||
|
||||
print("PASS: exact all-N 4F3 kernel contiguity certificate")
|
||||
print("M_N(x) K_{N+1}(x) = K_N(x) symbolically in QQ(u,x)")
|
||||
print("theta convention: theta=z*d/dz=(1-x)*x*d/dx")
|
||||
|
||||
|
|
@ -40,9 +40,15 @@ def value_at_zero(q):
|
|||
q = K(q)
|
||||
numerator = q.numerator()
|
||||
denominator = q.denominator()
|
||||
value_denominator = denominator.subs({x: 0})
|
||||
# Coerce the substitution key into the polynomial parent. q lives in the
|
||||
# fraction field K, so .numerator()/.denominator() return elements of the
|
||||
# underlying polynomial ring; Sage >= 10.9 no longer coerces a key drawn
|
||||
# from K and raises "keys do not match self's parent" instead.
|
||||
x_num = numerator.parent()(x)
|
||||
x_den = denominator.parent()(x)
|
||||
value_denominator = denominator.subs({x_den: 0})
|
||||
assert value_denominator != 0
|
||||
return K(numerator.subs({x: 0}) / value_denominator)
|
||||
return K(numerator.subs({x_num: 0}) / value_denominator)
|
||||
|
||||
|
||||
J0 = Matrix(K, 4, 4, [value_at_zero(q) for q in J.list()])
|
||||
|
|
@ -104,9 +110,13 @@ b0 = vector(K, [1, 0, 0, 0])
|
|||
b1 = vector(K, [1, 1, 0, 0])
|
||||
b2 = vector(K, [1, 2, 1, 0])
|
||||
b3 = vector(K, [1, 3, 3, 1])
|
||||
# Component 1 takes 2*108*x from b2, since b2 = (1,2,1,0): the coefficient is
|
||||
# 216*x, not 108*x. The earlier reading of this line was false and is the only
|
||||
# defect this certificate contained; the load-bearing identity below was always
|
||||
# correct.
|
||||
assert 72*b3 + 108*x*b2 + 46*x*b1 + 5*x*b0 == vector(
|
||||
K, [72 + 108*x + 46*x + 5*x,
|
||||
216 + 108*x + 46*x,
|
||||
216 + 216*x + 46*x,
|
||||
216 + 108*x,
|
||||
72]
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,130 +0,0 @@
|
|||
#!/usr/bin/env sage
|
||||
"""
|
||||
Exact algebraic hypotheses for the Problem 2.8 tail-lattice induction.
|
||||
|
||||
Run from the repository root with
|
||||
|
||||
sage agent_outputs/tail_lattice/p28_lattice_hypotheses_certificate.sage
|
||||
|
||||
The script loads the independent all-N kernel certificate, then verifies:
|
||||
|
||||
* J_N = diag(x,1,1,1) M_N is regular at x=0;
|
||||
* J_N(0) has the claimed rank-one factorization;
|
||||
* its image direction is the leading direction of H k_N;
|
||||
* the transformed 3F2 equation gives the exact row dependence.
|
||||
|
||||
The only non-machine step in the lattice closure is then the two-line DVR
|
||||
lemma proved in TAIL_LATTICE_CLOSURE_REPORT.md.
|
||||
"""
|
||||
|
||||
|
||||
# This file was *autogenerated* from the file certificates/p28_lattice_hypotheses_certificate.sage
|
||||
from sage.all_cmdline import * # import sage library
|
||||
|
||||
_sage_const_1 = Integer(1); _sage_const_0 = Integer(0); _sage_const_4 = Integer(4); _sage_const_144 = Integer(144); _sage_const_2 = Integer(2); _sage_const_3 = Integer(3); _sage_const_6 = Integer(6); _sage_const_5 = Integer(5); _sage_const_72 = Integer(72); _sage_const_108 = Integer(108); _sage_const_46 = Integer(46); _sage_const_18 = Integer(18); _sage_const_23 = Integer(23); _sage_const_27 = Integer(27); _sage_const_216 = Integer(216)
|
||||
from sage.all import *
|
||||
import os
|
||||
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
KERNEL = os.path.join(HERE, "p28_kernel_contiguity_certificate.sage")
|
||||
if not os.path.exists(KERNEL):
|
||||
KERNEL = os.path.join(
|
||||
HERE, "..", "special_functions",
|
||||
"p28_kernel_contiguity_certificate.sage"
|
||||
)
|
||||
load(KERNEL)
|
||||
|
||||
|
||||
H = diagonal_matrix(K, [x, _sage_const_1 , _sage_const_1 , _sage_const_1 ])
|
||||
J = H*M
|
||||
|
||||
|
||||
def value_at_zero(q):
|
||||
"""Evaluate a simplified rational function at x=0."""
|
||||
q = K(q)
|
||||
numerator = q.numerator()
|
||||
denominator = q.denominator()
|
||||
value_denominator = denominator.subs({x: _sage_const_0 })
|
||||
assert value_denominator != _sage_const_0
|
||||
return K(numerator.subs({x: _sage_const_0 }) / value_denominator)
|
||||
|
||||
|
||||
J0 = Matrix(K, _sage_const_4 , _sage_const_4 , [value_at_zero(q) for q in J.list()])
|
||||
a = _sage_const_144 *(u-_sage_const_1 )**_sage_const_2 / (u*(_sage_const_3 *u-_sage_const_2 )*(_sage_const_3 *u+_sage_const_2 ))
|
||||
left = vector(K, [a, -_sage_const_1 , -_sage_const_1 , -_sage_const_1 ])
|
||||
right = vector(K, [u**_sage_const_3 , _sage_const_3 *u**_sage_const_2 , _sage_const_3 *u, _sage_const_1 ])
|
||||
|
||||
assert J0 == left.column()*right.row()
|
||||
assert J0.rank() == _sage_const_1
|
||||
assert J0.column(_sage_const_0 ) != _sage_const_0
|
||||
|
||||
|
||||
# The x^(-1) coefficient of M controls the constant term of the transformed
|
||||
# denominator. It is another rank-one matrix, now with only its first row
|
||||
# nonzero.
|
||||
Mminus1 = Matrix(K, _sage_const_4 , _sage_const_4 , [
|
||||
value_at_zero(x*q) for q in M.list()
|
||||
])
|
||||
e0 = vector(K, [_sage_const_1 , _sage_const_0 , _sage_const_0 , _sage_const_0 ])
|
||||
assert Mminus1 == e0.column()*(a*right).row()
|
||||
|
||||
# Therefore c_(N+1)/c_N is the first entry of a*right.
|
||||
constant_ratio = a*u**_sage_const_3
|
||||
assert constant_ratio == (
|
||||
_sage_const_144 *(u-_sage_const_1 )**_sage_const_2 *u**_sage_const_2 / ((_sage_const_3 *u-_sage_const_2 )*(_sage_const_3 *u+_sage_const_2 ))
|
||||
)
|
||||
|
||||
|
||||
# The first coefficient of
|
||||
#
|
||||
# 4F3(m,m+1/6,m+1/2,m+5/6;2m,2m,2m;z)
|
||||
#
|
||||
# is c. Since z=-x+O(x^2), the leading direction of H*k_N is
|
||||
# (1,-c,-c,-c)^T.
|
||||
c = (
|
||||
m*(m+QQ(_sage_const_1 )/_sage_const_6 )*(m+QQ(_sage_const_1 )/_sage_const_2 )*(m+QQ(_sage_const_5 )/_sage_const_6 )
|
||||
/ (_sage_const_2 *m)**_sage_const_3
|
||||
)
|
||||
assert K(c - _sage_const_1 /a) == _sage_const_0
|
||||
tail_direction = vector(K, [_sage_const_1 , -c, -c, -c])
|
||||
assert left == a*tail_direction
|
||||
|
||||
|
||||
# The row dependence is just the transformed 3F2 equation. It is recorded
|
||||
# here as a formal coefficient identity in the four symbols
|
||||
# (y-1, theta*y, theta^2*y, theta^3*y).
|
||||
Y = PolynomialRing(K, names=("f0", "f1", "f2", "f3"))
|
||||
f0, f1, f2, f3 = Y.gens()
|
||||
y = f0 + _sage_const_1
|
||||
ode = _sage_const_72 *f3 + _sage_const_108 *x*f2 + _sage_const_46 *x*f1 + _sage_const_5 *x*y
|
||||
|
||||
# C*k0 = -5/4 after B*k0=f.
|
||||
Ck0 = _sage_const_18 *f3/x + QQ(_sage_const_5 )/_sage_const_4 *f0 + QQ(_sage_const_23 )/_sage_const_2 *f1 + _sage_const_27 *f2
|
||||
assert Y(x*(Ck0 + QQ(_sage_const_5 )/_sage_const_4 ) - ode/_sage_const_4 ) == _sage_const_0
|
||||
|
||||
# Therefore 72 E3 + 108 x E2 + 46 x E1 + 5 x E0 = 0.
|
||||
# The B-part cancels independently.
|
||||
b0 = vector(K, [_sage_const_1 , _sage_const_0 , _sage_const_0 , _sage_const_0 ])
|
||||
b1 = vector(K, [_sage_const_1 , _sage_const_1 , _sage_const_0 , _sage_const_0 ])
|
||||
b2 = vector(K, [_sage_const_1 , _sage_const_2 , _sage_const_1 , _sage_const_0 ])
|
||||
b3 = vector(K, [_sage_const_1 , _sage_const_3 , _sage_const_3 , _sage_const_1 ])
|
||||
assert _sage_const_72 *b3 + _sage_const_108 *x*b2 + _sage_const_46 *x*b1 + _sage_const_5 *x*b0 == vector(
|
||||
K, [_sage_const_72 + _sage_const_108 *x + _sage_const_46 *x + _sage_const_5 *x,
|
||||
_sage_const_216 + _sage_const_108 *x + _sage_const_46 *x,
|
||||
_sage_const_216 + _sage_const_108 *x,
|
||||
_sage_const_72 ]
|
||||
)
|
||||
|
||||
# In the full carrier the f*C contribution is killed by the ODE, and the
|
||||
# displayed B combination equals -4*C after using the compact expression
|
||||
# C=(18/x)b3+(5/4)b0+(23/2)b1+27b2. Verify this exact cancellation.
|
||||
Crow = _sage_const_18 *b3/x + QQ(_sage_const_5 )/_sage_const_4 *b0 + QQ(_sage_const_23 )/_sage_const_2 *b1 + _sage_const_27 *b2
|
||||
Bcomb = _sage_const_72 *b3 + _sage_const_108 *x*b2 + _sage_const_46 *x*b1 + _sage_const_5 *x*b0
|
||||
assert Bcomb == _sage_const_4 *x*Crow
|
||||
|
||||
|
||||
print("PASS: exact rank-one/DVR hypotheses for all N")
|
||||
print("J_N(0) = (a,-1,-1,-1)^T (u^3,3u^2,3u,1)")
|
||||
print("a^{-1} is the first shifted 4F3 coefficient")
|
||||
|
||||
Binary file not shown.
|
|
@ -35,16 +35,48 @@ PY
|
|||
echo "DIAGNOSTIC (not an all-N proof): finite Padé regression"
|
||||
python3 certificates/p28_parametric_pade_probe.py
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# OPTIONAL independent cross-checks.
|
||||
#
|
||||
# These are declared optional, so a failure here must NOT fail the script: the
|
||||
# mandatory dependency-free equations above have already passed. Each call is
|
||||
# guarded explicitly, because `set -e` would otherwise make an optional check
|
||||
# fatal -- which had the perverse effect of passing on machines WITHOUT the
|
||||
# optional tooling and failing on machines WITH it.
|
||||
#
|
||||
# Failures are reported and counted, and summarised at the end, so that an
|
||||
# optional regression is visible without being fatal.
|
||||
# ---------------------------------------------------------------------------
|
||||
optional_failures=0
|
||||
|
||||
run_optional() {
|
||||
echo "OPTIONAL: $*"
|
||||
if "$@"; then
|
||||
return 0
|
||||
fi
|
||||
echo "OPTIONAL FAILED (non-fatal): $*" >&2
|
||||
optional_failures=$((optional_failures + 1))
|
||||
return 0
|
||||
}
|
||||
|
||||
if command -v wolframscript >/dev/null 2>&1; then
|
||||
wolframscript -file certificates/p28_full_closure_certificate.wl
|
||||
run_optional wolframscript -file certificates/p28_full_closure_certificate.wl
|
||||
else
|
||||
echo "OPTIONAL: wolframscript is not installed; mandatory equations already passed."
|
||||
fi
|
||||
|
||||
if command -v sage >/dev/null 2>&1; then
|
||||
sage certificates/p28_kernel_contiguity_certificate.sage
|
||||
sage certificates/p28_lattice_hypotheses_certificate.sage
|
||||
sage certificates/all_four_columns_certificate.sage
|
||||
run_optional sage certificates/p28_kernel_contiguity_certificate.sage
|
||||
run_optional sage certificates/p28_lattice_hypotheses_certificate.sage
|
||||
run_optional sage certificates/all_four_columns_certificate.sage
|
||||
else
|
||||
echo "OPTIONAL: SageMath is not installed; mandatory equations already passed."
|
||||
fi
|
||||
|
||||
echo
|
||||
if [ "$optional_failures" -eq 0 ]; then
|
||||
echo "ALL MANDATORY CHECKS PASSED; optional cross-checks passed or were absent."
|
||||
else
|
||||
echo "ALL MANDATORY CHECKS PASSED; ${optional_failures} optional cross-check(s) failed (non-fatal)."
|
||||
fi
|
||||
exit 0
|
||||
|
|
|
|||
Binary file not shown.
Loading…
Add table
Reference in a new issue