Skip to content

feat(HasseWeil): isogeny symmetry over ℚ — universalDualWitness_of_charZero axiom-clean (dual isogeny over the base field, Silverman III.6.1) - #416

Open
CBirkbeck wants to merge 80 commits into
mainfrom
dev/hasse-weil
Open

feat(HasseWeil): isogeny symmetry over ℚ — universalDualWitness_of_charZero axiom-clean (dual isogeny over the base field, Silverman III.6.1)#416
CBirkbeck wants to merge 80 commits into
mainfrom
dev/hasse-weil

Conversation

@CBirkbeck

Copy link
Copy Markdown
Owner

Isogeny symmetry over ℚ — the dual isogeny over the base field (Silverman III.6.1), axiom-clean

This branch discharges HasseWeil.EC.universalDualWitness_of_charZero — every isogeny over a characteristic-0 field has an F-rational dual — i.e. symmetry of IsIsogenous over ℚ. This was the project's single largest remaining piece (the dual isogeny over the base field), and it closes the LMFDB isogeny-class label gate over char-0: IsIsogenous/IsogenyClass is now an unconditional equivalence relation over ℚ.

Verification (against this branch's base)

#print axioms HasseWeil.EC.universalDualWitness_of_charZero  → [propext, Classical.choice, Quot.sound]   (no sorryAx)
#print axioms HasseWeil.EC.isIsogenous_symm_charZero         → [propext, Classical.choice, Quot.sound]
#print axioms HasseWeil.WeilPairing.hasse_bound_unconditional → [propext, Classical.choice, Quot.sound]   (sacred bound — no regression)
lake build HasseWeil → GREEN (8831 jobs)

Every step was checked against Silverman, The Arithmetic of Elliptic Curves (II.2.6, II.3.6, III.4.8–4.12, III.6.1–6.2), read from source.

Proof arc (≈67 commits)

  • Two-curve fixed-field route (III.4.10/4.11) + kernel-translation covariance engine (III.4.10b)
  • CoordHom-free point-image realization + CoordHom-free III.4.8 (the group-hom, via the Pic⁰ diagram chase)
  • The norm–conorm PlaceRestrictionPreservesPrincipal (Silverman II.3.6) over the integral closure B, on mathlib's Ideal.relNorm_eq_pow_of_isMaximal
  • Curve completeness at ∞ — a B-prime with an x₁-pole is the place at infinity (explicit local coordinates + rank-one DVR domination)
  • The conorm leaf (place dictionary, both directions) → the K̄-level range inclusion Im([deg φ]*) ⊆ Im(φ*)
  • The K̄-direct finish: a function-field infinite-Galois tower descent (mathlib Algebra.TensorProduct.cancelBaseChange) descends the range inclusion K̄→F → HasDualWitness → the goal

New / key files (under projects/HasseWeil/)

  • EC/IsogenyAG/DualDescent.lean (the K̄-direct route, section TowerDescent)
  • Curves/NormConormIntegralClosure.lean (integral closure B + norm–conorm + curve completeness)
  • EC/IsogenyAG/TwoCurveGroupHom.lean (III.4.8), TwoCurveNormConorm.lean (conorm leaf), TwoCurvePointImage.lean (realization)
  • EC/IsogenyKernelTwoCurve.lean (#ker = deg), WeilPairing/TwoCurveGenericCovariance.lean (covariance engine)
  • EC/IsogenyAG/TwoCurveFixedField.lean, TwoCurveDualRange.lean (fixed-field route), Curves/RankOneDomination.lean (relocated DVR domination)

Caveat

This is the char-0 headline ([CharZero F] ⟹ separable + perfect, the case that matters for ℚ / LMFDB). Positive characteristic would need the PerfectField-free variant of the conorm crux, which is not built (and not needed here).

Integration note (for cleanup)

This branch is 69 ahead of / 161 behind mainmain has advanced via daily mathlib bumps + other projects since this branch's base. The proof is verified green + axiom-clean against the branch's base; merging will need a rebase onto current main + repair of any daily-bump fallout (standard cleanup). No sorry/axiom added; the three #print axioms above are the acceptance gate.

🤖 Generated with Claude Code

CDBirbeck and others added 30 commits June 16, 2026 01:26
… standalone repo

Brings the project's dev ticket system up to date in the monorepo (the .lean
tree was already byte-identical from the initial import; only process docs
needed porting). Additive — preserves all import-only context
(cleanup-state/, overview/, renames.jsonl, expert-review/2026-06-04):

- plan-iv1.md + tickets-iv1.md — the IV.1 formal-group program board
  (BRIDGE-003/Wall A/P all DONE axiom-clean; remaining: III.1.5 pair + the
  off-path leaves)
- plan-silverman.md + tickets-silverman.md — the Silverman continuation plan
- triage/ — the sorry triage (remaining-sorries.md, openlemma-trio.md)
- develop/ — the /develop decompositions (isogeny-foundation, tate-module,
  formal-group-bridge, dual-completion)
- expert-review/2026-06-10/ — round-24 reviewer brief/reply/integration
- b2_log.jsonl (superset) + learnings.jsonl (UNION with the import's 7
  unique entries — both preserved)

No .lean changes (code already present and identical on dev/hasse-weil).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tative table

NEW HasseWeil/EC/IsogenyAG/IsogenyClassLabel.lean (0 sorries, builds green in
the HasseWeil target). Reduces "assign a curve its LMFDB isogeny-class letter"
to an isogeny-membership check against a GIVEN representative table — no
enumeration / Shafarevich needed (the table + ordering are taken as input,
exactly as the conductor is):

- IsogenyClassTable F: the given LMFDB table for a fixed conductor (card,
  reps : Fin card → EllipticCurveOver F, letter : Fin card → String,
  pairwise_not_isogenous).
- index / classLetter / lmfdbLabel: E's label = the letter of the unique rep
  E is isogenous to.
- index_unique + classLetter_eq_of_isogenous: well-definedness = the class
  letter is an isogeny INVARIANT — gated on UniversalDualWitness F (isogeny
  symmetry / the dual, Silverman III.6.1), reusing the existing IsogenyClass
  gate. NEXT: discharge that gate properly (the dual isogeny).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…the base field (isogeny symmetry)

/develop output for discharging UniversalDualWitness over a char-0 field (= symmetry of
IsIsogenous = the LMFDB-label gate). Source-faithful to Silverman III.6.1 + III.4.10-4.12
(read this session) + the project dual-machinery audit + a mathlib descent search.

Plan (plan-dual-descent.md) + ticket board (tickets-dual-descent.md, 4 phases):
- DUAL-Q1: Galois action on K̄(E_K̄)=K̄⊗_F F(E), fixed field = F(E) (finite-Galois level).
- DUAL-Q2 (CRUX, API gap): descent of a curve morphism along finite Galois L/F — new AG
  infra, only partially in mathlib (FaithfullyFlat/Descent + finite-Galois fixedField exist;
  CurveMap descent does not). May warrant /expert-review.
- DUAL-Q3: φ̂_K̄ Galois-equivariant from uniqueness (compose_right_cancel / II.2.3).
- DUAL-Q4: assemble → universalDualWitness_of_charZero → IsIsogenous.symm → discharge the
  IsogenyClassLabel gate.

Route is Silverman's own (build φ̂ over K̄ via existing machinery — char 0 ⟹ separable —
then descend to F by uniqueness + Galois-invariance, at a FINITE Galois level to dodge the
infinite Gal(K̄/F)). HAVE: K̄ dual (exists_dual_of_pullbackEvaluation_general), base-change
(baseChangeIsogeny+CoordHom), factorThrough, hbase/reflects_ordAtInfty, the tensor
identification functionField_baseChange_tensorEquiv. NEW: the descent (Q2).

