Documentation

Atlas.EllipticCurves.code.IsogenyVolcano

structure Multigraph (V : Type u_1) :
Type u_1

A multigraph on vertex set V: each unordered pair (v, w) carries a multiplicity edgeMult v w : ℕ, required to be symmetric in v, w.

Instances For
    def Multigraph.Adj {V : Type u_1} (G : Multigraph V) (v w : V) :

    Two vertices v, w are adjacent in G iff their edge multiplicity is positive.

    Instances For
      def Multigraph.degree {V : Type u_1} (G : Multigraph V) [Fintype V] (v : V) :

      The (multi)degree of a vertex v: the sum of edge multiplicities to all vertices of V.

      Instances For
        def Multigraph.degreeOn {V : Type u_1} (G : Multigraph V) [Fintype V] (v : V) (P : VProp) [DecidablePred P] :

        The partial degree of v restricted to neighbours satisfying the predicate P.

        Instances For
          def Multigraph.Connected {V : Type u_1} (G : Multigraph V) (v w : V) :

          v and w are connected in G iff there is a finite path (a reflexive- transitive closure of adjacency) from v to w.

          Instances For

            The multigraph G is connected iff every pair of vertices is connected.

            Instances For
              theorem Multigraph.degreeOn_compl {V : Type u_1} (G : Multigraph V) [Fintype V] (v : V) (P : VProp) [DecidablePred P] :
              G.degree v = G.degreeOn v P + G.degreeOn v fun (w : V) => ¬P w

              The total degree decomposes as the partial degree over P plus the partial degree over ¬P.

              theorem Multigraph.degreeOn_congr {V : Type u_1} (G : Multigraph V) [Fintype V] (v : V) (P Q : VProp) [DecidablePred P] [DecidablePred Q] (h : ∀ (w : V), G.edgeMult v w > 0 → (P w Q w)) :
              G.degreeOn v P = G.degreeOn v Q

              Two predicates P, Q that agree on all neighbours of v (vertices with positive edge multiplicity) give the same partial degree at v.

              noncomputable def modularPolynomialSpec (k : Type u_1) [CommRing k] ( : ) (j₁ : k) :

              The classical modular polynomial Φ_ℓ(X, Y) specialized to Y = j₁: a univariate polynomial in X over k whose roots over an algebraic closure are the j-invariants of elliptic curves -isogenous to a curve with j-invariant j₁.

              Instances For
                noncomputable def IsogenyGraph.edgeMult (k : Type u_1) [CommRing k] ( : ) (j₁ j₂ : k) :

                The multiplicity of j₂ as a root of Φ_ℓ(j₁, Y), equal to the number of -isogenies (with multiplicity) from a curve with j-invariant j₁ to one with j-invariant j₂.

                Instances For
                  def IsogenyGraph.hasEdge (k : Type u_1) [CommRing k] ( : ) (j₁ j₂ : k) :

                  There is an edge from j₁ to j₂ in the -isogeny graph iff j₂ is a root of the modular polynomial Φ_ℓ(j₁, Y).

                  Instances For
                    @[reducible, inline]

                    The set of possible j-invariants over 𝔽_p, identified with ZMod p.

                    Instances For
                      theorem IsogenyGraph.modularPolynomial_symm_edge (k : Type u_1) [CommRing k] ( : ) (j₁ j₂ : k) :
                      hasEdge k j₁ j₂hasEdge k j₂ j₁

                      Edges in the -isogeny graph are symmetric: an -isogeny from j₁ to j₂ gives rise to a dual -isogeny from j₂ to j₁.

                      The -isogeny graph over 𝔽_p as a SimpleGraph on j-invariants (Definition 22.1): two distinct j-values are adjacent iff there is an -isogeny between them.

                      Instances For
                        noncomputable def IsogenyGraph.isogenyGraph_locallyFinite (p : ) [Fact (Nat.Prime p)] [Fact (Nat.Prime )] (hne : p ) :

                        The -isogeny graph over 𝔽_p is locally finite.

                        Instances For
                          theorem IsogenyGraph.isogenyGraph_regular (p : ) [Fact (Nat.Prime p)] [Fact (Nat.Prime )] (hne : p ) :
                          (isogenyGraph p hne).IsRegularOfDegree ( + 1)

                          The -isogeny graph over 𝔽_p is regular of degree + 1: every vertex has exactly + 1 outgoing -isogenies (counted with multiplicity).

                          @[simp]
                          theorem IsogenyGraph.isogenyGraph_adj {p : } [Fact (Nat.Prime p)] [Fact (Nat.Prime )] {hne : p } {j₁ j₂ : 𝔽_p_jInvariants p} :
                          (isogenyGraph p hne).Adj j₁ j₂ j₁ j₂ hasEdge (ZMod p) j₁ j₂

                          The defining adjacency relation of the -isogeny graph: j₁ and j₂ are adjacent iff they are distinct and there is an edge between them.

                          structure IsogenyVolcano ( : ) :
                          Type (u_1 + 1)

                          An -volcano: a connected multigraph organized into levels (the surface is level 0, the floor is level depth). Vertices off the floor have degree + 1, surface vertices have a prescribed surface degree (≤ 2), and non-surface vertices have a unique parent at the level above. Edges can only join the surface to itself or adjacent levels.

                          Instances For
                            def IsogenyVolcano.isSurface { : } (vol : IsogenyVolcano ) (v : vol.V) :

                            A vertex of the volcano is on the surface (or crater) iff its level is 0.

                            Instances For
                              def IsogenyVolcano.isFloor { : } (vol : IsogenyVolcano ) (v : vol.V) :

                              A vertex of the volcano is on the floor iff its level is the maximal one (depth).

                              Instances For

                                The depth of the volcano (the maximal level index).

                                Instances For
                                  def IsogenyVolcano.IsHorizontalEdge { : } (vol : IsogenyVolcano ) (v w : vol.V) :

                                  An edge (v, w) is horizontal iff it has positive multiplicity and both endpoints lie on the surface.

                                  Instances For
                                    def IsogenyVolcano.IsDescendingEdge { : } (vol : IsogenyVolcano ) (v w : vol.V) :

                                    An edge (v, w) is descending iff w is one level below v (level v + 1 = level w).

                                    Instances For
                                      def IsogenyVolcano.IsAscendingEdge { : } (vol : IsogenyVolcano ) (v w : vol.V) :

                                      An edge (v, w) is ascending iff w is one level above v (level w + 1 = level v).

                                      Instances For
                                        def IsogenyVolcano.IsVerticalEdge { : } (vol : IsogenyVolcano ) (v w : vol.V) :

                                        An edge is vertical iff it is either descending or ascending.

                                        Instances For

                                          An edge (v, w) is descending iff the reverse edge (w, v) is ascending.

                                          An edge (v, w) is ascending iff the reverse edge (w, v) is descending.

                                          theorem CMConductorTrichotomy.coprime_dvd_prime {a b : } (hℓ : Nat.Prime ) (hab : a.Coprime b) (ha : a ) (hb : b ) :
                                          a = 1 b = 1 a = 1 b = a = b = 1

                                          If two coprime natural numbers a, b both divide a prime , then either both are 1, or one is 1 and the other is .

                                          theorem CMConductorTrichotomy.isogeny_order_trichotomy { : } (hℓ : Nat.Prime ) {f f' : } (hf : 0 < f) (h1 : f * f') (h2 : f' * f) :
                                          f = f' f = * f' f' = * f

                                          Conductor trichotomy for -isogenies: if conductors f, f' satisfy f f' and f' ∣ f, then f = f' (horizontal), f = f' (ascending), or f' = f (descending). Encodes the index relation behind Theorem 22.3.

                                          Classification (Definition 22.4) of an -isogeny between CM elliptic curves by the relation between the source and target endomorphism orders: horizontal (𝒪 = 𝒪''), descending ([𝒪 : 𝒪''] = ), or ascending ([𝒪'' : 𝒪] = ).

                                          Instances For

                                            Classify an -isogeny by comparing source conductor f and target conductor f': f = f' is horizontal, f = f' is descending, otherwise ascending.

                                            Instances For

                                              If f = f' then the isogeny is classified as horizontal.

                                              theorem CMConductorTrichotomy.classifyIsogeny_descending { : } (hℓ : 1 < ) {f f' : } (hf' : 0 < f') (h : f = * f') :

                                              If f = f' (with f' > 0 and > 1), the isogeny is classified as descending.

                                              theorem CMConductorTrichotomy.classifyIsogeny_ascending { : } (hℓ : 1 < ) {f f' : } (hf : 0 < f) (h : f' = * f) :

                                              If f' = f (with f > 0 and > 1), the isogeny is classified as ascending.

                                              The crater (surface) subgraph of an isogeny volcano: the multigraph induced on the surface (level 0) vertices, keeping only edges that lie entirely on the surface.

                                              Instances For
                                                theorem IsogenyVolcano.crater_degree_surface { : } (vol : IsogenyVolcano ) (v : vol.V) (hv : vol.level v = 0, ) :

                                                For a surface vertex v, its degree in the crater subgraph equals the volcano's surfaceDegree.

                                                theorem IsogenyVolcano.crater_is_regular { : } (vol : IsogenyVolcano ) (v w : vol.V) :
                                                vol.isSurface vvol.isSurface wvol.craterGraph.degree v = vol.craterGraph.degree w

                                                The crater subgraph is regular when restricted to surface vertices: any two surface vertices have the same crater-degree.

                                                theorem IsogenyVolcano.crater_degree_le_two { : } (vol : IsogenyVolcano ) (v : vol.V) (hv : vol.isSurface v) :

                                                Surface vertices have crater-degree at most 2, reflecting the surface-degree bound ≤ 2.

                                                theorem IsogenyVolcano.nonsurface_edges_adjacent { : } (vol : IsogenyVolcano ) (v : vol.V) (hv : (vol.level v) > 0) (w : vol.V) (hw : vol.graph.edgeMult v w > 0) :
                                                (vol.level w) + 1 = (vol.level v) (vol.level v) + 1 = (vol.level w)

                                                For a non-surface vertex v, every neighbour w is either one level above or one level below v — there are no horizontal edges away from the surface.

                                                theorem IsogenyVolcano.nonsurface_not_ascending_iff_descending { : } (vol : IsogenyVolcano ) (v : vol.V) (hv : (vol.level v) > 0) (w : vol.V) (hw : vol.graph.edgeMult v w > 0) :
                                                ¬(vol.level w) + 1 = (vol.level v) (vol.level v) + 1 = (vol.level w)

                                                For a non-surface vertex v with neighbour w, not being an ascending edge is equivalent to being a descending edge.

                                                theorem IsogenyVolcano.nonsurface_descending_degree { : } (vol : IsogenyVolcano ) (v : vol.V) (hv_pos : (vol.level v) > 0) (hv_lt : (vol.level v) < vol.depth) :
                                                (vol.graph.degreeOn v fun (w : vol.V) => (vol.level v) + 1 = (vol.level w)) =

                                                For a non-surface vertex v strictly above the floor, the descending degree equals : there are exactly descending edges.

                                                theorem IsogenyVolcano.surface_descending_degree { : } (vol : IsogenyVolcano ) (v : vol.V) (hv : vol.isSurface v) (hd : 0 < vol.depth) :
                                                (vol.graph.degreeOn v fun (w : vol.V) => ¬vol.level w = 0, ) = + 1 - vol.surfaceDegree

                                                For a surface vertex v (when the volcano has positive depth), the number of edges leaving the surface equals + 1 - surfaceDegree.

                                                theorem IsogenyVolcano.level_val_eq_zero_of_depth_zero { : } (vol : IsogenyVolcano ) (hd : vol.depth = 0) (v : vol.V) :
                                                (vol.level v) = 0

                                                If the volcano has depth 0, every vertex has level value 0.

                                                theorem IsogenyVolcano.floor_nonascending_degree_eq_zero { : } (vol : IsogenyVolcano ) (v : vol.V) (hv : (vol.level v) = vol.depth) (hd : 0 < vol.depth) :
                                                (vol.graph.degreeOn v fun (w : vol.V) => ¬(vol.level w) + 1 = (vol.level v)) = 0

                                                For a floor vertex (level equal to depth, with positive depth), the number of non-ascending edges is 0: floor vertices have only their unique ascending edge.

                                                theorem IsogenyVolcano.floor_degree_eq_one { : } (vol : IsogenyVolcano ) (v : vol.V) (hv : (vol.level v) = vol.depth) (hd : 0 < vol.depth) :
                                                vol.graph.degree v = 1

                                                A floor vertex of a positive-depth volcano has total degree exactly 1 — its single edge being the ascending one.

                                                theorem IsogenyVolcano.degree_eq_surfaceDegree_of_depth_zero { : } (vol : IsogenyVolcano ) (hd : vol.depth = 0) (v : vol.V) :

                                                For a depth-zero volcano (no non-surface levels) every vertex has total degree equal to the surface degree.

                                                theorem IsogenyVolcano.lemma_22_13 { : } (vol : IsogenyVolcano ) (v : vol.V) :
                                                vol.graph.degree v 2 vol.isFloor v vol.graph.degree v = + 1 ¬vol.isFloor v

                                                Lemma 22.13: for any vertex v in an ordinary component of depth d of G_ℓ(𝔽_q), either deg v ≤ 2 and v is on the floor, or deg v = + 1 and v is not on the floor.

                                                Data attached to a CM -isogeny problem: an imaginary quadratic discriminant D < 0, a prime , and a positive conductor f of the source order.

                                                Instances For

                                                  Counts of -isogenies from a surface (f) CM elliptic curve, organized by type. Following Theorem 22.5, there are 1 + (D/ℓ) horizontal, - (D/ℓ) descending, and 0 ascending isogenies.

                                                  Instances For

                                                    Counts of -isogenies from a non-surface (f) CM elliptic curve: 0 horizontal, descending, and 1 ascending.

                                                    Instances For

                                                      Existence (with values prescribed by Theorem 22.5) of the surface isogeny counts when f.

                                                      Instances For

                                                        Existence of the non-surface isogeny counts when f.

                                                        Instances For
                                                          theorem CMIsogeny.cm_isogeny_count_by_type (C : CMIsogenyData) :
                                                          (¬C. C.f∃ (h : ) (d : ) (a : ), h = 1 + jacobiSym C.D C. d = C. - jacobiSym C.D C. a = 0) (C. C.f∃ (h : ) (d : ) (a : ), h = 0 d = C. a = 1)

                                                          Combined statement of the CM isogeny count by type (Theorem 22.5 / Definition 22.4): the case analysis on f produces either the surface counts (when f) or the non-surface counts (when f).

                                                          Total -isogeny count from a surface CM curve sums to + 1.

                                                          Total -isogeny count from a non-surface CM curve sums to + 1.

                                                          Data for an ordinary component of the -isogeny graph over 𝔽_q: a prime coprime to q, the Hasse trace t (with t² < 4q), a fundamental imaginary quadratic discriminant D₀, a positive base conductor f₀, and the class number.

                                                          Instances For

                                                            Kohel's structural data for an ordinary -volcano: an IsogenyVolcano of prime degree , equipped with a conductor function f₀ · ℓ^level on vertices, crater data tied to the Kronecker symbol (D₀/ℓ), and the depth-determining equation 4q = t² - ℓ^{2d} v² D₀.

                                                            Instances For

                                                              The underlying -volcano structure on the ordinary component (existence statement; the construction is left as a sorry).

                                                              Instances For

                                                                The surface degree of the ordinary component volcano equals 1 + (D₀/ℓ) (Theorem 22.11).

                                                                Surface size formula (split/ramified case): when (D₀/ℓ) ≥ 0, the surface has size equal to the class number / class order.

                                                                Surface size formula (inert case): when (D₀/ℓ) = -1, the surface consists of a single vertex.

                                                                The auxiliary integer v appearing in the depth-determining norm equation 4q = t² - ℓ^{2d} v² D₀.

                                                                Instances For

                                                                  The depth equation tying the trace t, prime power ℓ^{2d}, auxiliary v, and discriminant D₀ to 4q.

                                                                  The auxiliary integer v from the depth equation is coprime to .

                                                                  Auxiliary algebraic step underlying Kohel's index_step: pushing a level-i conductor f₀ · ℓ^i up to a level-(i+1) conductor gives times the original.

                                                                  Kohel's existence theorem (Theorem 22.11): packaging the data computed above into a single KohelVolcano for an ordinary component.

                                                                  Instances For

                                                                    A surface vertex of the Kohel volcano has conductor equal to the base conductor f₀.

                                                                    A floor vertex of the Kohel volcano has conductor f₀ · ℓ^depth.

                                                                    theorem VolcanoStructure.conductor_increases_by_ℓ {C : OrdinaryIsogenyComponent} (K : KohelVolcano C) (v w : K.volcano.V) (hv : (K.volcano.level v) + 1 = (K.volcano.level w)) (_hlt : (K.volcano.level v) < K.volcano.depth) :

                                                                    Moving down one level in the Kohel volcano multiplies the conductor by .

                                                                    Re-export: the surface degree of a Kohel volcano is at most 2.

                                                                    For a surface vertex, the crater degree equals 1 + (D₀/ℓ).

                                                                    theorem VolcanoStructure.nonsurface_descending_eq_ℓ {C : OrdinaryIsogenyComponent} (K : KohelVolcano C) (v : K.volcano.V) (hv_pos : (K.volcano.level v) > 0) (hv_lt : (K.volcano.level v) < K.volcano.depth) :
                                                                    (K.volcano.graph.degreeOn v fun (w : K.volcano.V) => (K.volcano.level v) + 1 = (K.volcano.level w)) = C.

                                                                    For a non-surface, non-floor vertex of the Kohel volcano, the descending degree equals .

                                                                    For a surface vertex of a positive-depth Kohel volcano, the number of edges leaving the surface equals + 1 - surfaceDegree.

                                                                    The set ellCMSet D F of j-invariants of elliptic curves over a finite field F with CM by the order of discriminant D is finite.

                                                                    If the Hilbert class polynomial of D splits and is separable over F with roots equal to ellCMSet D F, then the cardinality of ellCMSet D F equals the class number of D (an instance of Deuring's Theorem 21.12).

                                                                    D is contained in D' (as orders) iff D = u² D' for some positive integer u and D' is itself an imaginary quadratic discriminant.

                                                                    Instances For

                                                                      If D contains D' then D' is itself an imaginary quadratic discriminant.

                                                                      theorem CMSetCardinality.coprime_of_orderContains (D D' : ) (q : ) (hcop : q.Coprime D.natAbs) (hcontains : OrderContains D D') :

                                                                      Coprimality with |D| descends to coprimality with |D'| along an order containment.

                                                                      theorem CMSetCardinality.normEquation_of_orderContains (D D' : ) (q : ) (t v : ) (hne : Elliptic_Curves.NormEquation D q t v) (hcontains : OrderContains D D') :
                                                                      ∃ (w : ), Elliptic_Curves.NormEquation D' q t w

                                                                      A norm-equation solution for D lifts to a norm-equation solution for any D' that D contains.

                                                                      theorem CMSetCardinality.ellCMSet_nonempty_of_normEquation (D : ) (hD : Elliptic_Curves.IsImagQuadDiscriminant D) (q : ) (hq : 1 < q) (hcop : q.Coprime D.natAbs) (t v : ) (hne : Elliptic_Curves.NormEquation D q t v) (ht : ¬q t) (F : Type u_1) [Field F] [Fintype F] (hcard : Fintype.card F = q) :

                                                                      If (D, q) admits a norm-equation solution (t, v) with qt, then ellCMSet D F is nonempty for every field F of size q.

                                                                      theorem CMSetCardinality.ellCMSet_nonempty_implies_normEquation (D : ) (hD : Elliptic_Curves.IsImagQuadDiscriminant D) (q : ) (hq : 1 < q) (hcop : q.Coprime D.natAbs) (F : Type u_1) [Field F] [Fintype F] (hcard : Fintype.card F = q) (hne : (Elliptic_Curves.Deuring.ellCMSet D F).Nonempty) :
                                                                      ∃ (t : ) (v : ), Elliptic_Curves.NormEquation D q t v ¬q t

                                                                      Conversely, if ellCMSet D F is nonempty for some field F of size q, then the corresponding norm equation has a solution (t, v) with qt.

                                                                      For a field F of size q coprime to |D|, the CM set ellCMSet D F is either empty or has cardinality equal to the class number h(D).

                                                                      Data for counting -isogenies from a CM elliptic curve over 𝔽_q: an imaginary quadratic discriminant D with class data, a prime q coprime to |D|, and a conductor f.

                                                                      Instances For

                                                                        The discriminant of a descendant order, obtained by multiplying D by ℓ².

                                                                        Instances For
                                                                          structure IsogenyCount.IsogenyCount (C : CMCurveData) (F : Type u_1) [Field F] [Fintype F] :

                                                                          Counts of -isogenies from a CM elliptic curve over F (with |F| = q): horizontal, ascending, and descending counts, with the values prescribed by Theorem 22.5, and the descending count conditioned on whether descendant CM curves exist over F.

                                                                          Instances For
                                                                            noncomputable def IsogenyCount.isogeny_count_exists (C : CMCurveData) (F : Type u_1) [Field F] [Fintype F] (hcard : Fintype.card F = C.q) (hne : (Elliptic_Curves.Deuring.ellCMSet C.D F).Nonempty) :

                                                                            Existence of an IsogenyCount package for any CM data with a nonempty CM set over F.

                                                                            Instances For

                                                                              Data for a CM torsor: an imaginary quadratic discriminant D and a prime power q coprime to |D|.

                                                                              Instances For
                                                                                noncomputable def CMTorsor.IdealClassRepresentedByNorm (D : ) ( : ) {ClO : Type u_1} [CommGroup ClO] :
                                                                                ClOProp

                                                                                Predicate that an ideal class in the class group of an order is represented by an ideal of norm equal to a given prime .

                                                                                Instances For
                                                                                  def CMTorsor.IsIdealClassOfPrimeNorm (D : ) ( : ) {ClO : Type u_1} [CommGroup ClO] (g : ClO) :

                                                                                  An ideal class g is "of prime norm " iff is prime and g is represented by an ideal of norm .

                                                                                  Instances For

                                                                                    Every ideal class in the imaginary quadratic class group contains a representative ideal of prime norm coprime to a given integer q.

                                                                                    structure CMTorsor.CMTorsor (C : CMTorsorData) (F : Type u_1) [Field F] [Fintype F] :
                                                                                    Type (max (max u_1 (u_2 + 1)) (u_3 + 1))

                                                                                    A CM-torsor structure: the class group ClO acts freely and transitively on the set EllSet of CM elliptic curves over F, with the j-invariants identifying EllSet with ellCMSet D F. Action by an ideal class of prime norm corresponds to an -isogeny in both directions.

                                                                                    Instances For
                                                                                      noncomputable def CMTorsor.cm_torsor_exists (C : CMTorsorData) (F : Type u_1) [Field F] [Fintype F] (hcard : Fintype.card F = C.q) (hne : (Elliptic_Curves.Deuring.ellCMSet C.D F).Nonempty) :

                                                                                      A CM torsor exists for any CM data with a nonempty CM set over a finite field F of the prescribed cardinality.

                                                                                      Instances For