Fermat's Last Theorem Blueprint

8. Miniproject: Frobenius Elements🔗

8.1. Status🔗

This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.

8.2. Introduction And Goal🔗

When this project started, I had thought that the existence of Frobenius elements was specific to the theory of local and global fields, and a slightly more general result held for Dedekind domains. Then Joel Riou pointed out on the Lean Zulip an extremely general result from from Bourbaki's Commutative Algebra (Chapter V, Section 2, number 2, theorem 2, part (ii)). This beautiful result is surely what we want to see in mathlib. Before we state Bourbaki's theorem, let us set the scene.

The goal of the mini-project is to get this theorem formalised and ideally into mathlib.

In particular, \Aut(L/K) is finite as a corollary. What is so striking about this theorem to me is that the only finiteness hypothesis is on the group G which acts; there are no finiteness or Noetherian hypotheses on the rings at all.

8.3. Statement Of The Theorem🔗

The set-up throughout this project: G is a finite group acting (via ring isomorphisms) on a commutative ring B, and A is the subring of G-invariants.

Say Q is a prime ideal of B, whose pullback to A is the prime ideal P. Note that G naturally acts on the ideals of B. Let the decomposition group D_Q of Q be the subgroup of G which stabilizes Q (just to be clear: g \in D_Q means \{g \cdot q \,:\, q \in Q\}=Q, not \forall q \in Q, g \cdot q = q).

Let L be the field of fractions of the integral domain B/Q, and let K be the field of fractions of the subring A/P. Then L is naturally a K-algebra. In this generality L/K may not even be finite or Galois, but we can still talk about \Aut(L/K).

In the next definition we write down a group homomorphism \phi from D_Q to \Aut(L/K).

Definition8.1
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Theorem 8.2
Blueprint label
  • «IsFractionRing.stabilizerHom_surjective»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Theorem 8.2
Blueprint label
  • «IsFractionRing.stabilizerHom_surjective»
Uses target in
  • statement

Choose g \in D_Q. Then the action of g on B gives us an induced A/P-algebra automorphism of B/Q which extends to a K-algebra automorphism \phi(g) of L. This construction g \mapsto \phi(g) defines a group homomorphism from D_Q to \Aut(L/K) (all the proofs implicit in the definition here are straightforward).

