File: Mathlib/FieldTheory/KummerExtension.lean

full_name: root_X_pow_sub_C_pow
code: lemma root_X_pow_sub_C_pow (n : ℕ) (a : K) :
    (AdjoinRoot.root (X ^ n - C a)) ^ n = AdjoinRoot.of _ a 
goal: AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a) ^ n = (AdjoinRoot.of (Polynomial.X ^ n - Polynomial.C a)) a

full_name: root_X_pow_sub_C_ne_zero
code: lemma root_X_pow_sub_C_ne_zero {n : ℕ} (hn : 1 < n) (a : K) :
    (AdjoinRoot.root (X ^ n - C a)) ≠ 0 
goal: AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a) ≠ 0

full_name: root_X_pow_sub_C_ne_zero'
code: lemma root_X_pow_sub_C_ne_zero' {n : ℕ} {a : K} (hn : 0 < n) (ha : a ≠ 0) :
    (AdjoinRoot.root (X ^ n - C a)) ≠ 0 
goal: AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a) ≠ 0

full_name: X_pow_sub_C_splits_of_isPrimitiveRoot
code: theorem X_pow_sub_C_splits_of_isPrimitiveRoot
    {n : ℕ} {ζ : K} (hζ : IsPrimitiveRoot ζ n) {α a : K} (e : α ^ n = a) :
    (X ^ n - C a).Splits (RingHom.id _) 
goal: Polynomial.Splits (RingHom.id K) (Polynomial.X ^ n - Polynomial.C a)

full_name: _private.Mathlib.FieldTheory.KummerExtension.0.X_pow_sub_C_eq_prod'
code: private
theorem X_pow_sub_C_eq_prod'
    {n : ℕ} {ζ : K} (hζ : IsPrimitiveRoot ζ n) {α a : K} (hn : 0 < n) (e : α ^ n = a) :
    (X ^ n - C a) = ∏ i ∈ Finset.range n, (X - C (ζ ^ i * α)) 
goal: Polynomial.X ^ n - Polynomial.C a = ∏ i ∈ Finset.range n, (Polynomial.X - Polynomial.C (ζ ^ i * α))

full_name: X_pow_sub_C_eq_prod
code: lemma X_pow_sub_C_eq_prod {R : Type*} [CommRing R] [IsDomain R]
    {n : ℕ} {ζ : R} (hζ : IsPrimitiveRoot ζ n) {α a : R} (hn : 0 < n) (e : α ^ n = a) :
    (X ^ n - C a) = ∏ i ∈ Finset.range n, (X - C (ζ ^ i * α)) 
goal: Polynomial.X ^ n - Polynomial.C a = ∏ i ∈ Finset.range n, (Polynomial.X - Polynomial.C (ζ ^ i * α))

