The Hasse Bound — Lean blueprint

4. Separability and the point-count identity🔗

Theorem4.1
uses 0used by 1L∃∀N

(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.12 theorems
  • theoremdefined in HasseWeil/EC/IsogenyKernel.lean
    complete
    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.lean
    complete
    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`. 
Proof for Theorem 4.1
uses 0

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.

Theorem4.2
uses 0used by 1L∃∀N

(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.22 theorems
  • theoremdefined in HasseWeil/Hasse/Separability.lean
    complete
    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.lean
    complete
    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. 
Proof for Theorem 4.2

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).

Theorem4.3
uses 1used by 1L∃∀N

(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.32 theorems
  • theoremdefined in HasseWeil/GapSpines.lean
    complete
    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.lean
    complete
    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 − π`. 
Proof for Theorem 4.3
Proof uses 2
Proof dependency previews
Preview
Theorem 4.1
Loading preview
Proof dependency preview content is loaded from the rendered-fragment cache.

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).

Theorem4.4
uses 0
Used by 2
Reverse dependency previews
Preview
Theorem 7.1
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

(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.42 theorems
  • theoremdefined in HasseWeil/Frobenius.lean
    complete
    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.lean
    complete
    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 π β`. 
Proof for Theorem 4.4
Proof uses 3
Proof dependency previews
Preview
Definition 1.6
Loading preview
Proof dependency preview content is loaded from the rendered-fragment cache.

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.