4. Separability and the point-count identity
(Separable \Rightarrow \#\ker = \deg.) A separable isogeny \varphi (one whose
separable degree equals its degree) over an algebraically closed field has
\#\ker\varphi \;=\; \deg\varphi
(Silverman III.4.10(c)), proved by the classical good-fibre argument: a generic fibre has
\deg_s\varphi = \deg\varphi points and every fibre is a kernel coset.
Lean code for Theorem4.1●2 theorems
Associated Lean declarations
-
theoremdefined in HasseWeil/EC/IsogenyKernel.leancomplete
theorem HasseWeil.Isogeny.card_kernel_eq_degree_of_separable_witness.{u_1} {F : Type u_1} [Field F] [DecidableEq F] {W₁ W₂ : WeierstrassCurve.Affine F} [WeierstrassCurve.IsElliptic W₁] [WeierstrassCurve.IsElliptic W₂] (φ : HasseWeil.Isogeny W₁ W₂) [h_ker : Finite ↥φ.kernel] (hsep : φ.IsSeparable) (hfin : FiniteDimensional W₂.FunctionField W₁.FunctionField) (h_witness : ∃ P₀, Nat.card { P // φ.toAddMonoidHom P = φ.toAddMonoidHom P₀ } = φ.sepDegree) : Nat.card ↥φ.kernel = φ.degree
theorem HasseWeil.Isogeny.card_kernel_eq_degree_of_separable_witness.{u_1} {F : Type u_1} [Field F] [DecidableEq F] {W₁ W₂ : WeierstrassCurve.Affine F} [WeierstrassCurve.IsElliptic W₁] [WeierstrassCurve.IsElliptic W₂] (φ : HasseWeil.Isogeny W₁ W₂) [h_ker : Finite ↥φ.kernel] (hsep : φ.IsSeparable) (hfin : FiniteDimensional W₂.FunctionField W₁.FunctionField) (h_witness : ∃ P₀, Nat.card { P // φ.toAddMonoidHom P = φ.toAddMonoidHom P₀ } = φ.sepDegree) : Nat.card ↥φ.kernel = φ.degree
**T-III-4-015 witness form for separable isogenies**: If `φ` is separable and has a finite kernel, and at least one fiber has cardinality = `sepDegree`, then `#ker φ = deg φ`.
-
theoremdefined in HasseWeil/EC/KernelCount.leancomplete
theorem HasseWeil.card_kernel_eq_degree_of_separable_coordHom.{u_1} {F : Type u_1} [Field F] [DecidableEq F] (W : WeierstrassCurve F) [WeierstrassCurve.IsElliptic W.toAffine] [IsAlgClosed F] [IsIntegrallyClosed W.toAffine.CoordinateRing] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (hsep : β.IsSeparable) (cd : (HasseWeil.Isogeny.endCurveMap W β).CoordHom) {bad : Set (HasseWeil.W_smooth W).SmoothPoint} (hbad : bad.Finite) (hw : HasseWeil.WeilPairing.PullbackEvaluation W β bad) : Nat.card ↥β.kernel = β.degree
theorem HasseWeil.card_kernel_eq_degree_of_separable_coordHom.{u_1} {F : Type u_1} [Field F] [DecidableEq F] (W : WeierstrassCurve F) [WeierstrassCurve.IsElliptic W.toAffine] [IsAlgClosed F] [IsIntegrallyClosed W.toAffine.CoordinateRing] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (hsep : β.IsSeparable) (cd : (HasseWeil.Isogeny.endCurveMap W β).CoordHom) {bad : Set (HasseWeil.W_smooth W).SmoothPoint} (hbad : bad.Finite) (hw : HasseWeil.WeilPairing.PullbackEvaluation W β bad) : Nat.card ↥β.kernel = β.degree
**III.4.10(c), good-fibre form — the W-3 headline**: a separable isogeny `β` over an algebraically closed field, with a coordinate-ring witness `cd` for its pullback (module-finite) and the cofinite pullback-evaluation coherence for its stored point map, has `Nat.card β.kernel = β.degree`.
Choose a smooth point avoiding the (finite) ramification locus; its fibre has exactly
\deg_s\varphi = \deg\varphi points, and translation identifies every nonempty fibre
with \ker\varphi.
(1-\pi is separable.) The isogeny 1-\pi is separable, because its pullback acts
as the identity on the invariant differential (the coefficient \omega^*(1-\pi)=1 \ne 0),
and m+n\pi is separable iff p \nmid m (Silverman III.5.5, V.1.2). Frobenius itself
is purely inseparable, but subtracting 1 makes the difference separable.
Lean code for Theorem4.2●2 theorems
Associated Lean declarations
-
theoremdefined in HasseWeil/Hasse/Separability.leancomplete
theorem HasseWeil.oneSubFrobenius_isSeparable_of_witness.{u_2} {K : Type u_2} [Field K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (h_coeff : HasseWeil.omegaPullbackCoeff W β = 1) (h_sep_iff : β.IsSeparable ↔ HasseWeil.omegaPullbackCoeff W β ≠ 0) : β.IsSeparable
theorem HasseWeil.oneSubFrobenius_isSeparable_of_witness.{u_2} {K : Type u_2} [Field K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (h_coeff : HasseWeil.omegaPullbackCoeff W β = 1) (h_sep_iff : β.IsSeparable ↔ HasseWeil.omegaPullbackCoeff W β ≠ 0) : β.IsSeparable
**Witness-parametric Silverman V.1.2 (`1 − π` separable)**. Given a witness isogeny `β` (the "true" `1 − π`) whose ω-pullback coefficient is `1` in `K(E)` and satisfies the T-II-4-004 separability criterion, `β` is separable. The hypothesis `h_coeff : omegaPullbackCoeff W β = 1` is the Silverman III.5.3 result at `m = 1` (combined with III.5.2 additivity applied to the decomposition `1 + (-1)·π`, using `π* ω = 0`). Reference: Silverman V.1.2 (uses III.5.5 with `m = 1, n = -1`).
-
theoremdefined in HasseWeil/Hasse/Separability.leancomplete
theorem HasseWeil.isSeparable_iff_of_coeff_witness.{u_1} {F : Type u_1} [Field F] [DecidableEq F] (W : WeierstrassCurve F) [WeierstrassCurve.IsElliptic W.toAffine] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (c : F) (h_coeff : HasseWeil.omegaPullbackCoeff W β = (algebraMap F W.toAffine.FunctionField) c) (h_sep_iff : β.IsSeparable ↔ HasseWeil.omegaPullbackCoeff W β ≠ 0) : β.IsSeparable ↔ c ≠ 0
theorem HasseWeil.isSeparable_iff_of_coeff_witness.{u_1} {F : Type u_1} [Field F] [DecidableEq F] (W : WeierstrassCurve F) [WeierstrassCurve.IsElliptic W.toAffine] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (c : F) (h_coeff : HasseWeil.omegaPullbackCoeff W β = (algebraMap F W.toAffine.FunctionField) c) (h_sep_iff : β.IsSeparable ↔ HasseWeil.omegaPullbackCoeff W β ≠ 0) : β.IsSeparable ↔ c ≠ 0
**Witness-parametric Silverman III.5.5 (coefficient form)**. Given `β : Isogeny E E` and `c : F`, suppose: * the ω-pullback coefficient of `β` is `algebraMap F _ c`; * separability of `β` is equivalent to the ω-pullback coefficient being nonzero (this is T-II-4-004 specialized to `β`). Then `β.IsSeparable ↔ c ≠ 0` in `F`. Reference: Silverman III.5.5.
By Silverman III.5.5 separability is detected by non-vanishing of the pullback of the
invariant differential \omega; for 1-\pi this pullback is 1, since
\pi^*\omega = 0 (Definition 1.5).
(The keystone \deg(1-\pi)=\#E(\mathbb{F}_q).) Since the kernel of 1-\pi on
rational points is all of E(\mathbb{F}_q) (Theorem 1.7) and
1-\pi is separable,
\deg(1-\pi) \;=\; \#\ker(1-\pi) \;=\; \#E(\mathbb{F}_q)
(Silverman V.1.1). This converts a degree into the point count.
Lean code for Theorem4.3●2 theorems
Associated Lean declarations
-
theoremdefined in HasseWeil/GapSpines.leancomplete
theorem HasseWeil.isogOneSub_negFrobenius_degree_eq_pointCount.{u_1} {K : Type u_1} [Field K] [Fintype K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] [Fintype W.toAffine.Point] (hq : 2 ≤ Fintype.card K) : (HasseWeil.isogOneSub_negFrobenius W hq).degree = HasseWeil.pointCount W.toAffine
theorem HasseWeil.isogOneSub_negFrobenius_degree_eq_pointCount.{u_1} {K : Type u_1} [Field K] [Fintype K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] [Fintype W.toAffine.Point] (hq : 2 ≤ Fintype.card K) : (HasseWeil.isogOneSub_negFrobenius W hq).degree = HasseWeil.pointCount W.toAffine
**V.1.3 sharp residual** (Silverman III.4.10c): the degree of the isogeny `1 − π` equals the number of `F_q`-rational points of `E`. **[2026-05-29 ROUND-9 rewire — R2 embeddings-classification.]** Now PROVED axiom-clean *modulo the single embedding↔kernel count* `isogOneSub_negFrobenius_sepDegree_eq_card_kernel` (see the block comment above). The proof is pure composition: `#ker γ = sepDegree γ` (the residual) `= degree γ` (separability) and `#ker γ = pointCount` (`ker γ = ⊤`). The dead L6_B3_tower / place↔point / `CoordHom` route is superseded. This is the **sole** sharp sub-fact gating V.1.3. All three V.1.3 targets close from it (plus axiom-clean shipped lemmas): `sepDegree_oneSub_eq_pointCount`, `ker_deg_skeleton`, and `Sinf_sum_inertiaDeg_over_xIdeal_eq_pointCount_via_tower` (via the cardinality squeeze of the fundamental ramification identity). **[2026-05-28 ROUND-5 reduction.]** Per the block-comment above, this statement is equivalent — via `l6_B3_tower` (axiom-clean), Mathlib's `Ideal.sum_ramification_inertia`, the shipped bridge lemmas (`bridge_Biii_ord_eq_neg_two_v2`, `bridge_Biv_inertia_eq_one_v2`, `Sinf_kernelToPrime_v2_injective`), and the axiom-clean squeeze composer `Sinf_sum_inertiaDeg_over_xIdeal_eq_pointCount_of_finrank_witness` — to: > Every prime `P` of `Sinf` over `(X)` is the kernel-prime of some `T ∈ ker(1 − π)` (i.e. > is in the image of `bridge_Bi_kernelToPrime_v2`). Mathematical content: function-field place ↔ closed-point dictionary over `K` (Silverman II.2.4), specialised to the pole locus of `f = (1−π)*x`. Since `x` has its only pole at `O`, a closed point of `E` where `f` has a pole satisfies `(1−π)(P) = O`, i.e. `P ∈ ker(1−π)`; over `K`, these are the `K`-rational kernel points = `E(F_q)`. **Casualties (round-5).** The WireUpPrep route (`degree_isogOneSub_negFrobenius_eq_pointCount` + `oneSubFrob_baseChange_coordHom`) is **dead** — relies on an impossible `CoordHom : R → R` for `1 − π`. See the B2 annotation on `HasseWeil.RouteB.nReduced_R_div_D_sq`.
-
theoremdefined in HasseWeil/Hasse/PointFix.leancomplete
theorem HasseWeil.kernel_eq_top_of_hom_eq_id_sub_frobenius.{u_1} {K : Type u_1} [Field K] [Fintype K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (h_hom : β.toAddMonoidHom = AddMonoidHom.id W.toAffine.Point - (HasseWeil.frobeniusIsog W).toAddMonoidHom) : β.kernel = ⊤
theorem HasseWeil.kernel_eq_top_of_hom_eq_id_sub_frobenius.{u_1} {K : Type u_1} [Field K] [Fintype K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (h_hom : β.toAddMonoidHom = AddMonoidHom.id W.toAffine.Point - (HasseWeil.frobeniusIsog W).toAddMonoidHom) : β.kernel = ⊤
Generalized form of `oneSubFrobeniusIsog_kernel_eq_top` for any witness isogeny with the same point-map as `1 − π`.
The point map of 1-\pi is \mathrm{id}-\pi, whose kernel is the Frobenius fixed
locus, i.e. all of E(\mathbb{F}_q), so \#\ker(1-\pi) = \#E(\mathbb{F}_q).
Separability (Theorem 4.2) gives
\#\ker(1-\pi)=\deg(1-\pi) via the kernel-cardinality theorem
(Theorem 4.1).
-
HasseWeil.pointCount_eq_of_witness[complete] -
HasseWeil.pointCount_eq_of_hom_kernel_witness[complete]
(Point count via the trace of Frobenius.) Combining the keystone with the degree of
Frobenius,
\#E(\mathbb{F}_q) \;=\; q + 1 - \operatorname{tr}(\pi), \qquad \operatorname{tr}(\pi)=t,
i.e. \#E(\mathbb{F}_q) - (q+1) = -t (Silverman V.1.1).
Lean code for Theorem4.4●2 theorems
Associated Lean declarations
-
HasseWeil.pointCount_eq_of_witness[complete]
-
HasseWeil.pointCount_eq_of_hom_kernel_witness[complete]
-
HasseWeil.pointCount_eq_of_witness[complete] -
HasseWeil.pointCount_eq_of_hom_kernel_witness[complete]
-
theoremdefined in HasseWeil/Frobenius.leancomplete
theorem HasseWeil.pointCount_eq_of_witness.{u_1} {K : Type u_1} [Field K] [Fintype K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] [Fintype W.toAffine.Point] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (hβ_deg : ↑β.degree = ↑(HasseWeil.pointCount W.toAffine)) : ↑(HasseWeil.pointCount W.toAffine) = ↑(Fintype.card K) + 1 - HasseWeil.isogTrace (HasseWeil.frobeniusIsog W) β
theorem HasseWeil.pointCount_eq_of_witness.{u_1} {K : Type u_1} [Field K] [Fintype K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] [Fintype W.toAffine.Point] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (hβ_deg : ↑β.degree = ↑(HasseWeil.pointCount W.toAffine)) : ↑(HasseWeil.pointCount W.toAffine) = ↑(Fintype.card K) + 1 - HasseWeil.isogTrace (HasseWeil.frobeniusIsog W) β
**Point count via a genuine `1 − π` witness** (Silverman V.1.1): if `β` is any isogeny with `β.degree = pointCount`, then `pointCount = q + 1 - isogTrace π β`. Independent of any placeholder. The witness `β` is the genuine `1 − π` (`isogOneSub_negFrobenius W hq`), whose `degree = pointCount` is the V.1.3 keystone (`ker_deg_skeleton` / `isogOneSub_negFrobenius_degree_eq_pointCount`).
-
theoremdefined in HasseWeil/Hasse/PointFix.leancomplete
theorem HasseWeil.pointCount_eq_of_hom_kernel_witness.{u_1} {K : Type u_1} [Field K] [Fintype K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] [Fintype W.toAffine.Point] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (h_hom : β.toAddMonoidHom = AddMonoidHom.id W.toAffine.Point - (HasseWeil.frobeniusIsog W).toAddMonoidHom) (h_ker_deg : Nat.card ↥β.kernel = β.degree) : ↑(HasseWeil.pointCount W.toAffine) = ↑(Fintype.card K) + 1 - HasseWeil.isogTrace (HasseWeil.frobeniusIsog W) β
theorem HasseWeil.pointCount_eq_of_hom_kernel_witness.{u_1} {K : Type u_1} [Field K] [Fintype K] [DecidableEq K] (W : WeierstrassCurve K) [WeierstrassCurve.IsElliptic W.toAffine] [Fintype W.toAffine.Point] (β : HasseWeil.Isogeny W.toAffine W.toAffine) (h_hom : β.toAddMonoidHom = AddMonoidHom.id W.toAffine.Point - (HasseWeil.frobeniusIsog W).toAddMonoidHom) (h_ker_deg : Nat.card ↥β.kernel = β.degree) : ↑(HasseWeil.pointCount W.toAffine) = ↑(Fintype.card K) + 1 - HasseWeil.isogTrace (HasseWeil.frobeniusIsog W) β
**Composed V.1 witness form**: if `β` has point-map `id − π` and `#ker β = β.degree`, then `#E(F_q) = q + 1 − isogTrace π β`.
By definition \operatorname{tr}(\pi)=1+\deg\pi-\deg(1-\pi) (Definition 2.3);
substitute \deg\pi=q (Definition 1.6) and
\deg(1-\pi)=\#E(\mathbb{F}_q) (Theorem 4.3) and rearrange.