full_name: ne_zero_of_irreducible_X_pow_sub_C
code: lemma ne_zero_of_irreducible_X_pow_sub_C {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
    n ≠ 0 
goal: n ≠ 0

full_name: ne_zero_of_irreducible_X_pow_sub_C'
code: lemma ne_zero_of_irreducible_X_pow_sub_C' {n : ℕ} (hn : n ≠ 1) {a : K}
    (H : Irreducible (X ^ n - C a)) : a ≠ 0 
goal: a ≠ 0

full_name: root_X_pow_sub_C_eq_zero_iff
code: lemma root_X_pow_sub_C_eq_zero_iff {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
    (AdjoinRoot.root (X ^ n - C a)) = 0 ↔ a = 0 
goal: AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a) = 0 ↔ a = 0

full_name: root_X_pow_sub_C_ne_zero_iff
code: lemma root_X_pow_sub_C_ne_zero_iff {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
    (AdjoinRoot.root (X ^ n - C a)) ≠ 0 ↔ a ≠ 0 
goal: AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a) ≠ 0 ↔ a ≠ 0

full_name: pow_ne_of_irreducible_X_pow_sub_C
code: theorem pow_ne_of_irreducible_X_pow_sub_C {n : ℕ} {a : K}
    (H : Irreducible (X ^ n - C a)) {m : ℕ} (hm : m ∣ n) (hm' : m ≠ 1) (b : K) : b ^ m ≠ a 
goal: b ^ m ≠ a

full_name: X_pow_sub_C_irreducible_of_prime
code: theorem X_pow_sub_C_irreducible_of_prime {p : ℕ} (hp : p.Prime) {a : K} (ha : ∀ b : K, b ^ p ≠ a) :
    Irreducible (X ^ p - C a) 
goal: Irreducible (Polynomial.X ^ p - Polynomial.C a)

full_name: X_pow_sub_C_irreducible_iff_of_prime
code: theorem X_pow_sub_C_irreducible_iff_of_prime {p : ℕ} (hp : p.Prime) {a : K} :
    Irreducible (X ^ p - C a) ↔ ∀ b, b ^ p ≠ a 
goal: Irreducible (Polynomial.X ^ p - Polynomial.C a) ↔ ∀ (b : K), b ^ p ≠ a

full_name: X_pow_mul_sub_C_irreducible
code: theorem X_pow_mul_sub_C_irreducible
    {n m : ℕ} {a : K} (hm : Irreducible (X ^ m - C a))
    (hn : ∀ (E : Type u) [Field E] [Algebra K E] (x : E) (hx : minpoly K x = X ^ m - C a),
      Irreducible (X ^ n - C (AdjoinSimple.gen K x))) :
    Irreducible (X ^ (n * m) - C a) 
goal: Irreducible (Polynomial.X ^ (n * m) - Polynomial.C a)

full_name: X_pow_sub_C_irreducible_of_odd
code: theorem X_pow_sub_C_irreducible_of_odd
    {n : ℕ} (hn : Odd n) {a : K} (ha : ∀ p : ℕ, p.Prime → p ∣ n → ∀ b : K, b ^ p ≠ a) :
    Irreducible (X ^ n - C a) 
goal: Irreducible (Polynomial.X ^ n - Polynomial.C a)

full_name: X_pow_sub_C_irreducible_iff_forall_prime_of_odd
code: theorem X_pow_sub_C_irreducible_iff_forall_prime_of_odd {n : ℕ} (hn : Odd n) {a : K} :
    Irreducible (X ^ n - C a) ↔ (∀ p : ℕ, p.Prime → p ∣ n → ∀ b : K, b ^ p ≠ a) 
goal: Irreducible (Polynomial.X ^ n - Polynomial.C a) ↔ ∀ (p : ℕ), Nat.Prime p → p ∣ n → ∀ (b : K), b ^ p ≠ a

full_name: X_pow_sub_C_irreducible_iff_of_odd
code: theorem X_pow_sub_C_irreducible_iff_of_odd {n : ℕ} (hn : Odd n) {a : K} :
    Irreducible (X ^ n - C a) ↔ (∀ d, d ∣ n → d ≠ 1 → ∀ b : K, b ^ d ≠ a) 
goal: Irreducible (Polynomial.X ^ n - Polynomial.C a) ↔ ∀ (d : ℕ), d ∣ n → d ≠ 1 → ∀ (b : K), b ^ d ≠ a

full_name: X_pow_sub_C_irreducible_of_prime_pow
code: theorem X_pow_sub_C_irreducible_of_prime_pow
    {p : ℕ} (hp : p.Prime) (hp' : p ≠ 2) (n : ℕ) {a : K} (ha : ∀ b : K, b ^ p ≠ a) :
    Irreducible (X ^ (p ^ n) - C a) 
goal: Irreducible (Polynomial.X ^ p ^ n - Polynomial.C a)

full_name: X_pow_sub_C_irreducible_iff_of_prime_pow
code: theorem X_pow_sub_C_irreducible_iff_of_prime_pow
    {p : ℕ} (hp : p.Prime) (hp' : p ≠ 2) {n} (hn : n ≠ 0) {a : K} :
    Irreducible (X ^ p ^ n - C a) ↔ ∀ b, b ^ p ≠ a 
goal: Irreducible (Polynomial.X ^ p ^ n - Polynomial.C a) ↔ ∀ (b : K), b ^ p ≠ a

full_name: KummerExtension.«_aux_Mathlib_FieldTheory_KummerExtension___macroRules_KummerExtension_termK[_√_]_1»
code: scoped[KummerExtension] notation3 "K[" n "√" a "]" => AdjoinRoot (Polynomial.X ^ n - Polynomial.C a)
goal: Lean.Macro

full_name: Polynomial.separable_X_pow_sub_C_of_irreducible
code: /-- Also see `Polynomial.separable_X_pow_sub_C_unit` -/
theorem Polynomial.separable_X_pow_sub_C_of_irreducible : (X ^ n - C a).Separable 
goal: (Polynomial.X ^ n - Polynomial.C a).Separable

full_name: autAdjoinRootXPowSubCHom
code: /-- The natural embedding of the roots of unity of `K` into `Gal(K[ⁿ√a]/K)`, by sending
`η ↦ (ⁿ√a ↦ η • ⁿ√a)`. Also see `autAdjoinRootXPowSubC` for the `AlgEquiv` version. -/
noncomputable
def autAdjoinRootXPowSubCHom :
    rootsOfUnity ⟨n, hn⟩ K →* (K[n√a] →ₐ[K] K[n√a]) 
goal: ↥(rootsOfUnity ⟨n, hn⟩ K) →* K[n√a] →ₐ[K] K[n√a]

full_name: autAdjoinRootXPowSubC
code: /-- The natural embedding of the roots of unity of `K` into `Gal(K[ⁿ√a]/K)`, by sending
`η ↦ (ⁿ√a ↦ η • ⁿ√a)`. This is an isomorphism when `K` contains a primitive root of unity.
See `autAdjoinRootXPowSubCEquiv`. -/
noncomputable
def autAdjoinRootXPowSubC :
    rootsOfUnity ⟨n, hn⟩ K →* (K[n√a] ≃ₐ[K] K[n√a]) 
goal: ↥(rootsOfUnity ⟨n, hn⟩ K) →* K[n√a] ≃ₐ[K] K[n√a]

full_name: autAdjoinRootXPowSubC_root
code: lemma autAdjoinRootXPowSubC_root (η) :
    autAdjoinRootXPowSubC hn a η (root _) = ((η : Kˣ) : K) • root _ 
goal: ((autAdjoinRootXPowSubC hn a) η) (AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a)) =
  ↑↑η • AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a)

full_name: AdjoinRootXPowSubCEquivToRootsOfUnity
code: /-- The inverse function of `autAdjoinRootXPowSubC` if `K` has all roots of unity.
See `autAdjoinRootXPowSubCEquiv`. -/
noncomputable
def AdjoinRootXPowSubCEquivToRootsOfUnity (σ : K[n√a] ≃ₐ[K] K[n√a]) :
    rootsOfUnity ⟨n, hn⟩ K 
goal: ↥(rootsOfUnity ⟨n, hn⟩ K)

full_name: autAdjoinRootXPowSubCEquiv
code: /-- The equivalence between the roots of unity of `K` and `Gal(K[ⁿ√a]/K)`. -/
noncomputable
def autAdjoinRootXPowSubCEquiv :
    rootsOfUnity ⟨n, hn⟩ K ≃* (K[n√a] ≃ₐ[K] K[n√a]) 
goal: ↥(rootsOfUnity ⟨n, hn⟩ K) ≃* K[n√a] ≃ₐ[K] K[n√a]

full_name: autAdjoinRootXPowSubCEquiv_root
code: lemma autAdjoinRootXPowSubCEquiv_root (η) :
    autAdjoinRootXPowSubCEquiv hζ hn H η (root _) = ((η : Kˣ) : K) • root _ 
goal: ((autAdjoinRootXPowSubCEquiv hζ hn H) η) (AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a)) =
  ↑↑η • AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a)