Code for Definition8.11 definition
  • def IsFractionRing.stabilizerHom.{u_1, u_2, u_3, u_4, u_5} {AType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      {BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  AType u_1] [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     AType u_1 BType u_2] (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3] [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2] [SMulCommClassSMulCommClass.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M α] [SMul N α] : PropA typeclass mixin saying that two multiplicative actions on the same space commute.  GType u_3 AType u_1 BType u_2] (PIdeal A : IdealIdeal.{u} (R : Type u) [Semiring R] : Type uA (left) ideal in a semiring `R` is an additive submonoid `s` such that
    `a * b ∈ s` whenever `b ∈ s`. If `R` is a ring, then `s` is an additive subgroup.  AType u_1)
      (QIdeal B : IdealIdeal.{u} (R : Type u) [Semiring R] : Type uA (left) ideal in a semiring `R` is an additive submonoid `s` such that
    `a * b ∈ s` whenever `b ∈ s`. If `R` is a ring, then `s` is an additive subgroup.  BType u_2) [QIdeal B.LiesOverIdeal.LiesOver.{u_2, u_3} {A : Type u_2} [CommSemiring A] {B : Type u_3} [Semiring B] [Algebra A B] (P : Ideal B)
      (p : Ideal A) : Prop`P` lies over `p` if `p` is the preimage of `P` by the `algebraMap`.  PIdeal A] (KType u_4 : Type u_4A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (LType u_5 : Type u_5A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  KType u_4]
      [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5]
      [IsScalarTowerIsScalarTower.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M N] [SMul N α] [SMul M α] : PropAn instance of `IsScalarTower M N α` states that the multiplicative
    action of `M` on `α` is determined by the multiplicative actions of `M` on `N`
    and `N` on `α`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     KType u_4 LType u_5]
      [IsScalarTowerIsScalarTower.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M N] [SMul N α] [SMul M α] : PropAn instance of `IsScalarTower M N α` states that the multiplicative
    action of `M` on `α` is determined by the multiplicative actions of `M` on `N`
    and `N` on `α`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4 LType u_5] [IsFractionRingIsFractionRing.{u_6, u_7} (R : Type u_6) [CommSemiring R] (K : Type u_7) [CommSemiring K] [Algebra R K] : Prop`IsFractionRing R K` states `K` is the ring of fractions of a commutative ring `R`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4]
      [IsFractionRingIsFractionRing.{u_6, u_7} (R : Type u_6) [CommSemiring R] (K : Type u_7) [CommSemiring K] [Algebra R K] : Prop`IsFractionRing R K` states `K` is the ring of fractions of a commutative ring `R`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] : (MulAction.stabilizerMulAction.stabilizer.{u_1, u_2} (G : Type u_1) {α : Type u_2} [Group G] [MulAction G α] (a : α) : Subgroup GThe stabilizer of an element under an action, i.e. what sends the element to itself.
    A subgroup.  GType u_3 QIdeal B) →*MonoidHom.{u_10, u_11} (M : Type u_10) (N : Type u_11) [MulOne M] [MulOne N] : Type (max u_10 u_11)`M →* N` is the type of functions `M → N` that preserve the `MulOne` structure.
    `MonoidHom` is used for both monoid and group homomorphisms.
    
    When possible, instead of parametrizing results over `(f : M →* N)`,
    you should parametrize over `(F : Type*) [MonoidHomClass F M N] (f : F)`.
    
    When you extend this structure, make sure to extend `MonoidHomClass`.
     Gal(LType u_5/KType u_4)
    def IsFractionRing.stabilizerHom.{u_1, u_2,
        u_3, u_4, u_5}
      {AType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } {BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  AType u_1] [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     AType u_1 BType u_2]
      (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3]
      [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2]
      [SMulCommClassSMulCommClass.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M α] [SMul N α] : PropA typeclass mixin saying that two multiplicative actions on the same space commute.  GType u_3 AType u_1 BType u_2] (PIdeal A : IdealIdeal.{u} (R : Type u) [Semiring R] : Type uA (left) ideal in a semiring `R` is an additive submonoid `s` such that
    `a * b ∈ s` whenever `b ∈ s`. If `R` is a ring, then `s` is an additive subgroup.  AType u_1)
      (QIdeal B : IdealIdeal.{u} (R : Type u) [Semiring R] : Type uA (left) ideal in a semiring `R` is an additive submonoid `s` such that
    `a * b ∈ s` whenever `b ∈ s`. If `R` is a ring, then `s` is an additive subgroup.  BType u_2) [QIdeal B.LiesOverIdeal.LiesOver.{u_2, u_3} {A : Type u_2} [CommSemiring A] {B : Type u_3} [Semiring B] [Algebra A B] (P : Ideal B)
      (p : Ideal A) : Prop`P` lies over `p` if `p` is the preimage of `P` by the `algebraMap`.  PIdeal A]
      (KType u_4 : Type u_4A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (LType u_5 : Type u_5A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  KType u_4]
      [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5]
      [IsScalarTowerIsScalarTower.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M N] [SMul N α] [SMul M α] : PropAn instance of `IsScalarTower M N α` states that the multiplicative
    action of `M` on `α` is determined by the multiplicative actions of `M` on `N`
    and `N` on `α`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     KType u_4 LType u_5]
      [IsScalarTowerIsScalarTower.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M N] [SMul N α] [SMul M α] : PropAn instance of `IsScalarTower M N α` states that the multiplicative
    action of `M` on `α` is determined by the multiplicative actions of `M` on `N`
    and `N` on `α`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4 LType u_5]
      [IsFractionRingIsFractionRing.{u_6, u_7} (R : Type u_6) [CommSemiring R] (K : Type u_7) [CommSemiring K] [Algebra R K] : Prop`IsFractionRing R K` states `K` is the ring of fractions of a commutative ring `R`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4]
      [IsFractionRingIsFractionRing.{u_6, u_7} (R : Type u_6) [CommSemiring R] (K : Type u_7) [CommSemiring K] [Algebra R K] : Prop`IsFractionRing R K` states `K` is the ring of fractions of a commutative ring `R`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] :
      (MulAction.stabilizerMulAction.stabilizer.{u_1, u_2} (G : Type u_1) {α : Type u_2} [Group G] [MulAction G α] (a : α) : Subgroup GThe stabilizer of an element under an action, i.e. what sends the element to itself.
    A subgroup.  GType u_3 QIdeal B) →*MonoidHom.{u_10, u_11} (M : Type u_10) (N : Type u_11) [MulOne M] [MulOne N] : Type (max u_10 u_11)`M →* N` is the type of functions `M → N` that preserve the `MulOne` structure.
    `MonoidHom` is used for both monoid and group homomorphisms.
    
    When possible, instead of parametrizing results over `(f : M →* N)`,
    you should parametrize over `(F : Type*) [MonoidHomClass F M N] (f : F)`.
    
    When you extend this structure, make sure to extend `MonoidHomClass`.
     Gal(LType u_5/KType u_4)
    If `Q` lies over `P`, then the stabilizer of `Q` acts on `Frac(B/Q)/Frac(A/P)`. 
    complete

The theorem we want in this mini-project is

Theorem8.2
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
L∃∀Nused by 0

Definition 8.1 The map g \mapsto \phi_g from D_Q to \Aut(L/K) defined above is surjective.