NEW HasseWeil/EC/IsogenyAG/DualDescent.lean scaffold: headline
universalDualWitness_of_charZero (sorry, elaborates) + isIsogenous_symm_charZero (derives
symmetry from it — gate-discharge interface confirmed sound). Root build GREEN (8822 jobs);
the one sorry is the headline (allowed on dev). Q1-Q3 internals fill across tickets; Q2's
deep sub-leaves may stay sorry/REVIEW-PENDING.

HONEST: this is the largest remaining piece, with Q2 a genuine partially-mathlib-lacking
descent development — the proper path to unconditional isogeny symmetry (hence unconditional
LMFDB isogeny-class labels), not a quick win.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… down to 2 documented sorries

The whole base-change-to-K̄ + Galois-descend route (Silverman III.6.1) built in
HasseWeil/EC/IsogenyAG/DualDescent.lean (+471 lines). All of DUAL-Q1..Q4's structure is
proven and axiom-clean; the deep inputs are isolated to EXACTLY 2 named sorries:

- DUAL-Q1: galActFunctionField (Gal(L/F) action on F(C_L) via σ⊗id through
  functionField_baseChange_tensorEquiv) + _id/_trans + galActFunctionField_fixes_baseChange
  — all axiom-clean. mem_range_functionField_baseChange_iff_fixed: easy direction proved,
  the → (Galois descent of Frac(L⊗_F F[C])) is sorry #1.
- DUAL-Q2 (the predicted crux — came in CLEAN modulo Q1): descendPullback / descendIsogeny
  (CoordHom-free), round-trip functionFieldMap_comp_descendPullback, basepoint
  descend_basepoint — the CurveMap-from-restricted-pullback is COMPLETE modulo Q1.
- DUAL-Q3: galEquivariant_of_compose (equivariance from φ*∘φ̂*=[m]* + injectivity) —
  axiom-clean.
- DUAL-Q4: hasDualWitness_of_compose (axiom-clean); universalDualWitness_of_charZero +
  isIsogenous_symm_charZero reduce to the assembled chain rationalDualCompose_of_charZero
  = sorry #2.

IsogenyClassLabel.lean: the LMFDB gate DISCHARGED UNGATED over char 0 —
index_unique_charZero / index_eq_charZero / classLetter_eq_of_isogenous_charZero (drop the
UniversalDualWitness hypothesis), 0 sorries in that file.

Verified (worker + this commit): lake build HasseWeil GREEN (8822 jobs); sacred
hasse_bound_unconditional still [propext, Classical.choice, Quot.sound]; all Q1-Q4
structural decls axiom-clean, the 2 residuals carry sorryAx as expected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-clean

mem_range_functionField_baseChange_iff_fixed (both directions now) — a Gal(L/F)-invariant
element of F(C_L) descends to F(C). [propext, Classical.choice, Quot.sound], no sorryAx.

The → direction (the deep Q1 leaf) proved by a SELF-CONTAINED tensor-level Galois descent —
mathlib v4.31 has NO base-change-of-IsGalois lemma, so it was built directly:
- ring/free-module descent: Module.Basis.baseChange + baseChange_repr_tmul +
  IsGalois.mem_range_algebraMap_iff_fixed (a coefficient is Gal(L/F)-fixed iff in
  range(algebraMap F L)); F[C] is F-free so the L-basis 1⊗bᵢ + coordinatewise σ-action apply.
- fraction-field lift: write y = n/den, make den Gal-fixed via the norm ∏_σ (σ⊗id)den
  (Equiv.prod_comp (mulLeft τ)), then both n and den fixed ⟹ descend through
  functionField_baseChange_tensorEquiv.
New private helpers: ringAct, repr_congr_apply, tensor_fixed_mem_range, congr_alg_eq_lin,
tensor_ringAct_fixed_mem_range, galActFrac_algebraMap, norm_fixed, the_lift (~140 LOC).

These descent lemmas (free-module Galois descent + the norm-fix trick) are reusable for the
remaining DUAL-Q4 chain. Build GREEN (8822 jobs). DualDescent.lean now down to 1 sorry
(rationalDualCompose_of_charZero, DUAL-Q4).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…l reduces to Im([m]*) ⊆ Im(φ*)

rationalDualCompose_of_charZero + universalDualWitness_of_charZero now assemble over a single
named residual rationalRangeIncl_of_separable (Im([deg φ]*) ⊆ Im(φ*) over F for separable φ —
the genuine Silverman III.6.1 range-inclusion core). Everything else PROVEN axiom-clean:
- isSeparable_of_charZero (char 0 ⟹ φ separable, via isSeparable_iff_algebra_isSeparable +
  isAlgebraic_toAlgebra + Algebra.IsSeparable.of_integral)
- rationalDualCompose_of_hasMulByIntDualWitness (the formal payoff: F-rational [n]-witness ⟹
  (mulByIntDual w).compose φ = [n], via mulByIntDual_comp_pullback + ext_toCurveMap)
- hasMulByIntDualWitness_of_rangeIncl (basepoint leaf from the range inclusion alone, via
  hbase_of_reflects + mulByIntBasepoint_holds + reflects_ordAtInfty)

The residual's honest sub-gaps (worker-identified): (1) general TWO-CURVE base-change of an
isogeny — baseChangeIsogeny is endomorphism-only, the ticket's "HAVE" was wrong for φ:E₁→E₂;
(2) field of definition over AlgebraicClosure F → finite Galois L/F (deep); (3) full
base-changed-pullback equivariance on all of F(C_L). NEXT (cleaner route, sidesteps (2)):
descend the PREIMAGE ELEMENT via the now-proven DUAL-Q1 (mem_range_functionField_baseChange_iff_fixed)
— the K̄ range inclusion + Q1 elementwise descent needs only (1), not the isogeny field-of-definition.

Build GREEN (8822 jobs); sacred hasse_bound_unconditional axiom-clean;
universalDualWitness_of_charZero carries sorryAx via the one residual (expected). Imports +=
TwistedFactorization (EC↔Algebra separability bridge; no cycle). New helpers: isSeparable_of_charZero,
rationalDualCompose_of_hasMulByIntDualWitness, + 3 private.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ata_of_separable

The whole isogeny-symmetry / dual-over-base-field program now rests on a single named residual.
Elementwise Galois descent glue PROVEN axiom-clean (exploiting the now-proven DUAL-Q1):
- DescentData / SomeDescentData (the finite-Galois descent interface).
- rangeIncl_of_descentData: from descent data over finite Galois L/F, derive Im([m]*) ⊆ Im(φ*)
  over F by descending the PREIMAGE ELEMENT (ĝ ∈ K̄(E₂), Gal-fixed by uniqueness ⟹ ĝ ∈ F(E₂)
  via DUAL-Q1 mem_range_functionField_baseChange_iff_fixed) + functionFieldMap naturality &
  injectivity. Axiom-clean.
- rationalRangeIncl_of_separable now a thin proof = exists_descentData_of_separable +
  rangeIncl_of_descentData.

