Kronecker-Weber, wild step for odd : an abelian field of degree unramified outside lies in
OpenNumberField.exists_algHom_cyclotomicField_prime_pow_of_isUnramifiedIn_of_ne_twoLet be an odd prime and let be a finite abelian extension of of degree . Assume that each prime is unramified in . The statement asserts that there is and an embedding of fields
Proof idea. The key fact is that for odd there is exactly one cyclic extension of of degree that is unramified outside , namely the subfield of degree of . It follows that the Galois group of has at most one subgroup of index , so it is cyclic. Let be the subfield of degree of with . The compositum is abelian of -power degree and unramified outside , so its Galois group is cyclic by the same argument; it has the two quotients of order that correspond to and , hence .
Use. With the tame step (NumberField.exists_isUnramifiedIn_le_sup_of_prime_ne) this gives the Kronecker-Weber theorem for abelian fields of odd prime-power degree. This is a child of Leopoldt.exists_algHom_cyclotomicField_of_isCyclic_primePow.
Formalization Note. "Abelian" is IsAbelianGalois ℚ K; " unramified in " is Algebra.IsUnramifiedIn (𝓞 K) (Ideal.span {(ℓ : ℤ)}); the conclusion is Nonempty (K →ₐ[ℚ] CyclotomicField (p ^ N) ℚ). For take . The hypothesis is necessary for the uniqueness argument: there are three quadratic fields unramified outside . Mathlib has ZMod.isCyclic_units_of_prime_pow, IsCyclotomicExtension.Rat.galEquivZMod, Minkowski's theorem (NumberField.exists_not_isUnramifiedIn) and Kummer theory (Mathlib.FieldTheory.KummerExtension). The uniqueness of the cyclic degree field unramified outside is the hard part and is not in Mathlib.
import Mathlib open NumberField
theorem NumberField.exists_algHom_cyclotomicField_prime_pow_of_isUnramifiedIn_of_ne_two
(K : Type*) [Field K] [NumberField K] [IsAbelianGalois ℚ K] (p k : ℕ) (hp : p.Prime)
(hp2 : p ≠ 2) (hK : Module.finrank ℚ K = p ^ k)
(hunr : ∀ ℓ : ℕ, ℓ.Prime → ℓ ≠ p → Algebra.IsUnramifiedIn (𝓞 K) (Ideal.span {(ℓ : ℤ)})) :
∃ N : ℕ, Nonempty (K →ₐ[ℚ] CyclotomicField (p ^ N) ℚ) := by sorry