full_name: autAdjoinRootXPowSubCEquiv_symm_smul
code: lemma autAdjoinRootXPowSubCEquiv_symm_smul (σ) :
    ((autAdjoinRootXPowSubCEquiv hζ hn H).symm σ : Kˣ) • (root _ : K[n√a]) = σ (root _) 
goal: ↑((autAdjoinRootXPowSubCEquiv hζ hn H).symm σ) • AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a) =
  σ (AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a))

full_name: isSplittingField_AdjoinRoot_X_pow_sub_C
code: lemma isSplittingField_AdjoinRoot_X_pow_sub_C :
    haveI := Fact.mk H
    letI : Algebra K K[n√a] := inferInstance
    IsSplittingField K K[n√a] (X ^ n - C a) 
goal: Polynomial.IsSplittingField K K[n√a] (Polynomial.X ^ n - Polynomial.C a)

full_name: adjoinRootXPowSubCEquiv
code: /-- Suppose `L/K` is the splitting field of `Xⁿ - a`, then a choice of `ⁿ√a` gives an equivalence of
`L` with `K[n√a]`. -/
noncomputable
def adjoinRootXPowSubCEquiv :
    K[n√a] ≃ₐ[K] L 
goal: K[n√a] ≃ₐ[K] L

full_name: adjoinRootXPowSubCEquiv_root
code: lemma adjoinRootXPowSubCEquiv_root :
    adjoinRootXPowSubCEquiv hζ H hα (root _) = α 