THE ONE RESIDUAL (REVIEW-PENDING): exists_descentData_of_separable — for separable φ over F,
∃ finite Galois L/F with the full descent data (two-curve base-change ψ_L + descended K̄-dual
range inclusion + equivariance + naturality). = the union of the two genuine missing-infra gaps:
(1) two-curve base-change of an isogeny (baseChangeIsogeny is endomorphism-only; function-field
base-change goes through FractionRing(L⊗CR)); (2) field of definition (morphism over
AlgebraicClosure F defined over a finite Galois L — no bridge from scheme-theoretic SpreadingOut
to the elementary function-field framework).

Build GREEN (8822 jobs); sacred hasse_bound_unconditional axiom-clean;
universalDualWitness_of_charZero carries sorryAx via this one residual only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on ONE leaf (two-curve base-change)

MOVE 1 (the feared field-of-definition gap) PROVEN axiom-clean and reusable:
- instIsGalois_algebraicClosure: char 0 ⟹ K̄/F Galois (IsAlgClosure.normal + .separable).
- galFixed_of_galFixed_top: Gal(K̄/F)-fixed ⟹ Gal(L/F)-fixed (AlgEquiv.restrictNormalHom_surjective
  + restrictNormal_commutes).
- exists_finiteGalois_fieldOfDefinition: a finite set of K̄-elements lies in a finite Galois
  L ⊆ K̄ (FiniteGaloisIntermediateField.adjoin) — the single-element field-of-definition,
  sidestepping the hard isogeny field-of-definition.
MOVE 2 packaging: DescentDataOverKbar + someDescentData_of_overKbar (universe-correct) — proven;
exists_descentData_of_separable is now a PROVEN thin assembly over the one leaf.

THE SINGLE REMAINING LEAF (REVIEW-PENDING): descentData_over_kbar_intermediate — the two-curve
base-change of a separable isogeny (the L-linear ψ_L over a finite Galois L ⊆ K̄). Obstacle: a
general EC.Isogeny carries no CoordHom (separate data; baseChangeIsogeny is endo-only), so the
base-change of φ* must construct/use a CoordHom for the separable φ. Standard project-area
base-change infra — the most tractable of the program's three deep pieces; the other two
(function-field Galois descent = DUAL-Q1, and field-of-definition = MOVE 1) are now BOTH proven.

So: universalDualWitness_of_charZero (⟹ isogeny symmetry ⟹ the ungated LMFDB label gate) is
proven modulo exactly one base-change leaf. Build GREEN (8822 jobs); sacred
hasse_bound_unconditional axiom-clean; all MOVE 1/2 decls axiom-clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…sts on the two-curve K̄-dual alone

The whole dual-over-ℚ / isogeny-symmetry program now reduces to ONE leaf:
twoCurveKbarRangeIncl_descended (the two-curve K̄-dual range inclusion Im([deg φ]_L*) ⊆ Im(ψ_L)).
The three feared deep pieces are ALL now proven (DUAL-Q1 function-field Galois descent,
field-of-definition MOVE 1, and now two-curve base-change + equivariance):

TwoCurveBaseChange namespace (CoordHom-FREE, all axiom-clean):
- bcIsog: two-curve base-change φ_L : E₁_L → E₂_L over a general finite L via EC.Isogeny.ofEquation
  on bcXgen/bcYgen (= functionFieldMap of φ's generator pullbacks) — no CoordHom, no IsAlgClosed.
  Inputs bc_equation (Affine.Equation.map ∘ generic_equation), bc_ord
  (exists_pos_ramificationIdx_at_infinity transported), bcXgen_transcendental.
- NEW ordAtInfty_eq_zero_of_isAlgebraic_constants (removes IsAlgClosed from transcendence —
  minpoly/ultrametric: algebraic over the constant field ⟹ ord 0).
- psiL := bcIsog.pullback; psiL_nat / mPbL_nat (naturality, algHom_ext_x_y_gen2), psiL_injective.
- psiL_galEquivariant (DUAL-Q3, fully proven): equivariance on ALL of F(E₂_L), via
  galActFunctionField_algebraMap_L (σ-semilinearity) + ringHom_ext_baseL reducing to L-constants
  + x_gen/y_gen Galois-fixed images.

THE SINGLE REMAINING LEAF (REVIEW-PENDING): twoCurveKbarRangeIncl_descended — needs the
TWO-CURVE K̄-dual (DualGaloisData/the III.4.10c fixed-field equality Im(φ*)=Fix(ker φ) for
φ_K̄ : E₁_K̄ → E₂_K̄). The project's K̄-dual machinery (exists_dual_of_pullbackEvaluation_general,
KernelCountGeneral/GenericCovarianceGeneral/WallCascade) is ENDOMORPHISM-ONLY; generalizing it to
two curves is the irreducible remaining infrastructure (a major on-track sub-development). The
factorization downstream (CurveMap.factorThroughPullback) is already axiom-clean.

universalDualWitness_of_charZero (⟹ isogeny symmetry ⟹ ungated LMFDB label gate) proven modulo
this one leaf. Build GREEN (8822 jobs); sacred hasse_bound_unconditional axiom-clean. +558 LOC.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…10/4.11) — dual rests on the two-curve generic-point covariance alone

Generalizes the project's endomorphism-only Galois fixed-field machinery to a
genuine TWO-curve isogeny φ : E₁ → E₂, the shape Silverman III.4.10/4.11 actually
uses. This disproves the codebase's standing "endo-only" framing: every step of
the fixed-field argument is about the SOURCE curve (ker φ ⊆ E₁.Point acting on
K(E₁) by translation; the only cross-curve object is φ.pullback : K(E₂) → K(E₁)).

New files, both axiom-clean, 0 sorry:
- TwoCurveFixedField.lean (~290 LOC): the full fixed-field equality
  Im(φ*) = Fix(ker φ) two-curve — algHom_ext_x_y_gen_twoCurve,
  translate_pullback_invariance_of_xy_twoCurve, isAlgebraic/finiteDimensional/
  degree_pos_twoCurve, kernelMulSemiringAction_twoCurve (scoped),
  finite_kernel_of_hcov_twoCurve, pullback_fieldRange_{le,eq}_fixedField_twoCurve,
  finrank_pullback_fieldRange_eq_degree_twoCurve, fixedField_hfix_twoCurve.
- TwoCurveDualRange.lean (~120 LOC): the K̄-dual range inclusion
  Im([deg φ]*) ⊆ Im(φ*) two-curve — rangeIncl_mulByInt_le_fixed_twoCurve
  (easy inclusion via Lagrange ker φ ⊆ E₁[deg φ]) + mulByInt_deg_rangeIncl_twoCurve.

DualDescent.lean: wires the two-curve range inclusion into the descent chain.

THE SINGLE REMAINING SORRY: twoCurveGeometricDualData (DualDescent.lean:1590) —
the genuinely cross-curve generic-point covariance (mapTranslateGenericPoint_of_
pullbackEvaluation + the kernel torsor, ~500 LOC) generalized to two curves, plus
the h_deg / h_mPbL base-change plumbing. This is Silverman III.4.10b (τ_T* fixes
φ*K̄(E₂) since φ∘τ_T = φ for T ∈ ker φ) — geometrically TRIVIAL (φ is a group hom)
but the project's standing hgcomm/PullbackEvaluation formalization-deep piece, in
two-curve form. Everything else in the DUAL-DESCENT program (DUAL-Q1 function-field
Galois descent, the field-of-definition MOVE 1, the two-curve base-change via
ofEquation + equivariance) is PROVEN axiom-clean; universalDualWitness_of_charZero
now carries sorryAx solely via this one leaf.