Code for Theorem8.21 theorem
  • theorem IsFractionRing.stabilizerHom_surjective.{u_1, u_2, u_3, u_4, u_5}
      {AType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } {BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  AType u_1] [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     AType u_1 BType u_2]
      (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_3] [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2]
      [SMulCommClassSMulCommClass.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M α] [SMul N α] : PropA typeclass mixin saying that two multiplicative actions on the same space commute.  GType u_3 AType u_1 BType u_2] (PIdeal A : IdealIdeal.{u} (R : Type u) [Semiring R] : Type uA (left) ideal in a semiring `R` is an additive submonoid `s` such that
    `a * b ∈ s` whenever `b ∈ s`. If `R` is a ring, then `s` is an additive subgroup.  AType u_1) (QIdeal B : IdealIdeal.{u} (R : Type u) [Semiring R] : Type uA (left) ideal in a semiring `R` is an additive submonoid `s` such that
    `a * b ∈ s` whenever `b ∈ s`. If `R` is a ring, then `s` is an additive subgroup.  BType u_2) [QIdeal B.IsPrimeIdeal.IsPrime.{u} {α : Type u} [Semiring α] (I : Ideal α) : PropAn ideal `P` of a ring `R` is prime if `P ≠ R` and `xy ∈ P → x ∈ P ∨ y ∈ P` ]
      [QIdeal B.LiesOverIdeal.LiesOver.{u_2, u_3} {A : Type u_2} [CommSemiring A] {B : Type u_3} [Semiring B] [Algebra A B] (P : Ideal B)
      (p : Ideal A) : Prop`P` lies over `p` if `p` is the preimage of `P` by the `algebraMap`.  PIdeal A] (KType u_4 : Type u_4A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (LType u_5 : Type u_5A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  KType u_4] [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  LType u_5]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5]
      [IsScalarTowerIsScalarTower.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M N] [SMul N α] [SMul M α] : PropAn instance of `IsScalarTower M N α` states that the multiplicative
    action of `M` on `α` is determined by the multiplicative actions of `M` on `N`
    and `N` on `α`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     KType u_4 LType u_5]
      [IsScalarTowerIsScalarTower.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M N] [SMul N α] [SMul M α] : PropAn instance of `IsScalarTower M N α` states that the multiplicative
    action of `M` on `α` is determined by the multiplicative actions of `M` on `N`
    and `N` on `α`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4 LType u_5] [Algebra.IsInvariantAlgebra.IsInvariant.{u_1, u_2, u_3} (A : Type u_1) (B : Type u_2) (G : Type u_3) [CommSemiring A] [Semiring B]
      [Algebra A B] [Group G] [MulSemiringAction G B] : PropAn action of a group `G` on an extension of rings `B/A` is invariant if every fixed point of
    `B` lies in the image of `A`. The converse statement that every point in the image of `A` is fixed
    by `G` is `smul_algebraMap` (assuming `SMulCommClass A B G`).  AType u_1 BType u_2 GType u_3]
      [IsFractionRingIsFractionRing.{u_6, u_7} (R : Type u_6) [CommSemiring R] (K : Type u_7) [CommSemiring K] [Algebra R K] : Prop`IsFractionRing R K` states `K` is the ring of fractions of a commutative ring `R`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4] [IsFractionRingIsFractionRing.{u_6, u_7} (R : Type u_6) [CommSemiring R] (K : Type u_7) [CommSemiring K] [Algebra R K] : Prop`IsFractionRing R K` states `K` is the ring of fractions of a commutative ring `R`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] :
      Function.SurjectiveFunction.Surjective.{u_1, u_2} {α : Sort u_1} {β : Sort u_2} (f : α → β) : PropA function `f : α → β` is called surjective if every `b : β` is equal to `f a`
    for some `a : α`.  (IsFractionRing.stabilizerHomIsFractionRing.stabilizerHom.{u_1, u_2, u_3, u_4, u_5} {A : Type u_1} {B : Type u_2} [CommRing A] [CommRing B]
      [Algebra A B] (G : Type u_3) [Group G] [MulSemiringAction G B] [SMulCommClass G A B] (P : Ideal A) (Q : Ideal B)
      [Q.LiesOver P] (K : Type u_4) (L : Type u_5) [Field K] [Field L] [Algebra (A ⧸ P) K] [Algebra (B ⧸ Q) L]
      [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L] [Algebra K L] [IsScalarTower (A ⧸ P) K L]
      [IsFractionRing (A ⧸ P) K] [IsFractionRing (B ⧸ Q) L] : ↥(MulAction.stabilizer G Q) →* Gal(L/K)If `Q` lies over `P`, then the stabilizer of `Q` acts on `Frac(B/Q)/Frac(A/P)`.  GType u_3 PIdeal A QIdeal B KType u_4 LType u_5)
    theorem IsFractionRing.stabilizerHom_surjective.{u_1,
        u_2, u_3, u_4, u_5}
      {AType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } {BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  AType u_1] [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     AType u_1 BType u_2]
      (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_3]
      [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2]
      [SMulCommClassSMulCommClass.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M α] [SMul N α] : PropA typeclass mixin saying that two multiplicative actions on the same space commute.  GType u_3 AType u_1 BType u_2] (PIdeal A : IdealIdeal.{u} (R : Type u) [Semiring R] : Type uA (left) ideal in a semiring `R` is an additive submonoid `s` such that
    `a * b ∈ s` whenever `b ∈ s`. If `R` is a ring, then `s` is an additive subgroup.  AType u_1)
      (QIdeal B : IdealIdeal.{u} (R : Type u) [Semiring R] : Type uA (left) ideal in a semiring `R` is an additive submonoid `s` such that
    `a * b ∈ s` whenever `b ∈ s`. If `R` is a ring, then `s` is an additive subgroup.  BType u_2) [QIdeal B.IsPrimeIdeal.IsPrime.{u} {α : Type u} [Semiring α] (I : Ideal α) : PropAn ideal `P` of a ring `R` is prime if `P ≠ R` and `xy ∈ P → x ∈ P ∨ y ∈ P` ] [QIdeal B.LiesOverIdeal.LiesOver.{u_2, u_3} {A : Type u_2} [CommSemiring A] {B : Type u_3} [Semiring B] [Algebra A B] (P : Ideal B)
      (p : Ideal A) : Prop`P` lies over `p` if `p` is the preimage of `P` by the `algebraMap`.  PIdeal A]
      (KType u_4 : Type u_4A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (LType u_5 : Type u_5A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  KType u_4]
      [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5]
      [IsScalarTowerIsScalarTower.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M N] [SMul N α] [SMul M α] : PropAn instance of `IsScalarTower M N α` states that the multiplicative
    action of `M` on `α` is determined by the multiplicative actions of `M` on `N`
    and `N` on `α`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     KType u_4 LType u_5]
      [IsScalarTowerIsScalarTower.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M N] [SMul N α] [SMul M α] : PropAn instance of `IsScalarTower M N α` states that the multiplicative
    action of `M` on `α` is determined by the multiplicative actions of `M` on `N`
    and `N` on `α`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4 LType u_5]
      [Algebra.IsInvariantAlgebra.IsInvariant.{u_1, u_2, u_3} (A : Type u_1) (B : Type u_2) (G : Type u_3) [CommSemiring A] [Semiring B]
      [Algebra A B] [Group G] [MulSemiringAction G B] : PropAn action of a group `G` on an extension of rings `B/A` is invariant if every fixed point of
    `B` lies in the image of `A`. The converse statement that every point in the image of `A` is fixed
    by `G` is `smul_algebraMap` (assuming `SMulCommClass A B G`).  AType u_1 BType u_2 GType u_3]
      [IsFractionRingIsFractionRing.{u_6, u_7} (R : Type u_6) [CommSemiring R] (K : Type u_7) [CommSemiring K] [Algebra R K] : Prop`IsFractionRing R K` states `K` is the ring of fractions of a commutative ring `R`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    AType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     PIdeal A)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     KType u_4]
      [IsFractionRingIsFractionRing.{u_6, u_7} (R : Type u_6) [CommSemiring R] (K : Type u_7) [CommSemiring K] [Algebra R K] : Prop`IsFractionRing R K` states `K` is the ring of fractions of a commutative ring `R`.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    BType u_2 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     QIdeal B)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     LType u_5] :
      Function.SurjectiveFunction.Surjective.{u_1, u_2} {α : Sort u_1} {β : Sort u_2} (f : α → β) : PropA function `f : α → β` is called surjective if every `b : β` is equal to `f a`
    for some `a : α`. 
        (IsFractionRing.stabilizerHomIsFractionRing.stabilizerHom.{u_1, u_2, u_3, u_4, u_5} {A : Type u_1} {B : Type u_2} [CommRing A] [CommRing B]
      [Algebra A B] (G : Type u_3) [Group G] [MulSemiringAction G B] [SMulCommClass G A B] (P : Ideal A) (Q : Ideal B)
      [Q.LiesOver P] (K : Type u_4) (L : Type u_5) [Field K] [Field L] [Algebra (A ⧸ P) K] [Algebra (B ⧸ Q) L]
      [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L] [Algebra K L] [IsScalarTower (A ⧸ P) K L]
      [IsFractionRing (A ⧸ P) K] [IsFractionRing (B ⧸ Q) L] : ↥(MulAction.stabilizer G Q) →* Gal(L/K)If `Q` lies over `P`, then the stabilizer of `Q` acts on `Frac(B/Q)/Frac(A/P)`.  GType u_3 PIdeal A QIdeal B KType u_4
            LType u_5)
    The stabilizer subgroup of `Q` surjects onto `Aut(Frac(B/Q)/Frac(A/P))`. 
    complete

