feat: proofs for rational function lemmas - #497
Conversation
🤖 PR Summary
feat: proofs for rational function lemmas This PR refactors and extends the rational functions formalization following Appendix A of [BCIKS20]. It modularizes the monolithic Mathematical Formalization
Proof Completion (Partial)
Protocols / Soundness
Infrastructure / CI
Documentation
Refactoring
Critical Statistics
Lean Declarations ✏️ Removed: 64 declaration(s)
✏️ Added: 234 declaration(s)
…and 84 more not listed.
✅ Removed: 5 `sorry`(s)
❌ Added: 2 `sorry`(s)
Coverage Notes
📄 **Per-File Summaries**
Last updated: 2026-07-14 13:35 UTC. |
🤖 AI ReviewOverall Summary: Mechanical Pre-Check Results: Mechanical pre-checks reveal numerous Checklist Coverage: No explicit checklist was provided for this PR. Cross-File Issues: The degree constraint on Critical Misformalizations:
Key Lean 4 / Mathlib Issues:
Overall Verdict: Changes Requested 🔍 **Mechanical Pre-Check Results**Pre-existing escape hatches in touched files (context only, does not affect verdict):
🔗 **Cross-File Analysis**Cross-File Analysis:
Cross-File Composition Issues:
Axiom/Escape Hatch Impact: None External Dependency Issues: None Missing Cross-File Verification: None Cluster: Function Field Y-Degree Fix (critical)Are the new hypotheses 📄 **Review for `ArkLib/Data/Polynomial/RationalFunctions.lean`**Analysis: Context validation: The introduction of the positive Y-degree requirement ( Resolution leap: Despite the valid mathematical updates, the file retains unresolved Verdict: Changes Requested Critical Misformalizations: None Lean 4 / Mathlib Issues:
Nitpicks: None 📄 **Review for `ArkLib/Data/CodingTheory/ProximityGap/BCIKS20/ListDecoding/Extraction.lean`**Analysis:
Everything is well-typed, mathematically sound, and properly integrated. Verdict: Approved Critical Misformalizations: None Lean 4 / Mathlib Issues: None Nitpicks: None 📄 **Review for `ArkLib/Data/CodingTheory/ProximityGap/BCIKS20/ListDecoding/Agreement.lean`**Analysis: Verdict: Changes Requested Critical Misformalizations: None Lean 4 / Mathlib Issues:
Nitpicks: None |
Replace `(ξ_regular).choose` with an explicit polynomial witness so that `canonicalRepOf𝒪 hH ξ` has a tractable form for `weight_ξ_bound`. Also adds reusable helper `W_pow_mul_eval₂_div_eq_sum` extracting the denominator-clearing rewrite shared by both the regular-witness proof and the embedding equation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Foundation lemmas for `weight_Λ` from Appendix A.2 of [BCIKS20]: * `le_weight_Λ_of_mem_support`, `weight_Λ_le_iff` (characterization) * `weight_Λ_C_le`, `weight_Λ_X_pow_le`, `weight_Λ_C_mul_X_pow_le` (monomials) * `weight_Λ_neg`, `weight_Λ_add_le`, `weight_Λ_sub_le`, `weight_Λ_sum_le` Statement gotcha: lemmas use `WithBot.some (...)` rather than `(↑(...) : WithBot ℕ)`, since `Finset.le_sup` returns the former and the cast form trips up unification. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`weight_Λ_C_mul_X_pow_mul_le`: if `Λ(f) ≤ b`, then `Λ(C c · Y^k · f) ≤ k · m + c.natDegree + b`. This is the specific shape needed for the mod-reduction step `p ↦ p − C(p.leadingCoeff) · Y^j · H_tilde'`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`weight_Λ_H_tilde'_le`: when `D ≥ totalDegree H` and `0 < H.natDegree`, `Λ(H_tilde' H) ≤ d_H · m`. The exact bound (with equality when totalDegree H = D) follows from term-by-term analysis: each lower term `H.coeff i · W^(d_H-1-i) · Y^i` has weight `i·m + (D-i) + (d_H-1-i)(D-d_H)`, which collapses to `d_H·m` after algebraic simplification. Also adds `natDegree_coeff_le_of_totalDegree_le` (utility), and bumps the longFile linter cap to 1700 to accommodate ongoing weight-bound work. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`natDegree_H_tilde' : (H_tilde' H).natDegree = H.natDegree` when `0 < H.natDegree`. Proved via the explicit decomposition `X^d + lower` with `lower.degree < d`. Needed to align with `Polynomial.modByMonic`'s use of `q.natDegree` in its recursive step. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`weight_Λ_sub_leadingCoeff_mul_H_tilde'_le`: subtracting `C(p.leadingCoeff) · Y^(p.natDegree - d_H) · H_tilde' H` from `p` doesn't increase Λ-weight. The full mod-reduction non-increase (`weight_Λ_modByMonic_le`) iterates this step across the recursion of `Polynomial.modByMonic`; the inductive proof is in progress. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # ArkLib/Data/CodingTheory/ProximityGap/BCIKS20/ListDecoding/Agreement.lean # ArkLib/Data/Polynomial/RationalFunctions.lean
Automated commit at 20260607_005126 Co-authored-by: aleph-prover[bot] <247409690+aleph-prover[bot]@users.noreply.github.com>
Automated commit at 20260607_022426 Co-authored-by: aleph-prover[bot] <247409690+aleph-prover[bot]@users.noreply.github.com>
….2 scaffolding The lone remaining sorry in Claim A.2 (exists_hensel_numerator_sequence) was unprovable as stated: gammaOfNumerators encoded the lift via PowerSeries.subst with constant term -x₀, but Mathlib's subst requires a nilpotent constant coefficient. Over the field 𝕃 H that forces x₀ = 0, so for x₀ ≠ 0 the substitution degenerated to junk and the root condition was false. Per BCIKS20 Appendix A.4, γ = ∑ αₜ(X-x₀)ᵗ ∈ L[[X-x₀]] with R(X,γ,Z)=0: the x₀-shift belongs at R's X-variable (X ↦ x₀+S), not in γ. Fix: - liftCoeffToPowerSeries now takes x₀ and sends X ↦ C x₀ + S - evalRAtPowerSeries threads x₀ - gammaOfNumerators / gammaFromAlpha are the plain local series PowerSeries.mk α Ported the Claim A.2 Hensel scaffolding from PR #540, re-verified under the corrected coordinate. The theorem is now a true statement reduced to exactly three isolated, documented cores (formal Hensel α-sequence, residual regularity, weight induction). Downstream Agreement.lean still builds. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ensel existence)
Closes the formal-Hensel / Newton-iteration core of Claim A.2: existence of
the coefficient sequence αseq with α₀ = T/W and R(x₀+S, ∑αₜSᵗ, Z) = 0 in
𝕃 H⟦S⟧. Proved bottom-up via a Taylor linear-approximation lemma
(remainder_low_order), a coefficient-split lemma showing the degree-n
coefficient is ζ·αₙ + (terms in α_{<n}) with the linear coefficient equal to ζ
by definitional unfolding, and a well-founded construction αₙ := -cₙ/ζ whose
every coefficient vanishes by strong induction (root_bSeq), assembled with
PowerSeries.ext.
#print axioms formalHenselAlphaSequence = [propext, Classical.choice,
Quot.sound] (no sorryAx). Two Claim A.2 cores remain (residual regularity,
weight induction).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ring
Closes the residual-regularity core of Claim A.2 (BCIKS20 App A.4, pp.52-53).
Via the existing coeff_evalR_split, the Hensel residual equals coeff (t+1) of R
evaluated at the truncated series mk αtrunc (the ζ·α(t+1) linear term cancels
exactly). Expanding eval₂ over R.support with coeff_mul/coeff_pow reduces to a
per-composition clearing argument: parts > t vanish; otherwise the denominator
W^{i+1} eta^{e_i} of each factor divides Ddiv (exponent bounds ∑e ≤ E-1=2t and
W-budget b+j ≤ t+d, with the single boundary W-deficit covered by
leadingCoeff_dvd_evalX_coeff_natDegree: coeff 0 of liftCoeff (R.coeff d) is W
times a regular element). Regularity follows from closure of regularElementsSet,
packaged via a reusable AllCoeffRegular predicate.
This makes exists_regular_numerator_shape and regular_numerator_shape_succ fully
axiom-clean, i.e. the entire lift-semantics conjunct of Claim A.2 is now proved.
#print axioms henselCoeffResidual_regular_after_clearing = [propext,
Classical.choice, Quot.sound]. One core remains (weight-bound induction).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…und gap Adds reusable, axiom-clean Λ-weight bookkeeping for Claim A.2's weight bound: weight_Λ_mul_le' / weight_Λ_over_𝒪_mul_le' (subadditivity under multiplication), weight_Λ_over_𝒪_neg, and a RegularWeightLe certificate predicate with closure API (.mono/.mul/.add/.neg/.pow/.sum/.prod) plus base certificates (RWL_lift, RWL_W, RWL_X, RWL_fieldTo, RWL_binom_coeff, RWL_coeff_liftCoeff). Documents the precise remaining gap in numerator_shape_weight_succ_le_strong: the lemma is unprovable as structured because the loose induction hypothesis Λ(βₛ) ≤ (2s+1)·dY·D cannot feed multiplicatively (a β₁² term already gives 6·dY·D > 5·dY·D at t=1). The paper's bound 1+(t+1)Λ(W)+eₜΛ(ξ) telescopes only at the sharp level; closing it needs sharp X/Y-degree accounting through the %ₘ H_tilde' reduction (a strengthened induction, not the loose ihAll). File builds; one documented sorry remains (the weight bound). Cores #1 (Hensel-lift existence) and #2 (residual regularity) are proved axiom-clean, so the entire lift-semantics conjunct of Claim A.2 holds. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…oping Add RWL_W_sharp (Λ(W) ≤ D - dH), numeratorShapeSharp definition, and numeratorShapeSharp_le_loose (the pure-arithmetic final weakening sharp t ≤ (2t+1)·dY·D). These set up the sharp induction that replaces the unprovable loose successor step. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the unprovable loose successor step numerator_shape_weight_succ_le_strong with a sharp strong-induction (numerator_shape_weight_sharp) bounding Λ(βₜ) ≤ numeratorShapeSharp R H D t. numerator_shape_weight_bound (statement unchanged, consumed by exists_hensel_numerator_sequence) now weakens the sharp bound via numeratorShapeSharp_le_loose. Proven: the βₜ₊₁ = -(residual·Ddiv) bridge identity (betaSucc_eq_neg_clearedResidual), the embedding→𝒪 weight bridge, the zero/successor induction skeleton. The single remaining sorry is now the precisely-stated weight-tracking core henselClearedResidual_weight (Λ-graded analogue of henselClearedTerm_regular). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implement henselClearedTerm_weight (Λ-graded analogue of henselClearedTerm_regular):
the full coeff_mul/coeff_pow expansion, per-composition product clearing, the
sharp-sum identity ∑sharp(l i)=j+Pw·ΛW+Pe·Λξ, and the non-boundary per-summand
weight bound (D + wb·ΛW + E1·Λξ ≤ sharp(t+1), reduced to dH ≤ dY) are all proven.
Fill henselClearedResidual_weight fully (henselCoeffResidual_eq_trunc + expansion +
RegularWeightLe.sum over henselClearedTerm_weight), taking 2 ≤ natDegreeY R.
Two precisely-isolated gaps remain:
1. the single boundary summand (p.1=0, j=d≥2, p.2=t+1) where uniform accounting
over-counts by D-d and the refined zero-part/multiplicity bookkeeping is needed;
2. the degenerate natDegreeY R = 1 case (ξ_weight_le needs 2 ≤ dY).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Conflicts resolved: - ArkLib/Data/Polynomial/RationalFunctions.lean: keep the modularized umbrella; every declaration from main's monolith is present under the renamed RationalFunctions namespace (regularElms_set -> regularElementsSet, H_tilde_equiv_H_tilde' -> map_H_tilde'_eq_H_tilde, Lemma_A_1 -> lemmaA1_embedding_eq_zero_of_many_rational_roots, weight_xi_bound -> xi_weight_le, beta_regular -> exists_hensel_numerator_sequence). - Ported main's 4.31 fix for regularElementsSet_liftToFunctionField into Lifts.lean. - docs/kb/_generated/*: take main (regenerated below). - docs/kb/log.md: keep both histories.
…yle names
Lean 4.31:
- isUnit_of_mul_eq_one -> IsUnit.of_mul_eq_one (removed from Mathlib).
- Clear every non-sorry warning under ArkLib/Data (validate.sh fails on those):
62 over-long lines rewrapped, push_neg -> push Not, unnecessary simpa -> simp,
unused simp arguments dropped, `show`-as-`change`, flexible `simp` in
exists_regular_numerator_shape replaced by `simp only [dif_pos/dif_neg]`,
maxHeartbeats justification comment, and `omit`/explicit-hypothesis fixes for
auto-included section variables.
Claim A.2 restructure (BCIKS20 A.4):
- exists_hensel_numerator_sequence now states existence ONLY. Previously it
bundled the weight bound, so betaSeq := choose ... dragged the open
quantitative step into alpha, gamma and every consumer (Agreement.lean's
Claims 5.8/5.9). Those are now axiom-clean.
- New hensel_numerator_weight_sharp_le / hensel_numerator_weight_le state the
bounds for an arbitrary Hensel numerator sequence, via
hasNumeratorShape_alphaOfNumerators; betaSeq_weight_sharp_le /
betaSeq_weight_le specialize them; claimA2 recombines the paper's statement.
- Expose the SHARP bound (1 + (t+1)L(W) + e_t L(xi)) alongside the loose
(2t+1)dD: Claim 5.10 needs the sharp form, which telescopes over t = 0..k.
The loose bound alone does not suffice there.
Faithfulness fix: 2 <= degY R is now a hypothesis of the weight bounds.
It is the paper's own standing assumption in A.4 (xi = W^{d-2} zeta in O), and
Lean's truncated subtraction had silently made the statement stronger than the
paper's and false for degY R = 1. This removes one of the two sorries -- that
branch was unprovable, not merely unproved.
The remaining sorry (henselClearedTerm_weight, boundary summand) is documented
with the actual obstruction: the (A.1)-recursion route is exactly tight and
cannot close, in the paper as well as here. See docs/kb/audits/.
Definitions must be lowerCamelCase and theorems snake_case (CONTRIBUTING.md,
Lean community guidelines). Greek letters are kept where Mathlib wants them --
as variables and in docstring prose, which is how BCIKS20 writes them -- and
removed from declaration names, matching the ASCII names the development already
used elsewhere (alphaOfNumerators, gammaOfNumerators, xiPre*).
H_tilde, H_tilde' -> monicizeRatFunc, monicize
weight_Λ, weight_Λ_over_𝒪 -> weight, regularWeight
RWL_* -> regularWeightLe_*
S_β -> rationalVanishingSet
ξ_pre -> xiPre (matches xiPreLower / xiPreTop)
ζ, ξ, α, α', γ, γ', β, βSeq -> zeta, xi, alpha, alpha', gamma, gamma', beta,
betaSeq
π_z, π_z_lift -> piZ, piZLift
claimA2 -> claimA2_exists_numerators_with_weight_bounds
*_of_Hypotheses -> *_of_hypotheses
W_pow_mul_eval₂_div_eq_sum -> leadingCoeff_pow_mul_eval₂_div_eq_sum
weight_bot_embedding_zero -> embedding_eq_zero_of_weight_eq_bot
Also fixes the 10 lint-style.py findings in these files (isolated `by`, `:`/`:=`
before line breaks, statement continuation indentation), and makes the
positive-degree dependency of the xiPreLower weight chain explicit rather than
pulling it from the `Fact` instance, so the auto-included section variables can
be omitted.
`𝕃` and `𝒪` are left as-is: they read as notation for the function field and its
ring of regular elements, in the spirit of Mathlib's `𝓞 K`.
…mand The per-summand budget of henselClearedTerm_weight is very likely too strong, not merely hard to prove: R(x0,.,Z) = H*q makes the deficit Lambda(leadingCoeff q), which is unbounded. numerator_shape_weight_sharp can still hold, since Lambda of the sum over j only bounds the max after the cancellations (A.1) produces, so the fix is to weaken that lemma rather than grind the case. Also records that the paper's alternative route (Lambda(alpha_t) = 1) needs care: with the exact Lambda(W) the claim already fails at t = 0 unless Lambda(W) = D - dH. The Lean statement substitutes the paper's own bounds into the RHS, which is the reading under which the base case holds -- and is proved here.
From a full review of the package against BCIKS20 Appendix A.1-A.4.
Uniqueness of the Hensel lift (A.4: "at each step the lifting is unique"), which
the paper invokes by name in the proof of Claim 5.9 and which was absent:
- hensel_alpha_sequence_unique: two coefficient sequences that agree at t = 0 and
both make gamma a root of R(x0 + S, ., Z) are equal. The induction is the
paper's own -- coeff_evalR_split makes the n-th coefficient zeta * alpha_n plus
a term in alpha_i (i < n), and zeta is invertible.
- IsHenselNumeratorSequence.unique / .eq_betaSeq: the numerator-level forms.
betaSeq is therefore THE sequence of Claim A.2, not an arbitrary choice.
All axiom-clean.
Restored: betaSeq_weight_{sharp_,}le_defaultDegreeBound. Splitting existence from
the weight bounds had orphaned defaultDegreeBound_ge_{H,R_coeff} and, worse, lost
the specialization for callers with no D of their own -- which is exactly the
list-decoding files, since Claim 5.7 hands them no degree bound.
Removed nine declarations subsumed by general results: the xi_regular
special-case tower (natDegree <= 1 / = 2 / derivative-constant, and
zeta_regular_of_derivative_evalX_eq_C under it) now that the general xi_regular
is proved; the regularElements subtype (which had no ring structure -- `𝒪` is
the ring of regular elements); canonicalRepOf𝒪_natDegree_le (superseded by the
strict _lt_H); the `beta` alias; xiPreTop_topCoeff_mul_natDegree_le; and
regular_liftToFunctionField. Kept, with reason: the regularElementsSet closure
family incl. _sub (API completeness), the Lifts denominator-clearing lemmas (the
A.1 toolkit a Claim 5.10 proof will want), and the @[simp] members.
Each of the eight files now has a module docstring naming its own paper section,
replacing the identical "We define the notions of Appendix A of [BCIKS20]".
Trimmed the mathlib import preamble that had been copy-pasted into all eight
files: 21 imports removed, each verified by build. It still carried
PowerSeries.Substitution everywhere -- a fossil of the pre-coordinate-fix
PowerSeries.subst formulation, unused since that bug was fixed.
Docs: corrected the Appendix A audit, which wrongly listed Lemma A.1 as
incomplete (it is proved and axiom-clean).
…it corrections
Closes the tractable Appendix A gaps from the review.
A.3's extension of the rational substitution beyond 𝒪 -- "pi_z can be extended
naturally to any element of L for which z is not a pole, i.e. elements of the
form beta / C(Z)". piZOfDiv gives the value on a presentation; piZOfDiv_congr
shows it depends only on the quotient in L (clear denominators, then injectivity
of the embedding together with pi_z of a constant being its evaluation), so this
is a genuine function on that subring. Plus piZOfDiv_one (it extends piZ) and
piZOfDiv_eq_zero_iff, which is the form section 5 uses to turn "many
substitutions kill beta / C" into a hypothesis of Lemma A.1.
A.2's exact weight of the monicization, Lambda(H~) = d(D+1-d) (weight_monicize):
the upper bound was there, the lower bound is the leading monomial T^d, whose
coefficient is 1 by monicity.
A.2's minimality of Lambda over representatives, in the paper's own phrasing
(regularWeight_le_of_mk_eq). This was already available as regularWeight_mk_le;
the audit had listed it as a gap.
All axiom-clean.
Two corrections to my own earlier audit recommendations:
- 2 <= deg_Y R canNOT be added to Claim 5.7's conclusion. R is an arbitrary
irreducible factor of Q there, and deg_Y R = 1 is precisely what section 5 sets
out to prove ("our goal will be to show that Q has a factor of the form
Y - P(X,Z) ... and in fact R is this factor"). The hypothesis has to be
discharged by a case split inside section 5; the deg_Y R = 1 branch does not
need the weight machinery at all.
- The paper's sharper Lambda(xi) <= (D-1) + (d-2)Lambda(W) is not provable as
stated: term by term over xiPre it reduces to D - dH <= Lambda(W), while
Lambda(W) <= D - dH always. Same hidden Lambda(W) = D - dH assumption as the
weight-bound finding. Only the weaker (d-1)(D-dH+1) holds, and that is what
xi_weight_le proves.
Also fixes two matrix rows that named declarations removed in the cleanup.
weight_mul : weight (f * g) H D = weight f H D + weight g H D -- the equality
A.2 states ("Note that Lambda is fully additive on F_q[T, Z], i.e. for any A, B,
Lambda(AB) = Lambda(A) + Lambda(B)"). Only the sub-additive direction was
formalized.
The reverse inequality is the graded-domain argument in concrete form. The
weight assignment grades F[Z][T], so the associated graded ring is again a
polynomial ring and top-weight parts cannot cancel; the proof witnesses this at
the LARGEST maximizing index of each factor (exists_top_weight_index). For any
other (i, j) with i + j = N_f + N_g one has i > N_f or j > N_g, and maximality
then costs at least one Z-degree, so the product of the two top coefficients
survives in the (N_f + N_g)-th coefficient of f * g with Z-degree exactly
deg f_{N_f} + deg g_{N_g}. IsDomain F is required, and is exactly what makes the
statement true (over Z/4, f = g = 2 gives bottom on the left and 0 + 0 on the
right).
Also moves weight_mul_le' out of HenselNumerators/Weight.lean into the
Lambda-calculus file: it only needs weight_le_iff, and belongs with the rest of
the weight algebra rather than with the Hensel-specific material.
Appendix A.1-A.3 now has no outstanding items. Axiom-clean.
🤖 PR Summary
The PR completes the formalization of Appendix A of BCIKS20 in the Statistics
Lean Declarations ✏️ Removed: 64 declaration(s)
✏️ Added: 245 declaration(s)
…and 95 more not listed.
✅ Removed: 7 `sorry`(s)
📋 **Additional Analysis**The diff appears to be a substantial contribution of a new Appendix A package for BCIKS20. The code adheres to the project's naming and style conventions (UpperCamelCase files, lowerCamelCase functions, snake_case theorems, proper headers, consistent indentation). The commit message format cannot be verified from the raw diff. There are no obvious violations of the provided guidelines. Since the deployment-supplied instructions are generic contribution guidelines rather than a specific review framework, no actionable findings are identified. 📄 **Per-File Summaries**
The integral monicization The ring of regular elements The set Finally, the rational substitution The diff contains no
The main lemma No
Last updated: 2026-08-05 03:53 UTC. |
Found while surveying the unproven section 5 material.
Claim 5.8 was stated as "for all t >= k, alpha_t = 0" in both its coefficient and
power-series forms. The paper says "for all t > k, alpha_t = 0. Equivalently,
gamma = gamma_k = sum_{t=0}^{k} alpha_t (X - x_0)^t" -- the sum INCLUDES t = k.
The Lean statement therefore also forced alpha_k = 0, i.e. deg gamma < k, which is
false whenever the interpolating polynomial has degree exactly k (the generic
case). Corrected to t > k. Nothing consumed either form.
Claim 5.7's cardinality condition and matching_set_at_x built their Finsets with
`@Set.toFinset _ _ sorry`, i.e. a sorried Fintype instance INSIDE a statement.
Fintype is a subsingleton, so these were provably equal to the real instance and
the statements were not wrong -- but they put sorryAx into statements and made
`#print axioms` on anything downstream uninformative. Replaced with
Fintype.ofFinite _.
That removed the last use of [DecidableEq (RatFunc F)] in the file, so the
now-unused section instance is dropped; without it the unusedDecidableInType
linter flagged all thirteen declarations.
BCIKS20 sorry count 22 -> 20, and all twenty are now genuine proof obligations
rather than statement placeholders.
Build Timing Report
Incremental Rebuild Signal
This compares a clean project build against an incremental rebuild in the same CI job; it is a lightweight variability signal, not a full cross-run benchmark. Slowest Current Clean-Build FilesShowing 20 slowest current targets, with comparison against the selected baseline when available.
|
…clean The boundary summand of henselClearedTerm_weight is proved. All 266 declarations in ArkLib/Data/Polynomial/RationalFunctions are now axiom-clean: zero sorryAx, zero non-standard axioms. The fix corrects the BOUND rather than grinding the case, and it overturns my earlier conclusion that the (A.1)-recursion route "cannot close". It closes once numeratorShapeSharp carries a + (t-1)*(D - dY) correction. Why the correction is needed. A factor of W that the recursion CHARGES costs the bound Lambda(W) <= D - dH, and the base case forces exactly that charge, since Lambda(beta_0) = Lambda(T) = D - dH + 1 is fixed by the definition of the Lambda-grading. But a factor of W that the recursion SAVES -- from W | leadingCoeff R(x0,.,Z) -- is only worth its exact degree deg W, which has no lower bound. The paper credits the saved W at Lambda(W) while using D as an upper bound elsewhere, i.e. it subtracts an upper bound; the deficit is exactly Lambda(leadingCoeff R(x0,.,Z) / W) <= D - dY. Why the correction is free. It is superadditive on precisely the configuration that produces the deficit: the boundary summand forces p.2 = t+1 split into d parts each <= t, hence at least two nonzero parts S1 >= 2, so the parts consume only sum (l_i - 1) = t+1-S1 of the correction against the t the target provides, leaving (S1-1)*(D - dY) >= D - dY. Every other summand has sum (l_i - 1) <= t, so it costs nothing there. Raising the xi-charge instead does NOT work: it breaks the loose bound the paper quotes (d=2, dH=1, D=100, Lambda(W)=0, t=5 gives 2377 > 2200 = (2t+1)dD). Nothing downstream is weakened. numeratorShapeSharp_le_loose still yields (2t+1)*dY*D, which is the only form Claim 5.10 consumes -- its telescoping maximizes at t = k and lands on exactly that bound. Option B (extend Lambda to the function field and prove Lambda(alpha_t) <= Lambda(T) - Lambda(W), which would give the paper's uncorrected inequality) is documented as open and fidelity-only: bounding alpha_t = -c_t/zeta needs a LOWER bound on Lambda(zeta), and only upper bounds are available. Both routes deliver the same usable consequence. Documented at numeratorShapeSharp, at henselClearedTerm_weight, in the module docstring, and in the Appendix A audit.
Appendix A's weight bounds carry 2 <= Bivariate.natDegreeY R, and Claim 5.7
cannot supply it: R is an arbitrary irreducible factor of Q there, and
deg_Y R = 1 is precisely what section 5 sets out to prove ("our goal will be to
show that Q has a factor of the form Y - P(X,Z) ... and in fact R is this
factor").
The hypothesis is load-bearing rather than an artefact of the formalization. For
dY = 1 the conclusion of xi_weight_le is false: take R = (1+Z)Y + 1 + ZX, x0 = 0,
H = (1+Z)Y + 1 (irreducible, degree 1, coprime coefficients). Then dY = dH = 1,
W = 1+Z, D = 2, and xi = W^{dY-2}*zeta = zeta = 1+Z, whose canonical
representative mod H~ = Y+1 is itself, so Lambda(xi) = 1 while the claimed bound
(dY-1)(D-dH+1) is 0.
Section 5 therefore has to case-split on deg_Y R, and the = 1 branch needs no
Hensel machinery at all: R = R_1*Y + R_0 has the single rational root -R_0/R_1, so
Claim 5.9's conclusion should be reached directly there. Only the >= 2 branch
consumes Claim A.2's weight bounds.
Recorded in the docstring of claimA2_hypotheses, where section 5 will meet it,
rather than only on an audit page.
Docstrings: 82 of the 231 declarations had none. All now do -- every lemma in the Lemma A.1 resultant chain, the xiPre* decomposition, the bSeq Hensel iteration, the AllCoeffRegular and RegularWeightLe APIs, and the power-series helpers. The docstrings say what the statement is FOR, not just what it says: e.g. coeff_evalR_split is flagged as the linearity that gives both existence and uniqueness of the lift, and xiPreTop as the paper's "we can save a little" step. Umbrella file: replaced the one-line "compatibility umbrella" note with a real package roadmap -- the variable convention (which of F[X][X][Y]'s three variables is the paper's X, Y, Z), a per-module map to the paper's sections, the main results, the axiom-cleanliness claim, and the two documented deviations from [BCIKS20] with pointers to where each is justified. Organisation: - named the six anonymous top-level sections (Monicization, AlgebraicWeights, RegularLifts, HenselSetup, HenselLift, HenselNumeratorSequence) and their closing `end`s; - the section variable for R was declared as F[X][X][X] in four files while every theorem writes F[X][X][Y] -- same type, inconsistent notation; normalized. Zero warnings, zero sorries, style-lint clean, and `#print axioms` over the whole namespace still reports 266 declarations with no sorryAx and no non-standard axioms.
replaces #387, addresses some issues in the RationalFunctions file.