Build GREEN (8760 jobs). Sacred bound hasse_bound_unconditional untouched
(EC/IsogenyAG/ is downstream of the Hasse bound).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lverman III.4.10b)

New leaf file TwoCurveGenericCovariance.lean (193 LOC, 0 sorry, axiom-clean
[propext, Classical.choice, Quot.sound]). Generalizes the project's single-curve
covariance to a TWO-CURVE isogeny φ : E₁ → E₂, for the kernel-point case — which
is exactly what the dual-descent residual h_xy_family needs.

- PE-0  PullbackEvaluation_twoCurve : the two-curve cofinite pullback-evaluation
  predicate (β.pullback (x_gen W₂) ∈ K(E₁) evaluates at P ∈ E₁ to the x-coord of
  β.toAddMonoidHom P ∈ E₂; bad = finite excluded set).
- PE-2  xy_family_of_pullbackEvaluation_twoCurve : Silverman III.4.10b verbatim —
  for k ∈ ker β, τ_k* fixes β.pullback (x_gen W₂) and (y_gen W₂). Proved DIRECTLY
  via the single-curve separation eq_of_evaluatesTo_cofinite on K(E₁) (both sides
  live in K(E₁)): at a good P, β(P+k) = βP + βk = βP since βk = 0, so both
  evaluate to the same x'(βP). This is the kernel-case of the covariance — the
  ~600-LOC full generic engine is NOT needed (no image-density / two-curve
  separation), because both functions live on the SOURCE curve.

This is the reusable engine for the DualDescent residual twoCurveGeometricDualData's
h_xy_family field. Remaining residual = the βL realization (CoordHom-free geometric
point map of a general affine-kernel isogeny + #ker=deg) — recorded in
.mathlib-quality/decompose-twoCurveGeometricDualData.md.

Full HasseWeil build green (8824 jobs); sacred bound hasse_bound_unconditional
untouched (leaf file, no downstream of the Hasse bound).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…wo-curve isogeny (Silverman III.4.8 substrate)

New leaf file TwoCurvePointImage.lean (542 LOC, 19 decls, 0 sorry, axiom-clean
[propext, Classical.choice, Quot.sound]; build green 8747 jobs). Builds the
CoordHom-FREE geometric realization of a separable two-curve isogeny's point map,
the substrate for the dual-descent residual twoCurveGeometricDualData.

The affine-kernel bcIsog (ofEquation) has NO CoordHom, so the project's shipped
III.4.8 / norm / Pic⁰ pushforward machinery (all CoordHom-gated) does not apply.
This file recovers the realization CoordHom-free via place restriction, in two
complementary axiom-clean routes:

- Route I (place-equality): twoCurve_evaluatesTo_of_comap_eq — if P's place
  restricts along φ.pullback to Q's place, then φ.pullback f evaluates at P to f's
  value at Q (an EXACT valuation identity — Silverman's "free" functoriality step
  τ_T*φ* = (φ∘τ_T)* recovered at the place level). Assembled via TwoCurvePlaceData
  + pullbackEvaluation_twoCurve_of_placeData.

- Route II (constructive, place-equality-FREE — bypasses the deep place→point
  dictionary / e=1 wall): residue values exist over F̄
  (exists_evaluatesTo_of_pointValuation_le_one), satisfy E₂'s Weierstrass equation
  (twoCurve_equation_of_evaluatesTo), hence form a nonsingular E₂ point
  (nonsingular_of_evaluatesTo_generators), reducing the whole
  PullbackEvaluation_twoCurve coherence to a single tie (stored map = residue point)
  via pullbackEvaluation_twoCurve_of_residue_agreement, with bad = the finite pole
  locus twoCurvePoleLocus (twoCurvePoleLocus_finite, Silverman II.1.2).

- placeRestrictionIsogeny: packages a point map into the Basic-world HasseWeil.Isogeny,
  carrying the group-hom property as a NAMED HYPOTHESIS hgrouphom (NOT a sorry).

NET: PE-1a (the point-image realization + PullbackEvaluation coherence) is now
constructively discharged. The SOLE remaining geometric input is PE-1b — the
group-homomorphism property (Silverman III.4.8, CoordHom-free) — the project's
standing geometric-realization wall (done elsewhere only for [n]/1−π via explicit
formulas). Decomposition + verbatim Silverman anchors in
.mathlib-quality/decompose-twoCurveGeometricDualData.md.

Sacred bound hasse_bound_unconditional untouched (leaf file).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… divisor pushforward (PE-1 reduced to exactly III.4.8 group-hom)

TwoCurvePointImage.lean (+206 LOC, 0 sorry, build green 8747): TASK A complete —
the concrete CoordHom-free total point map and the βL realization:
- placeRestrictionPointMap φ : W₁.Point → W₂.Point (O ↦ O; affine P off the pole
  locus ↦ its residue-value point ⟨cx,cy⟩ from exists_evaluatesTo_…; pole-locus/
  kernel ↦ O), with placeRestrictionResidueX/Y + evaluatesTo_… support.
- placeRestrictionPointMap_residue_agreement : the stored map IS the residue
  construction (so the PullbackEvaluation residue-agreement is rfl).
- placeRestrictionRealization φ (hgrouphom) : HasseWeil.Isogeny W₁ W₂ — the βL
  realization, carrying ONLY the group-hom property hgrouphom as a hypothesis.
- pullbackEvaluation_twoCurve_placeRestrictionRealization : its PullbackEvaluation
  witness, FREE (bad = twoCurvePoleLocus).

NET: the dual-descent point-map realization is reduced to EXACTLY the one classical
input — Silverman III.4.8 (group-hom) for placeRestrictionPointMap, CoordHom-free.

TwoCurveGroupHom.lean (NEW, 118 LOC, 0 sorry, build green 8748): PE-1b foundation —
the CoordHom-FREE Pic⁰ diagram-chase spine, started:
- placeRestrictionPlaceImage / placeRestrictionPushforward : the divisor pushforward
  Div(E₁) →+ Div(E₂) via the CoordHom-free place-image map (Finsupp.mapDomain), the
  two-curve CoordHom-free analogue of PushforwardDivisor's pushforwardProjectiveDivisor.
- degree_placeRestrictionPushforward + placeRestrictionPushforwardDegZero : degree
  preservation + restriction to Div⁰.

Remaining for PE-1b (hgrouphom): norm–conorm principal-preservation (CoordHom-free) +
the AddHomProperty_of_AFInputs Pic⁰ diagram chase with this pushforward.

Both axiom-clean (0 sorry over axiom-clean imports). Sacred bound untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ymmetry reduced to ONE Prop (Silverman II.3.6 norm–conorm)

TwoCurveGroupHom.lean (now 0 sorry, axiom-clean, build green 8748): the CoordHom-FREE
Silverman III.4.8 group-hom for placeRestrictionPointMap, faithfully mirroring
AddHomProperty_of_picZero_witnesses (HomProperty.lean:165) with the CoordHom-free
place-image map / pushforward replacing toPointMap cd / pushforwardProjectiveDivisor:
- placeRestrictionPushforward_kappaDivisor : the divisor square φ_∗((P)−(O)) = (φP)−(O).
- PlaceRestrictionPreservesPrincipal φ : Prop — the SINGLE deep input, isolated.
- placeRestrictionPushforwardPicZero + picZeroOfPoint_… : descent to Pic⁰ + the Pic⁰ square.
- placeRestrictionPointMap_add_of_picZero_witnesses : the full diagram chase (parametric).
- placeRestrictionPointMap_add_of_preservesPrincipal : curve-side witnesses (h_van, h_inj)
  discharged via Curves.afInputs_allChar, leaving ONLY PlaceRestrictionPreservesPrincipal.
- placeRestrictionRealizationOfPreservesPrincipal : the realized geometric HasseWeil.Isogeny
  directly from the one Prop (PullbackEvaluation coherence from the TASK-A theorem).

NET: the ENTIRE char-0 isogeny-symmetry goal (UniversalDualWitness → IsIsogenous.symm) is
now reduced to the single classical statement

  PlaceRestrictionPreservesPrincipal φ :
    ∀ D principal on E₁, placeRestrictionPushforward φ D is principal on E₂

= Silverman II.3.6/II.3.7 (the place-restriction pushforward preserves principal divisors,
norm–conorm), CoordHom-free. Honest assessment (recorded in the decompose doc): this is the
project's standing geometric-realization wall — the CoordHom-gated relNorm route
(PushforwardDivisor:1096) needs an affine coordinate-ring extension that a genuine isogeny
lacks; a CoordHom-free norm–conorm is multi-day new infrastructure.

Sacred bound untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…pal reduced to ONE per-place leaf

CoordHom-free norm-conorm (Silverman II.3.6/II.3.7) for the place-restriction
pushforward. Structural chain sorry-free:
- conorm N_φ = field norm Algebra.norm_{K(E₁)/φ*K(E₂)} : K(E₁) →* K(E₂)
- f = u/v reduction (placeRestrictionPushforward_projectiveDivisorOf_of_algebraMap)
- algebraMap-case assembly (affine via the leaf, infinity via degree)
- div(N_φ f) = placeRestrictionPushforward φ (div f) (placeRestrictionPushforward_projectiveDivisorOf)
- placeRestrictionPreservesPrincipal_of_finite_separable (THE WALL, mod hfin/hsep)
- RHS fibre-sum reduction (placeRestrictionPushforward_apply_affine)

Single remaining sorry: twoCurve_ord_conorm_eq_sum_fiber — the per-affine-place
identity ord_Q(N_φ(algebraMap w)) = Σ_{φP=Q} ord_P(algebraMap w) (e=1 by III.4.10c),
the integral-closure-over-B re-derivation of count_relNorm_eq_sum_fiber.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…one + leaf route map

- isogeny_finiteDimensional_twoCurve: K(E₁)/φ*K(E₂) finite-dimensional for ANY
  two-curve isogeny (trdeg additivity, both legs trdeg 1), axiom-clean.
- placeRestrictionPreservesPrincipal_of_separable: the wall keyed on hsep ALONE
  (hfin auto-derived) — the form to wire at the twoCurveGeometricDualData call site.
- placeRestrictionPushforward_apply_affine: RHS fibre-sum reduction (structural).
- Detailed route map on the single deep leaf (localized-D template in
  KernelCountGeneral, the weighted-count gap, the bad-Q gap).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Port `card_kernel_eq_degree_of_separable` (KernelCountGeneral) to a two-curve
`β : Isogeny W₁ W₂` over an algebraically closed field, carrying only the cofinite
two-curve pullback-evaluation coherence `PullbackEvaluation_twoCurve`.

New file `HasseWeil/EC/IsogenyKernelTwoCurve.lean`, all axiom-clean
([propext, Classical.choice, Quot.sound], no sorryAx):
- `card_kernel_eq_degree_twoCurve` — the headline.
- `hcov_of_pullbackEvaluation_twoCurve` — full kernel-translation covariance from the
  committed PE-2 `xy_family_of_pullbackEvaluation_twoCurve` + generator extensionality.
- `kernelTranslateForwardAut_twoCurve(_injective)` — kernel ↪ Aut(K(E₁)/β*K(E₂)).
- `finite_fiber_twoCurve` — two-curve port of `PullbackEvaluation.finite_fiber`.

≤ via kernel ↪ Aut + `AlgEquiv.card_le` (finite-dim from `isogeny_finiteDimensional_twoCurve`);
≥ via the already-two-curve `LocalizedDictionary.exists_good_fiber_points`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(P)=m_Q (Silverman II.3.6, mathlib relNorm_eq_pow_of_isMaximal)

NormConormIntegralClosure.lean (NEW, 168 LOC, builds green, 2 named sorries):
the integral-closure substrate for the CoordHom-free norm–conorm (Silverman II.3.6).
- B := integralClosure(C₂.CoordinateRing, K(C₁)) with instDedekindB / instModuleFiniteB /
  instFractionRingB / instTorsionFreeB (T-A1, DONE).
- inertiaDeg_eq_one : over alg-closed F, inertia degree = 1 (via LocalizedDictionary
  inertiaDeg_eq_one_of_under_eq, no e=1 needed).
- relNorm_eq_of_under : relNorm_{C₂.CoordinateRing}(P) = m_Q for P over m_Q — the crux
  application of mathlib Ideal.relNorm_eq_pow_of_isMaximal (RelNorm.lean:436) + inertiaDeg=1.
  (char-0 ⟹ the PerfectField hypothesis is derivable; the decompose pass confirmed this
  mathlib lemma EXISTS — no missing API.)

REMAINING (2 named sorries + downstream): coordXFun_mem_B / coordYFun_mem_B (the coordinate
functions of C₁ are integral over C₂.CoordinateRing = land in B; their only poles are at ∞ of
C₁ and the affine kernel, all over ∞ of C₂); then the global-B place dictionary + the
norm-divisor count Σ-over-fiber, then filling twoCurve_ord_conorm_eq_sum_fiber (TwoCurveNormConorm:273).

Salvaged from a worker that died on a transient API error one `.symm` from compiling.
Sacred bound untouched (nothing imports this file yet).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…om-clean)