goal: (adjoinRootXPowSubCEquiv hζ H hα) (AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a)) = α

full_name: adjoinRootXPowSubCEquiv_symm_eq_root
code: lemma adjoinRootXPowSubCEquiv_symm_eq_root :
    (adjoinRootXPowSubCEquiv hζ H hα).symm α = root _ 
goal: (adjoinRootXPowSubCEquiv hζ H hα).symm α = AdjoinRoot.root (Polynomial.X ^ n - Polynomial.C a)

full_name: Algebra.adjoin_root_eq_top_of_isSplittingField
code: lemma Algebra.adjoin_root_eq_top_of_isSplittingField :
    Algebra.adjoin K {α} = ⊤ 
goal: Algebra.adjoin K {α} = ⊤

full_name: IntermediateField.adjoin_root_eq_top_of_isSplittingField
code: lemma IntermediateField.adjoin_root_eq_top_of_isSplittingField :
    K⟮α⟯ = ⊤ 
goal: K⟮α⟯ = ⊤

full_name: rootOfSplitsXPowSubC
code: /-- An arbitrary choice of `ⁿ√a` in the splitting field of `Xⁿ - a`. -/
noncomputable
abbrev rootOfSplitsXPowSubC : L 
goal: L

full_name: rootOfSplitsXPowSubC_pow
code: lemma rootOfSplitsXPowSubC_pow :
    (rootOfSplitsXPowSubC hn a L) ^ n = algebraMap K L a 
goal: rootOfSplitsXPowSubC hn a L ^ n = (algebraMap K L) a

full_name: autEquivRootsOfUnity
code: /-- Suppose `L/K` is the splitting field of `Xⁿ - a`, then `Gal(L/K)` is isomorphic to the
roots of unity in `K` if `K` contains all of them.
Note that this does not depend on a choice of `ⁿ√a`. -/
noncomputable
def autEquivRootsOfUnity :
    (L ≃ₐ[K] L) ≃* (rootsOfUnity ⟨n, hn⟩ K) 
goal: (L ≃ₐ[K] L) ≃* ↥(rootsOfUnity ⟨n, hn⟩ K)

full_name: autEquivRootsOfUnity_apply_rootOfSplit
code: lemma autEquivRootsOfUnity_apply_rootOfSplit (σ : L ≃ₐ[K] L) :
    σ (rootOfSplitsXPowSubC hn a L) =
      autEquivRootsOfUnity hζ hn H L σ • (rootOfSplitsXPowSubC hn a L) 
goal: σ (rootOfSplitsXPowSubC hn a L) = (autEquivRootsOfUnity hζ hn H L) σ • rootOfSplitsXPowSubC hn a L

full_name: autEquivRootsOfUnity_smul
code: lemma autEquivRootsOfUnity_smul (σ : L ≃ₐ[K] L) :
    autEquivRootsOfUnity hζ hn H L σ • α = σ α 
goal: (autEquivRootsOfUnity hζ hn H L) σ • α = σ α

full_name: autEquivZmod
code: /-- Suppose `L/K` is the splitting field of `Xⁿ - a`, and `ζ` is a `n`-th primitive root of unity
in `K`, then `Gal(L/K)` is isomorphic to `ZMod n`. -/
noncomputable
def autEquivZmod {ζ : K} (hζ : IsPrimitiveRoot ζ n) :
    (L ≃ₐ[K] L) ≃* Multiplicative (ZMod n) 
goal: (L ≃ₐ[K] L) ≃* Multiplicative (ZMod n)

full_name: autEquivZmod_symm_apply_intCast
code: lemma autEquivZmod_symm_apply_intCast {ζ : K} (hζ : IsPrimitiveRoot ζ n) (m : ℤ) :
    (autEquivZmod H L hζ).symm (Multiplicative.ofAdd (m : ZMod n)) α = ζ ^ m • α 
goal: ((autEquivZmod H L hζ).symm (Multiplicative.ofAdd ↑m)) α = ζ ^ m • α

full_name: autEquivZmod_symm_apply_natCast
code: lemma autEquivZmod_symm_apply_natCast {ζ : K} (hζ : IsPrimitiveRoot ζ n) (m : ℕ) :
    (autEquivZmod H L hζ).symm (Multiplicative.ofAdd (m : ZMod n)) α = ζ ^ m • α 
goal: ((autEquivZmod H L hζ).symm (Multiplicative.ofAdd ↑m)) α = ζ ^ m • α

full_name: isCyclic_of_isSplittingField_X_pow_sub_C
code: lemma isCyclic_of_isSplittingField_X_pow_sub_C : IsCyclic (L ≃ₐ[K] L) 
goal: IsCyclic (L ≃ₐ[K] L)

full_name: isGalois_of_isSplittingField_X_pow_sub_C
code: lemma isGalois_of_isSplittingField_X_pow_sub_C : IsGalois K L 
goal: IsGalois K L

full_name: finrank_of_isSplittingField_X_pow_sub_C
code: lemma finrank_of_isSplittingField_X_pow_sub_C : FiniteDimensional.finrank K L = n 
goal: FiniteDimensional.finrank K L = n

full_name: exists_root_adjoin_eq_top_of_isCyclic
code: /-- If `L/K` is a cyclic extension of degree `n`, and `K` contains all `n`-th roots of unity,
then `L = K[α]` for some `α ^ n ∈ K`. -/
lemma exists_root_adjoin_eq_top_of_isCyclic :
    ∃ (α : L), α ^ (finrank K L) ∈ Set.range (algebraMap K L) ∧ K⟮α⟯ = ⊤ 
goal: ∃ α, α ^ FiniteDimensional.finrank K L ∈ Set.range ⇑(algebraMap K L) ∧ K⟮α⟯ = ⊤

full_name: irreducible_X_pow_sub_C_of_root_adjoin_eq_top
code: lemma irreducible_X_pow_sub_C_of_root_adjoin_eq_top
    {a : K} {α : L} (ha : α ^ (finrank K L) = algebraMap K L a) (hα : K⟮α⟯ = ⊤) :
    Irreducible (X ^ (finrank K L) - C a) 
goal: Irreducible (Polynomial.X ^ FiniteDimensional.finrank K L - Polynomial.C a)

full_name: isSplittingField_X_pow_sub_C_of_root_adjoin_eq_top
code: lemma isSplittingField_X_pow_sub_C_of_root_adjoin_eq_top
    {a : K} {α : L} (ha : α ^ (finrank K L) = algebraMap K L a) (hα : K⟮α⟯ = ⊤) :
    IsSplittingField K L (X ^ (finrank K L) - C a) 
goal: Polynomial.IsSplittingField K L (Polynomial.X ^ FiniteDimensional.finrank K L - Polynomial.C a)

full_name: isCyclic_tfae
code: /--
Suppose `L/K` is a finite extension of dimension `n`, and `K` contains all `n`-th roots of unity.
Then `L/K` is cyclic iff
`L` is a splitting field of some irreducible polynomial of the form `Xⁿ - a : K[X]` iff
`L = K[α]` for some `αⁿ ∈ K`.
-/
lemma isCyclic_tfae (K L) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L]
    (hK : (primitiveRoots (FiniteDimensional.finrank K L) K).Nonempty) :
    List.TFAE [
      IsGalois K L ∧ IsCyclic (L ≃ₐ[K] L),
      ∃ a : K, Irreducible (X ^ (finrank K L) - C a) ∧
        IsSplittingField K L (X ^ (finrank K L) - C a),
      ∃ (α : L), α ^ (finrank K L) ∈ Set.range (algebraMap K L) ∧ K⟮α⟯ = ⊤] 
goal: [IsGalois K L ∧ IsCyclic (L ≃ₐ[K] L),
    ∃ a,
      Irreducible (Polynomial.X ^ FiniteDimensional.finrank K L - Polynomial.C a) ∧
        Polynomial.IsSplittingField K L (Polynomial.X ^ FiniteDimensional.finrank K L - Polynomial.C a),
    ∃ α, α ^ FiniteDimensional.finrank K L ∈ Set.range ⇑(algebraMap K L) ∧ K⟮α⟯ = ⊤].TFAE