The goal of this mini-project is to get this theorem formalised and ideally into mathlib.

In particular, \Aut(L/K) is finite as a corollary. What is so striking about this theorem to me is that the only finiteness hypothesis is on the group G which acts; there are no finiteness or Noetherian hypotheses on the rings at all.

8.4. Examples🔗

As a trivial consequence we get Frobenius elements for finite Galois extensions in both the local and global field setting, as \Aut(L/K) is just a Galois group of finite fields in these cases, so by surjectivity we can lift a Frobenius element.

Even though G is finite, it is possible in characteristic p > 0 for the extension L/K to be infinite (and mostly inseparable). The theorem implies that \Aut(L/K) is always finite; what is actually happening is that L/K is algebraic and normal, and its maximal separable subextension is finite of degree at most |G|. However, we can prove surjectivity directly without reference to this maximal separable subextension.

8.5. The Extension B/A🔗

The precise set-up we'll work in is the following. We fix G a finite group acting on B a commutative ring, and we have another commutative ring A such that B is an A-algebra and the image of A in B is precisely the G-invariant elements of B. We do not ever need the map A \to B to be injective so we do not assume this.

We start with a construction which is fundamental to everything, and which explains why we need G to be finite.

Definition8.3
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Lemma 8.4
Blueprint label
  • «MulSemiringAction.monic_charpoly»
Uses target in
  • statement

If b \in B then define the characteristic polynomial F_b(X) \in B[X] of b to be \prod_{g \in G}(X - g \cdot b).