count_relNorm_eq_sum_fiber_B: for w ∈ B nonzero and a smooth point Q of C₂,
count_{m_Q}(relNorm(span{w})) = Σ_{P over m_Q} count_P(span{w}). Ports
PushforwardDivisor.count_relNorm_eq_sum_fiber over the integral closure B,
using the committed s=1 core relNorm_eq_of_under (wrapped as relNorm_eq_under,
smooth-point-free). All inertia degrees 1; #print axioms = [propext,
Classical.choice, Quot.sound]. Integrality sorries (coordXFun/coordYFun_mem_B)
unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…f chain (Task 1)

The bare-`HasseWeil.Isogeny` statement of `coordXFun_mem_B`/`coordYFun_mem_B` is
false without a basepoint-regularity hypothesis: x₁,y₁'s only pole (∞ of C₁) must
lie over ∞ of C₂, which is exactly what `EC.Isogeny.pullback_ordAtInfty_nonneg`
controls.  Added

  hreg : ∀ f, 0 ≤ C₂.ordAtInfty f → 0 ≤ C₁.ordAtInfty (φ.pullback f)

(spelled `OrdAtInftyReg` in NormConormIntegralClosure; inline in TwoCurveNormConorm
where `φ.pullback` is the `HasseWeil.Isogeny` pullback) to:
- `coordXFun_mem_B`, `coordYFun_mem_B`, `coordRing_mem_B`;
- `twoCurve_ord_conorm_eq_sum_fiber` (the deep leaf, :273) and its callers
  `placeRestrictionPushforward_projectiveDivisorOf{,_algebraMap}`,
  `placeRestrictionPreservesPrincipal_of_{finite_,}separable`.

No external consumer calls the leaf yet (`twoCurveGeometricDualData` is itself an
open `sorry` and routes #ker=deg through `LocalizedDictionary`), so nothing breaks.
Both files build GREEN (sorries-only).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…*_mem_B (Task 2/3)

Eliminate the two opaque sorries (`coordXFun_mem_B`, `coordYFun_mem_B`) by reducing
integrality of the C₁ coordinate generators to a single PRECISELY-NAMED geometric
residual, via the NON-CIRCULAR valuative criterion (mathlib's
`IsDedekindDomain.HeightOneSpectrum.mem_integers_of_valuation_le_one` on the Dedekind
domain B with fraction field K(C₁)).

NEW (axiom-clean):
- `mem_B_of_forall_valuation_le_one` : z ∈ B  ⟸  v.valuation K(C₁) z ≤ 1 for every
  height-one prime v of B. Structural, `#print axioms = [propext,Classical.choice,
  Quot.sound]` (no sorryAx). This is the non-circular core (it does NOT presuppose
  `coordRingToClosure` = the very integralities — contrast `LocalizedDictionary.pointAt`).
- `BPrimeValuationCoordGenLeOne` : the genuine geometric residual = every B-prime
  valuation is ≤ 1 on x₁,y₁ (i.e. the B-prime's place lies over an affine place of C₂,
  away from ∞ of C₁ where x₁,y₁ pole). This packages the global-B place dictionary
  (B-prime ↔ affine point of C₁ over affine C₂) — the project's STANDING WALL.

`coordXFun_mem_B`/`coordYFun_mem_B`/`coordRing_mem_B` now take this residual (+ hreg,
threaded per Task 1) and are one-liners off `mem_B_of_forall_valuation_le_one`. The file
is now SORRY-FREE; the open content is isolated in the named `BPrimeValuationCoordGenLeOne`.

No external callers (the leaf `twoCurve_ord_conorm_eq_sum_fiber` is still a sorry and
routes #ker=deg through LocalizedDictionary). Builds GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…er on C₂, DVR, valuation≤1 on base)

The structural half of the global-B place dictionary, axiom-clean and non-circular
(available before BPrimeValuationCoordGenLeOne):
- valuation_algebraMap_coordinateRing_le_one: v ≤ 1 on the C₂.CoordinateRing image
- under_ne_bot: a B-prime contracts to a nonzero prime of C₂.CoordinateRing
  (via Ideal.eq_bot_of_comap_eq_bot, integral extension)
- exists_smoothPoint_under: every B-prime lies over the maximal ideal of a smooth
  point Q of C₂ (the affine-place restriction excluding ∞ of C₂)
- valuationSubring_isDVR: the v-adic valuation subring is a DVR (rank-one), the
  input to rankOne_valuationSubring_le_eq_of_ne_top

These sharpen the standing place-classification wall to the single irreducible
classification 'an F-trivial DVR of K(C₁) that is not the ∞-place is a point'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… classification

Introduces BPrimePlaceClassification (every B-prime valuation on K(C₁) is a point
valuation or the ∞-place — the curve-completeness statement) and the axiom-clean
reduction bPrimeValuationCoordGenLeOne_of_classification: the place-dictionary
residual follows from the classification + the ∞-exclusion hinf (no B-prime is the
∞-place of C₁). Point case via pointValuation_algebraMap_le_one; ∞ case excluded by
hinf. Isolates the genuine wall into two clean hypotheses (curve-completeness +
geometric ∞-exclusion, the latter dischargeable at the concrete isogeny level by
the ramification-at-∞ pullback formula).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tion-at-∞)

bPrime_valuation_ne_ordAtInfty (axiom-clean): no B-prime valuation equals the
∞-place of C₁, PROVEN from OrdAtInftyReg (hreg). The coordX C₂ image is a base-ring
element of B (valuation ≤ 1); were v the ∞-place, ord_∞(φ* coordX₂) ≥ 0 would
contradict the ramification-at-∞ formula ord_∞(φ* coordX₂) = e·(-2) < 0 (e ≥ 1 via
exists_pos_ramificationIdx_ordAtInfty_ringHom_of_isAlgebraic, algebraicity from
finiteness). Plus bPrimeValuationCoordGenLeOne_of_classification_of_reg: the residual
follows from BPrimePlaceClassification + hreg alone.

NET: the standing place-classification wall is now reduced to the SINGLE genuine
content — the curve-completeness classification BPrimePlaceClassification (every
F-trivial DVR of K(C₁) is a point or ∞); the geometric ∞-exclusion is discharged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… sharp reduction

Records that the residual is now derived from BPrimePlaceClassification + OrdAtInftyReg
(bPrimeValuationCoordGenLeOne_of_classification_of_reg), with the ∞-exclusion half
discharged — leaving BPrimePlaceClassification (curve completeness) as the only input.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…o lightweight Curves/RankOneDomination

The DVR-domination engine (rank-one valuation subring `A ≤ B`, `B ≠ ⊤` ⟹ `A = B`)
moves from the heavy char-p `Hasse/L6Witnesses` into a new `Curves/RankOneDomination.lean`
depending only on the mathlib ValuationSubring/DiscreteValuationRing/DedekindDomain.Basic API.
L6Witnesses re-exports it under the historical name (all V.1.3 domination consumers unchanged),
so the curve-completeness place classification in `Curves/NormConormIntegralClosure.lean` can
use it without importing the char-p machinery.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…o RankOneDomination

Move `Valuation.isEquiv_iff_eq_of_surjective_withZeroInt` (two surjective ℤᵐ⁰ valuations
that are IsEquiv are equal) and `Valuation.isEquiv_of_valuationSubring_le` (subring
domination ⟹ IsEquiv via LocalSubring maximality) from `Hasse/L6Witnesses` into the
lightweight `Curves/RankOneDomination.lean`.  L6Witnesses re-exports both under their
historical names (all V.1.3 consumers unchanged).  These are the value-precise equality
engine the curve-completeness place classification needs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ators

Adds the affine-center input `valuation_algebraMap_coordinateRing_C₁_le_one`: a B-prime v with
v(x₁) ≤ 1, v(y₁) ≤ 1 is ≤ 1 on the image of every element of C₁.CoordinateRing (mirrors
coordRing_mem_integralClosure with O_v in place of the integral closure; F-constants routed through
C₂.CoordinateRing where valuation_algebraMap_coordinateRing_le_one applies).  Also adds the general
`valuationSubring_isDVR_of_surjective_withZeroInt` to RankOneDomination and simplifies
valuationSubring_isDVR to use it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
bPrime_valuation_eq_pointValuation_of_coordGen_le_one: a height-one prime v of B with v ≤ 1 on both
coordinate generators of C₁ IS the point valuation at a smooth point P.  Constructs the center ideal
c_v = {a | v(a)<1} (centerIdealOnC₁), proves it nonzero (v nontrivial) and prime (contraction of the
v-adic maximal ideal), hence maximal in the Dedekind domain F[C₁], hence maximalIdealAt P.  The local
ring O_P sits inside O_v (a/s with s∉m_P=c_v has v(s)=1), so the rank-one DVR domination engine
rankOne_valuationSubring_le_eq_of_ne_top forces O_{pointValuation P} = O_v, and the two surjective
ℤᵐ⁰-valued valuations are equal.  #print axioms: [propext, Classical.choice, Quot.sound], no sorryAx.

Requires [IsIntegrallyClosed C₁.CoordinateRing] (automatic for elliptic curves off char 2,3).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CDBirbeck and others added 30 commits June 18, 2026 07:59
…coeff)