Code for Definition8.31 definition
  • def MulSemiringAction.charpoly.{u_2, u_3} {BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3] [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2] [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  GType u_3] (bB : BType u_2) :
      PolynomialPolynomial.{u_1} (R : Type u_1) [Semiring R] : Type u_1`Polynomial R` is the type of univariate polynomials over `R`,
    denoted as `R[X]` within the `Polynomial` namespace.
    
    Polynomials should be seen as (semi-)rings with the additional constructor `X`.
    The embedding from `R` is called `C`.  BType u_2
    def MulSemiringAction.charpoly.{u_2, u_3}
      {BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3]
      [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2] [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  GType u_3]
      (bB : BType u_2) : PolynomialPolynomial.{u_1} (R : Type u_1) [Semiring R] : Type u_1`Polynomial R` is the type of univariate polynomials over `R`,
    denoted as `R[X]` within the `Polynomial` namespace.
    
    Polynomials should be seen as (semi-)rings with the additional constructor `X`.
    The embedding from `R` is called `C`.  BType u_2
    Characteristic polynomial of a finite group action on a ring. 
    complete

Clearly F_b is a monic polynomial.

Lemma8.4
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
L∃∀Nused by 1

Definition 8.3 F_b is monic.

Code for Lemma8.41 theorem
  • theorem MulSemiringAction.monic_charpoly.{u_2, u_3} {BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3] [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2]
      [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  GType u_3] (bB : BType u_2) : (MulSemiringAction.charpolyMulSemiringAction.charpoly.{u_2, u_3} {B : Type u_2} (G : Type u_3) [CommRing B] [Group G] [MulSemiringAction G B]
      [Fintype G] (b : B) : Polynomial BCharacteristic polynomial of a finite group action on a ring.  GType u_3 bB).MonicPolynomial.Monic.{u} {R : Type u} [Semiring R] (p : Polynomial R) : Propa polynomial is `Monic` if its leading coefficient is 1 
    theorem MulSemiringAction.monic_charpoly.{u_2,
        u_3}
      {BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3]
      [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2] [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  GType u_3]
      (bB : BType u_2) :
      (MulSemiringAction.charpolyMulSemiringAction.charpoly.{u_2, u_3} {B : Type u_2} (G : Type u_3) [CommRing B] [Group G] [MulSemiringAction G B]
      [Fintype G] (b : B) : Polynomial BCharacteristic polynomial of a finite group action on a ring.  GType u_3 bB).MonicPolynomial.Monic.{u} {R : Type u} [Semiring R] (p : Polynomial R) : Propa polynomial is `Monic` if its leading coefficient is 1 
    complete
Proof

Obvious.

It is also clear that F_b has degree |G| and has b as a root. Also F_b is G-invariant, because acting by some \gamma \in G just permutes the order of the factors. Hence we can descend F_b to a monic polynomial M_b(X) of degree |G| in A[X]. We will also refer to M_b as the characteristic polynomial of b, even though it is not even well-defined if the map A \to B is not injective.

Lemma8.5
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Theorem 8.6
Blueprint label
  • «Algebra.IsInvariant.isIntegral»
Uses target in
  • proof

Definition 8.3 F_b is the lift of some monic polynomial M_b in A[X].

Code for Lemma8.51 theorem
  • theorem Algebra.IsInvariant.charpoly_mem_lifts.{u_1, u_2, u_3} (AType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      (BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  AType u_1] [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     AType u_1 BType u_2]
      [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3] [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2] [Algebra.IsInvariantAlgebra.IsInvariant.{u_1, u_2, u_3} (A : Type u_1) (B : Type u_2) (G : Type u_3) [CommSemiring A] [Semiring B]
      [Algebra A B] [Group G] [MulSemiringAction G B] : PropAn action of a group `G` on an extension of rings `B/A` is invariant if every fixed point of
    `B` lies in the image of `A`. The converse statement that every point in the image of `A` is fixed
    by `G` is `smul_algebraMap` (assuming `SMulCommClass A B G`).  AType u_1 BType u_2 GType u_3]
      [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  GType u_3] (bB : BType u_2) :
      MulSemiringAction.charpolyMulSemiringAction.charpoly.{u_2, u_3} {B : Type u_2} (G : Type u_3) [CommRing B] [Group G] [MulSemiringAction G B]
      [Fintype G] (b : B) : Polynomial BCharacteristic polynomial of a finite group action on a ring.  GType u_3 bB Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Polynomial.liftsPolynomial.lifts.{u, v} {R : Type u} [Semiring R] {S : Type v} [Semiring S] (f : R →+* S) : Subsemiring (Polynomial S)We define the subsemiring of polynomials that lifts as the image of `RingHom.of (map f)`.  (algebraMapalgebraMap.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] [Algebra R A] : R →+* AEmbedding `R →+* A` given by `Algebra` structure.  AType u_1 BType u_2)
    theorem Algebra.IsInvariant.charpoly_mem_lifts.{u_1,
        u_2, u_3}
      (AType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  AType u_1] [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     AType u_1 BType u_2] [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3]
      [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2]
      [Algebra.IsInvariantAlgebra.IsInvariant.{u_1, u_2, u_3} (A : Type u_1) (B : Type u_2) (G : Type u_3) [CommSemiring A] [Semiring B]
      [Algebra A B] [Group G] [MulSemiringAction G B] : PropAn action of a group `G` on an extension of rings `B/A` is invariant if every fixed point of
    `B` lies in the image of `A`. The converse statement that every point in the image of `A` is fixed
    by `G` is `smul_algebraMap` (assuming `SMulCommClass A B G`).  AType u_1 BType u_2 GType u_3] [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  GType u_3]
      (bB : BType u_2) :
      MulSemiringAction.charpolyMulSemiringAction.charpoly.{u_2, u_3} {B : Type u_2} (G : Type u_3) [CommRing B] [Group G] [MulSemiringAction G B]
      [Fintype G] (b : B) : Polynomial BCharacteristic polynomial of a finite group action on a ring.  GType u_3 bB Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`.
        Polynomial.liftsPolynomial.lifts.{u, v} {R : Type u} [Semiring R] {S : Type v} [Semiring S] (f : R →+* S) : Subsemiring (Polynomial S)We define the subsemiring of polynomials that lifts as the image of `RingHom.of (map f)`.  (algebraMapalgebraMap.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] [Algebra R A] : R →+* AEmbedding `R →+* A` given by `Algebra` structure.  AType u_1 BType u_2)
    complete
Proof

The coefficients of F_b are G-invariant, and thus lie in the image of A.

Theorem8.6
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
L∃∀Nused by 1

B/A is integral.

Code for Theorem8.61 theorem
  • theorem Algebra.IsInvariant.isIntegral.{u_1, u_2, u_3} (AType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      (BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  AType u_1] [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     AType u_1 BType u_2]
      [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3] [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2] [Algebra.IsInvariantAlgebra.IsInvariant.{u_1, u_2, u_3} (A : Type u_1) (B : Type u_2) (G : Type u_3) [CommSemiring A] [Semiring B]
      [Algebra A B] [Group G] [MulSemiringAction G B] : PropAn action of a group `G` on an extension of rings `B/A` is invariant if every fixed point of
    `B` lies in the image of `A`. The converse statement that every point in the image of `A` is fixed
    by `G` is `smul_algebraMap` (assuming `SMulCommClass A B G`).  AType u_1 BType u_2 GType u_3]
      [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_3] : Algebra.IsIntegralAlgebra.IsIntegral.{u_1, u_3} (R : Type u_1) (A : Type u_3) [CommRing R] [Ring A] [Algebra R A] : PropAn algebra is integral if every element of the extension is integral over the base ring.  AType u_1 BType u_2
    theorem Algebra.IsInvariant.isIntegral.{u_1, u_2,
        u_3}
      (AType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (BType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      (GType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  AType u_1] [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  BType u_2]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     AType u_1 BType u_2] [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_3]
      [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_3 BType u_2]
      [Algebra.IsInvariantAlgebra.IsInvariant.{u_1, u_2, u_3} (A : Type u_1) (B : Type u_2) (G : Type u_3) [CommSemiring A] [Semiring B]
      [Algebra A B] [Group G] [MulSemiringAction G B] : PropAn action of a group `G` on an extension of rings `B/A` is invariant if every fixed point of
    `B` lies in the image of `A`. The converse statement that every point in the image of `A` is fixed
    by `G` is `smul_algebraMap` (assuming `SMulCommClass A B G`).  AType u_1 BType u_2 GType u_3] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_3] :
      Algebra.IsIntegralAlgebra.IsIntegral.{u_1, u_3} (R : Type u_1) (A : Type u_3) [CommRing R] [Ring A] [Algebra R A] : PropAn algebra is integral if every element of the extension is integral over the base ring.  AType u_1 BType u_2
    complete
Proof

Lemma 8.4 Lemma 8.5 Use M_b.

If Q and Q' are two primes above p then there is some g \in G such that gQ = Q', and one can deduce from this that Frob_Q and Frob_{Q'} are conjugate. In particular if G is abelian then Frob_Q and Frob_{Q'} are equal, so we can call them both Frob_p.

8.6. The Extension (B/Q)/(A/P)🔗

Note that P and Q are primes, so the quotients A/P and B/Q are integral domains.

The following technical lemma constructs an element of B with nice characteristic polynomial modulo Q.

Lemma8.7
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
XL∃∀N
Used by 2
Hover a use site to preview it.
Preview
Lemma 8.8
Blueprint label
  • fixed_of_fixed1_aux2
Uses target in
  • proof

There exist elements a,b \in B, with a \notin Q and a in the image of A, such that for all g \in G:

  • If g \cdot Q = Q, then g \cdot b \equiv a \pmod{Q}.

  • If g \cdot Q \neq Q, then g \cdot b \equiv 0 \pmod{Q}.

Proof

Lemma 8.5 The ideals g \cdot Q \neq Q are not contained in Q. Since Q is a prime ideal, this implies that the intersection of all g \cdot Q \neq Q is still not contained in Q. Then we can find an element c \notin Q with c \in g \cdot Q for all g \cdot Q \neq Q. Let F_c be the characteristic polynomial of c, and write F_c(X) \equiv X^j R(X) \pmod{Q}. Let a be the coefficient of X^j in F_c(X), and choose R(X) so that R(0) = a. Let b = R(0) - R(c). Note that F_c(c) = 0 and c \not\equiv 0 \pmod{Q}, so R(c) \equiv 0 \pmod{Q}. Then b \equiv a \pmod{Q}, so g \cdot b \equiv a \pmod{Q} whenever g \cdot Q = Q. But if g \cdot Q \neq Q, then c \equiv 0 \pmod{g \cdot Q}. Then b \equiv 0 \pmod{g \cdot Q}, so g \cdot b \equiv 0 \pmod{Q} whenever g \cdot Q \neq Q.

A slight modification allows us to take an element of B fixed by D_Q as input.

Lemma8.8
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
XL∃∀Nused by 1

Let b_0 \in B. Suppose that the image of b_0 in the quotient B/Q is fixed by the stabilizer subgroup D_Q. Then there exist elements a,b \in B, with a \notin Q and a in the image of A, such that for all g \in G:

  • If g \cdot Q = Q, then g \cdot b \equiv a b_0 \pmod{Q}.

  • If g \cdot Q \neq Q, then g \cdot b \equiv 0 \pmod{Q}.

Proof

Lemma 8.7 Multiply the b from fixed_of_fixed1_aux1 by b_0.

8.7. The Extension L/K🔗

Let L^{D_Q} denote the fixed field of the action D_Q on L. Our strategy for proving surjectivity of D_Q \to \Aut(L/K) will be to write this map as the composition D_Q \to \Aut(L/L^{D_Q}) \to \Aut(L/K).

The surjectivity of the first map is a general fact of Galois theory.

Theorem8.9
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
L∃∀Nused by 1

If a finite group H acts on a field F by field automorphisms, then the map H \to \Aut(F/F^H) is surjective.

Code for Theorem8.91 theorem
  • theorem FixedPoints.toAlgAut_surjective.{u_2, u_3} (GType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (FType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_2] [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  FType u_3] [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_2 FType u_3] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_2] :
      Function.SurjectiveFunction.Surjective.{u_1, u_2} {α : Sort u_1} {β : Sort u_2} (f : α → β) : PropA function `f : α → β` is called surjective if every `b : β` is equal to `f a`
    for some `a : α`. 
        (MulSemiringAction.toAlgAutMulSemiringAction.toAlgAut.{u_2, u_3, u_4} (G : Type u_2) (R : Type u_3) (A : Type u_4) [CommSemiring R] [Semiring A]
      [Algebra R A] [Group G] [MulSemiringAction G A] [SMulCommClass G R A] : G →* A ≃ₐ[R] AEach element of the group defines an algebra equivalence.
    
    This is a stronger version of `MulSemiringAction.toRingAut` and
    `DistribMulAction.toModuleEnd`.  GType u_2 (↥(FixedPoints.subfieldFixedPoints.subfield.{u, v} (M : Type u) [Monoid M] (F : Type v) [Field F] [MulSemiringAction M F] : Subfield FThe subfield of fixed points by a monoid action.  GType u_2 FType u_3)) FType u_3)
    theorem FixedPoints.toAlgAut_surjective.{u_2, u_3}
      (GType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (FType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_2]
      [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  FType u_3] [MulSemiringActionMulSemiringAction.{u, v} (M : Type u) (R : Type v) [Monoid M] [Semiring R] : Type (max u v)Typeclass for multiplicative actions by monoids on semirings.
    
    This combines `DistribMulAction` with `MulDistribMulAction`: it expresses
    the interplay between the action and both addition and multiplication on the target.
    Two key axioms are `g • (x + y) = (g • x) + (g • y)` and `g • (x * y) = (g • x) * (g • y)`.
    
    A typical use case is the action of a Galois group $Gal(L/K)$ on the field `L`.
     GType u_2 FType u_3]
      [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_2] :
      Function.SurjectiveFunction.Surjective.{u_1, u_2} {α : Sort u_1} {β : Sort u_2} (f : α → β) : PropA function `f : α → β` is called surjective if every `b : β` is equal to `f a`
    for some `a : α`. 
        (MulSemiringAction.toAlgAutMulSemiringAction.toAlgAut.{u_2, u_3, u_4} (G : Type u_2) (R : Type u_3) (A : Type u_4) [CommSemiring R] [Semiring A]
      [Algebra R A] [Group G] [MulSemiringAction G A] [SMulCommClass G R A] : G →* A ≃ₐ[R] AEach element of the group defines an algebra equivalence.
    
    This is a stronger version of `MulSemiringAction.toRingAut` and
    `DistribMulAction.toModuleEnd`.  GType u_2
            (↥(FixedPoints.subfieldFixedPoints.subfield.{u, v} (M : Type u) [Monoid M] (F : Type v) [Field F] [MulSemiringAction M F] : Subfield FThe subfield of fixed points by a monoid action.  GType u_2 FType u_3)) FType u_3)
    `MulSemiringAction.toAlgAut` is surjective. 
    complete
Proof

This is a general fact of Galois theory and was already in mathlib.

For surjectivity of the second map, we need to know that every element of L^{D_Q} is fixed by \Aut(L/K). We first show this for elements of B/Q fixed by D_Q.

Theorem8.10
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
XL∃∀Nused by 1

Definition 8.1 Let b_0 \in B/Q. Suppose that b_0 is fixed by the stabilizer subgroup D_Q. Then b_0 is fixed by \Aut(L/K).

Proof

Lemma 8.7 Lemma 8.8 Let a,b \in B be elements from fixed_of_fixed1_aux2. Let M_b \in A[X] be the characteristic polynomial of b. We can map M_b to L[X] in two different ways: via B[X] and via K[X]. Going via B[X] tells us that the image of M_b(X) in L[X] is exactly (X - a b_0)^{|D_Q|} X^{|G|-|D_Q|}. But going via K[X] tells us that this image lies in K[X], so we must have a b_0 \in K. Then a b_0 is fixed by \Aut(L/K), and a is nonzero in L (since a \notin Q), so b_0 is fixed by \Aut(L/K).

Now we upgrade this to elements of L fixed by D_Q. The following lemma will allow us to lift the denominator from B/Q to A/P.

Lemma8.11
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
L∃∀Nused by 1

If R/S is an algebraic extension of integral domains, then any fraction a/b with a,b \in R can be written as c/d with c \in R and d \in S.

Code for Lemma8.111 theorem
  • theorem IsAlgebraic.exists_smul_eq_mul.{u_1, u_2} {RType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } {SType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  RType u_1] [RingRing.{u} (R : Type u) : Type uA `Ring` is a `Semiring` with negation making it an additive group.  SType u_2] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     RType u_1 SType u_2] (aS : SType u_2) {bS : SType u_2}
      (hRbIsAlgebraic R b : IsAlgebraicIsAlgebraic.{u, v} (R : Type u) {A : Type v} [CommRing R] [Ring A] [Algebra R A] (x : A) : PropAn element of an R-algebra is algebraic over R if it is a root of a nonzero polynomial
    with coefficients in R.  RType u_1 bS) (hbb ∈ nonZeroDivisors S : bS Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. nonZeroDivisorsnonZeroDivisors.{u_1} (M₀ : Type u_1) [MonoidWithZero M₀] : Submonoid M₀The submonoid of non-zero-divisors of a `MonoidWithZero` `M₀`.  SType u_2) :
       cS dR, dR Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`,
    and asserts that `a` and `b` are not equal.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≠` in identifiers is `ne`. 0 And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
    
     * The recommended spelling of `/\` in identifiers is `and` (prefer `∧` over `/\`). dR HSMul.hSMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSMul α β γ] : α → β → γ`a • b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent, but it is intended to be used for left actions. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `•` in identifiers is `smul`. aS =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. bS *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. cS
    theorem IsAlgebraic.exists_smul_eq_mul.{u_1, u_2}
      {RType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } {SType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  RType u_1] [RingRing.{u} (R : Type u) : Type uA `Ring` is a `Semiring` with negation making it an additive group.  SType u_2] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     RType u_1 SType u_2]
      (aS : SType u_2) {bS : SType u_2} (hRbIsAlgebraic R b : IsAlgebraicIsAlgebraic.{u, v} (R : Type u) {A : Type v} [CommRing R] [Ring A] [Algebra R A] (x : A) : PropAn element of an R-algebra is algebraic over R if it is a root of a nonzero polynomial
    with coefficients in R.  RType u_1 bS)
      (hbb ∈ nonZeroDivisors S : bS Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. nonZeroDivisorsnonZeroDivisors.{u_1} (M₀ : Type u_1) [MonoidWithZero M₀] : Submonoid M₀The submonoid of non-zero-divisors of a `MonoidWithZero` `M₀`.  SType u_2) :
       cS dR, dR Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`,
    and asserts that `a` and `b` are not equal.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≠` in identifiers is `ne`. 0 And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
    
     * The recommended spelling of `/\` in identifiers is `and` (prefer `∧` over `/\`). dR HSMul.hSMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSMul α β γ] : α → β → γ`a • b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent, but it is intended to be used for left actions. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `•` in identifiers is `smul`. aS =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. bS *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. cS
    A fraction `(a : S) / (b : S)` can be reduced to `(c : S) / (d : R)`,
    if `b` is algebraic over `R`. 
    complete
Proof

If f \in S[X] satisfies f(b) = 0, then f(0) \in S is a multiple of b. If f(0)=bx \in S, then a/b=(ax)/(bx) as desired.

Theorem8.12
Group: This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used. (11)
Hover another entry in this group to preview it.
Preview
Definition 8.1
Blueprint label
  • «IsFractionRing.stabilizerHom»
Group
  • This miniproject has been a success: the main results are sorry-free and merged into mathlib. As a result there will be no more work on this miniproject in the FLT repo. Below is a fairly detailed sketch of the argument used.
XL∃∀Nused by 1

Let x \in L. Suppose that x is fixed by the stabilizer subgroup D_Q. Then x is fixed by the automorphism group \Aut(L/K).

Proof

Theorem 8.6 Lemma 8.11 Theorem 8.10 Since (B/Q)/(A/P) is algebraic by Algebra.IsInvariant.isIntegral, IsAlgebraic.exists_smul_eq_mul lets us write x=b/a for b \in B/Q and a \in A/P. Then b is fixed by the stabilizer subgroup D_Q, and it suffices to show that b is fixed by the automorphism group \Aut(L/K). But this is exactly fixed_of_fixed1.

Combining this with FixedPoints.toAlgAut_surjective finishes the proof.

Proof

Theorem 8.12 Theorem 8.9 The map D_Q \to \Aut(L/L^{D_Q}) is surjective by FixedPoints.toAlgAut_surjective. For surjectivity of \Aut(L/L^{D_Q}) \to \Aut(L/K), let \sigma be a field automorphism of L fixing K pointwise. We must show that \sigma automatically fixes L^{D_Q} pointwise. But this is exactly fixed_of_fixed2. Thus, the composition D_Q \to \Aut(L/L^{D_Q}) \to \Aut(L/K) is surjective.