hcountMatch: count_{vP}(span{wB}) = D(affine P) via vP.intValuation wB = exp(-count) +
pointValuation_algebraMap_eq_exp_count, equated through vP.valuation = pointValuation P.
Final bijection still sorry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rse-dictionary regularity)

For P with φ^*(x_gen₂),φ^*(y_gen₂) ≤ 1 at P, every φ^*(algebraMap c) (c ∈ F[E₂]) is ≤ 1 at P
(generator induction; F-constant legs are regular). The E₁-point analogue of
valuation_algebraMap_coordinateRing_C₁_le_one, transported through φ^*. Step 1 of the reverse
place dictionary (surjectivity).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…P ∉ poleLocus)

Reverse-dictionary step 2: every b ∈ B has pointValuation P ≤ 1, since b is integral over F[E₂]
whose image lands in the valuation integers pv.integer (generators regular at P), hence
b integral over pv.integer ⟹ pv P b ≤ 1 (Valuation.Integers.isIntegral_iff_v_le_one).
Prime construction + domination still sorry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tionary PROVEN (surjectivity)

For P ∉ poleLocus with a nonzero B-function z vanishing at P, there is a B-prime v with
v.valuation = pointValuation P. Center q = {b : pv P (algMap_B b) < 1} is prime (pv multiplicative),
nonzero (z ∈ q, z ≠ 0), proper; O_v ⊆ O_P via exists_primeCompl_mul_eq_of_integer (d ∉ q ⟹
pv (algMap_B d) = 1), then rank-one DVR domination gives O_v = O_P, i.e. v.valuation = pointValuation P.
The surjectivity wall of the conorm fibre bijection is now CLOSED.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…PROVEN (0 sorries)

Final fibre bijection assembled: B-primes over m_Q ↔ support points P with placeRestrictionPlaceImage
φ (affine P) = affine Q.
- count_relNorm_eq_sum_fiber_B reduces LHS to Σ over B-primes over m_Q;
- forward (hpoint) + count match (hcountMatch) + injectivity (valuation determines prime/point) give
  Σ over primes = Σ over fibre image;
- backward surjectivity (exists_bPrime_eq_pointValuation, sum_subset) matches the fibre image to the
  support-filter sum (support points map back to B-primes over m_Q via Q'=Q from the forward direction).
TwoCurveNormConorm.lean is now SORRY-FREE: placeRestrictionPreservesPrincipal_of_separable PROVEN
(mod hreg). Silverman II.3.6 CoordHom-free norm-conorm DONE.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…p 1, axiom-clean)

For a two-curve EC.Isogeny φ : E₁ → E₂ over [IsAlgClosed F] [CharZero F],
prove Im([deg φ]*) ⊆ Im(φ*) (Silverman III.6.1) by assembling the DONE pieces:
the place-restriction geometric realization β of φ* (from the norm–conorm
preserves-principal wall, discharged via separability alone in char 0), its
kernel-translation covariance xy_family (PE-2) and #ker β = deg β (T-B1), fed to
the two-curve fixed-field range inclusion mulByInt_deg_rangeIncl_twoCurve.

Also: Isogeny.isSeparable_of_charZero_twoCurve (char 0 ⟹ separable for a Basic
two-curve HasseWeil.Isogeny). Both axiom-clean.

This is the K̄-level input that the dual descent must push down to a finite
Galois L. New file HasseWeil/EC/IsogenyAG/TwoCurveKbarRangeIncl.lean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Route A step 1 (tower fact) scaffolding: the F-algebra inclusion
towerTensorIncl from a finite intermediate level M ⊆ K̄ to the
algebraic-closure tensor level, with its tmul computation rule.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Injectivity via TensorProduct.map_injective_of_flat_flat (val M
injective + flatness over the field F), and equivariance: for σ ⊇ τ,
the inclusion intertwines σ⊗id with τ⊗id (tensor induction).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…te Galois M

exists_finiteGalois_towerTensorIncl_range: any z ∈ K̄ ⊗_F R is the
towerTensorIncl image of an element of M ⊗_F R for a finite Galois
M ⊆ K̄ (finite-sum decomposition + exists_finiteGalois_fieldOfDefinition
on the finitely many scalars).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move towerTensorIncl + injectivity + Galois-equivariance + the tensor
tower fact (exists_finiteGalois_towerTensorIncl_range) into DualDescent
so they sit alongside the private finite tensor-descent helpers and
exists_finiteGalois_fieldOfDefinition. Remove the standalone
TowerDescent.lean (import direction made it unusable for the rewiring).
This is MOVE 2: the K̄-direct infinite-Galois descent scaffold.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ebraMap/injective

Frac(M ⊗ F[C]) → Frac(K̄ ⊗ F[C]) via IsFractionRing.map of the injective
towerTensorIncl; with the algebraMap compatibility (IsLocalization.map_eq)
and injectivity (ring hom out of a field).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fracTowerIncl intertwines galActFrac C M τ with galActFrac C K̄ σ when
σ restricts to τ; reduced via div_surjective + galActFrac_algebraMap to
the ring-level towerTensorIncl_congr.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
exists_finiteGalois_towerTensorIncl_range₂: a pair z₁,z₂ ∈ K̄⊗R live
over a common finite Galois M (scalars of both finite-sum reps in one M).
Factor out towerTensorIncl_finset_sum_mem_range.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ation (axiom-clean)

mem_range_functionField_baseChange_iff_fixed_kbar: the L=K̄ analogue of
the finite mem_range_functionField_baseChange_iff_fixed. A Gal(K̄/F)-fixed
element of (C.baseChange K̄).FunctionField descends to F(C). The genuine
tower descent: scalars of the tensor-fraction numerator/denominator lie
in a finite Galois M (pair tower fact); the fraction y_M is Gal(M/F)-fixed
(fracTowerIncl equivariance + injectivity + restrictNormalHom_surjective);
the proven finite descent (the_lift + tensor_ringAct_fixed_mem_range) at M
writes y_M as 1⊗-/1⊗-, carried upstairs by towerTensorIncl.

#print axioms = [propext, Classical.choice, Quot.sound] (NO sorryAx).
This is Route A step 1 (the tower fact), the genuinely new lemma.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e descent

The one-step analogue of rangeIncl_of_descentData: from psiK=φ*_K̄,
mPbK=[m]*_K̄ (naturalities, psiK Gal(K̄/F)-equivariant + injective) and
the K̄-level inclusion Im(mPbK) ⊆ Im(psiK), derive the F-level
Im(mPb) ⊆ Im(φ*). Uses the tower fixed-field characterization, bypassing
the finite-L geometric realization.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…cent

Move ecIsog_mulByInt_deg_rangeIncl_of_charZero (+ ecShell,
isSeparable_of_charZero_twoCurve) from the unimported leaf
TwoCurveKbarRangeIncl.lean into DualDescent (adding the 5 two-curve
imports, no cycle). This makes the fully-proven K̄ inclusion available
to the rewiring (rangeIncl_of_descentData_kbar). Axiom-clean
([propext, Classical.choice, Quot.sound]). Delete the now-redundant
TwoCurveKbarRangeIncl.lean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…n-poly base-change

mPbL_eq_mulByInt_baseChange_kbar: the structural mulByInt base-change
identification — mPbL W₁ K̄ = (mulByInt_pullbackAlgHom (W₁_K̄)).restrictScalars.
Both K-algebra homs send x_gen ↦ mulByInt_x (W₁_K̄), y_gen ↦ mulByInt_y (W₁_K̄)
and fix K̄-constants (ringHom_ext_baseL). Includes char-independent local
division-poly base-change lemmas (coordRingMap_algebraMap_Φ/ΨSq_kbar,
coordRingMap_mk_ω/ψ_kbar, functionFieldMap_mulByInt_x/y_kbar) — the
PencilComapWitnesses versions are finite-field-gated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…om-clean via K̄-direct route

Rewire rationalReverseCompose_of_separable through the MOVE 2 K̄-direct
route: rationalRangeIncl_kbar produces Im([m]*_F) ⊆ Im(φ*_F) for m = deg
of the K̄-base-change, via ecIsog_mulByInt_deg_rangeIncl_of_charZero
(hreg = bcIsog.pullback_ordAtInfty_nonneg) + mPbL_eq_mulByInt_baseChange_kbar
+ rangeIncl_of_descentData_kbar (tower fixed-field char). The general
basepoint builder hasMulByIntDualWitness_of_rangeIncl_general handles
n = deg(bcIsog) (n is existential downstream).

#print axioms universalDualWitness_of_charZero
  = [propext, Classical.choice, Quot.sound]  -- NO sorryAx. THE GOAL.

The old finite-L geometric chain (twoCurveGeometricDualData sorry) is now
dead code, to be removed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lines)

Delete the superseded finite-L route: TwoCurveKbarRangeInclData,
TwoCurveGeometricDualData (the last sorry), twoCurveKbarRangeIncl_descended,
descentData_over_kbar_intermediate, exists_descentData_of_separable,
rationalRangeIncl_of_separable, hasMulByIntDualWitness_of_rangeIncl.
All superseded by the MOVE 2 K̄-direct route. DualDescent.lean is now
sorry-FREE; universalDualWitness_of_charZero and isIsogenous_symm_charZero
remain axiom-clean ([propext, Classical.choice, Quot.sound]).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…pic #2546)

Adds the dev-side ticket T-TATE-GENN (general-N torsion structure via CRT) — the one
genuinely-new piece of the #2546 extraction; the rest is already proven on main + tracked
as mathlib:pr GitHub tickets. Source files are protected from the fleet (protected-paths.txt).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…q_of_under via global-balance port (char-p separable leaf)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…r-p prep)

Relax the infinite-Galois tower-descent / field-of-definition chain in
DualDescent.lean from [CharZero F] to [PerfectField F]:
instIsGalois_algebraicClosure, exists_finiteGalois_fieldOfDefinition,
exists_finiteGalois_towerTensorIncl_range(₂),
mem_range_functionField_baseChange_iff_fixed_kbar,
rangeIncl_of_descentData_kbar. The only char-0-specific input was
IsGalois F (AlgebraicClosure F), which holds for any perfect field
(K̄/F separable + normal, both automatic instances). CharZero ⟹ PerfectField,
so the char-0 headline still resolves and stays axiom-clean.

Also drop the now-vestigial [PerfectField (FractionRing F[E₂])] binders from
the five norm-conorm wrappers in TwoCurveNormConorm.lean (CP-1's
NormConormIntegralClosure port already made the conorm PerfectField-free).

lake build HasseWeil green (8831); universalDualWitness_of_charZero and
hasse_bound_unconditional verified still [propext, Classical.choice, Quot.sound].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tField (char-p)

Generalize the separable K̄-dual reverse-isogeny engine from [CharZero F] to
[PerfectField F], threading separability explicitly:

* ecIsog_mulByInt_deg_rangeIncl_of_separable — new separable-form of the K̄
  range inclusion (drops CharZero, takes hsep : φ.IsSeparable, [IsAlgClosed F]
  only); the old _of_charZero is kept as a thin wrapper. Threads hsep through
  placeRestrictionPreservesPrincipal_of_separable (PerfectField-free since CP-1)
  and the card_kernel = degree leaf (via ecShell_isSeparable_of_isSeparable +
  Isogeny.isSeparable_of_pullback_eq).
* rationalRangeIncl_kbar, rationalReverseCompose_of_separable: CharZero →
  PerfectField, take hsep; char-0 callers pass isSeparable_of_charZero.

Key new math (the genuine sub-lemma): BASE-CHANGE SEPARABILITY of a two-curve
isogeny, TwoCurveBaseChange.bcIsog_isSeparable — for any algebraic L/K, bcIsog φ
over L is separable when φ is. Proved via the differential transport
(OmegaBaseChange.omegaDiffMap): exists_separating_element gives g with
D_K(φ*g) ≠ 0 (separable ⟹ Ω[K(E₁)/K(E₂)]=0 ⟹ mapBaseChange surjective ⟹ rank-1
forces a separating generator), and omegaDiffMap_ne_zero carries it to
D_L(bcIsog^*(functionFieldMap g)) ≠ 0 (rank-1 nonvanishing: η = c•ω_K ↦
functionFieldMap(c)•ω_L, both nonzero). Imports OmegaBaseChange into DualDescent.

lake build HasseWeil green (8831); universalDualWitness_of_charZero and
hasse_bound_unconditional verified still [propext, Classical.choice, Quot.sound].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…try over any perfect field, axiom-clean

The perfect-field analogue of the char-0 headline universalDualWitness_of_charZero:
every isogeny over a PERFECT field F has an F-rational dual (UniversalDualWitness F).
Case on char F:
* char 0: universalDualWitness_of_charZero (every isogeny separable).
* char p: nonempty_hasDualWitness_of_twisted_separable_witnesses (twisted Frobenius
  factorization + relative Verschiebung, TwistedFactorization) reduces to dual
  witnesses for the SEPARABLE isogenies out of Frobenius twists of W₁, each supplied
  by rationalDualCompose_of_separable (the PerfectField-relaxed, hsep-threaded K̄
  engine from CP-2a/CP-2b).

Also: rationalDualCompose_of_separable (public separable form of
rationalDualCompose_of_charZero) and isIsogenous_symm_perfectField.

#print axioms (verified this session):
  universalDualWitness_of_charZero     = [propext, Classical.choice, Quot.sound]
  universalDualWitness_of_perfectField = [propext, Classical.choice, Quot.sound]
  hasse_bound_unconditional            = [propext, Classical.choice, Quot.sound]
All axiom-clean (no sorryAx). lake build HasseWeil green (8831).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(char-p, incl. finite 𝔽_q)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…int)

Self-contained per-project blueprint for the multi-blueprint site, modelled on
projects/PadicLFunctions/_blueprint: lakefile path-requires the AINTLIB workspace
+ patched VersoBlueprint v4.30 + mathlib (pinned, last); toolchain v4.31.0-rc2.

Content (HasseWeilBlueprint/Blueprint.lean) nodes the headline Hasse bound with
real (lean := …) refs that resolve against the project oleans:
- HasseWeil.pointCount
- HasseWeil.frobeniusIsog
- HasseWeil.WeilPairing.hasse_bound (+ hasse_bound_unconditional) — sorry-free/unconditional

Builds (9082 jobs, all refs resolve) + renders html-multi. The *Blueprint modules
are siblings of the HasseWeil lib, so the root workspace glob never picks them up.
…ee QF, t²≤4q, √-reduction) + proof sketches
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants