number_theory.number_field.basic
⟷
Mathlib.NumberTheory.NumberField.Basic
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -174,7 +174,7 @@ instance : Free ℤ (𝓞 K) :=
IsIntegralClosure.module_free ℤ ℚ K (𝓞 K)
instance : IsLocalization (Algebra.algebraMapSubmonoid (𝓞 K) ℤ⁰) K :=
- IsIntegralClosure.isLocalization ℤ ℚ K (𝓞 K)
+ IsIntegralClosure.isLocalization_of_isSeparable ℤ ℚ K (𝓞 K)
#print NumberField.RingOfIntegers.basis /-
/-- A ℤ-basis of the ring of integers of `K`. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -65,7 +65,7 @@ attribute [instance] NumberField.to_charZero NumberField.to_finiteDimensional
#print NumberField.isAlgebraic /-
protected theorem isAlgebraic : Algebra.IsAlgebraic ℚ K :=
- Algebra.isAlgebraic_of_finite _ _
+ Algebra.IsAlgebraic.of_finite _ _
#align number_field.is_algebraic NumberField.isAlgebraic
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,8 +3,8 @@ Copyright (c) 2021 Ashvni Narayanan. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Ashvni Narayanan, Anne Baanen
-/
-import Mathbin.Algebra.CharP.Algebra
-import Mathbin.RingTheory.DedekindDomain.IntegralClosure
+import Algebra.CharP.Algebra
+import RingTheory.DedekindDomain.IntegralClosure
#align_import number_theory.number_field.basic from "leanprover-community/mathlib"@"1b089e3bdc3ce6b39cd472543474a0a137128c6c"
mathlib commit https://github.com/leanprover-community/mathlib/commit/48a058d7e39a80ed56858505719a0b2197900999
@@ -95,13 +95,13 @@ theorem isIntegral_of_mem_ringOfIntegers {K : Type _} [Field K] {x : K} (hx : x
#align number_field.is_integral_of_mem_ring_of_integers NumberField.isIntegral_of_mem_ringOfIntegers
-/
-#print NumberField.ringOfIntegersAlgebra /-
+#print NumberField.inst_ringOfIntegersAlgebra /-
/-- Given an algebra between two fields, create an algebra between their two rings of integers.
For now, this is not an instance by default as it creates an equal-but-not-defeq diamond with
`algebra.id` when `K = L`. This is caused by `x = ⟨x, x.prop⟩` not being defeq on subtypes. This
will likely change in Lean 4. -/
-def ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
+def inst_ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
RingHom.toAlgebra
{ toFun := fun k => ⟨algebraMap K L k, IsIntegral.algebraMap k.2⟩
map_zero' := Subtype.ext <| by simp only [Subtype.coe_mk, Subalgebra.coe_zero, map_zero]
@@ -110,7 +110,7 @@ def ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
Subtype.ext <| by simp only [map_add, Subalgebra.coe_add, Subtype.coe_mk]
map_mul' := fun x y =>
Subtype.ext <| by simp only [Subalgebra.coe_mul, map_mul, Subtype.coe_mk] }
-#align number_field.ring_of_integers_algebra NumberField.ringOfIntegersAlgebra
+#align number_field.ring_of_integers_algebra NumberField.inst_ringOfIntegersAlgebra
-/
namespace RingOfIntegers
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,15 +2,12 @@
Copyright (c) 2021 Ashvni Narayanan. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Ashvni Narayanan, Anne Baanen
-
-! This file was ported from Lean 3 source module number_theory.number_field.basic
-! leanprover-community/mathlib commit 1b089e3bdc3ce6b39cd472543474a0a137128c6c
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.CharP.Algebra
import Mathbin.RingTheory.DedekindDomain.IntegralClosure
+#align_import number_theory.number_field.basic from "leanprover-community/mathlib"@"1b089e3bdc3ce6b39cd472543474a0a137128c6c"
+
/-!
# Number fields
mathlib commit https://github.com/leanprover-community/mathlib/commit/d30d31261cdb4d2f5e612eabc3c4bf45556350d5
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Ashvni Narayanan, Anne Baanen
! This file was ported from Lean 3 source module number_theory.number_field.basic
-! leanprover-community/mathlib commit f0c8bf9245297a541f468be517f1bde6195105e9
+! leanprover-community/mathlib commit 1b089e3bdc3ce6b39cd472543474a0a137128c6c
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -13,6 +13,9 @@ import Mathbin.RingTheory.DedekindDomain.IntegralClosure
/-!
# Number fields
+
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
This file defines a number field and the ring of integers corresponding to it.
## Main definitions
mathlib commit https://github.com/leanprover-community/mathlib/commit/f2ad3645af9effcdb587637dc28a6074edc813f9
@@ -35,22 +35,26 @@ number field, ring of integers
-/
+#print NumberField /-
/-- A number field is a field which has characteristic zero and is finite
dimensional over ℚ. -/
class NumberField (K : Type _) [Field K] : Prop where
[to_charZero : CharZero K]
[to_finiteDimensional : FiniteDimensional ℚ K]
#align number_field NumberField
+-/
open Function Module
open scoped Classical BigOperators nonZeroDivisors
+#print Int.not_isField /-
/-- `ℤ` with its usual ring structure is not a field. -/
theorem Int.not_isField : ¬IsField ℤ := fun h =>
Int.not_even_one <|
(h.mul_inv_cancel two_ne_zero).imp fun a => by rw [← two_mul] <;> exact Eq.symm
#align int.not_is_field Int.not_isField
+-/
namespace NumberField
@@ -59,22 +63,29 @@ variable (K L : Type _) [Field K] [Field L] [nf : NumberField K]
-- See note [lower instance priority]
attribute [instance] NumberField.to_charZero NumberField.to_finiteDimensional
+#print NumberField.isAlgebraic /-
protected theorem isAlgebraic : Algebra.IsAlgebraic ℚ K :=
Algebra.isAlgebraic_of_finite _ _
#align number_field.is_algebraic NumberField.isAlgebraic
+-/
+#print NumberField.ringOfIntegers /-
/-- The ring of integers (or number ring) corresponding to a number field
is the integral closure of ℤ in the number field. -/
def ringOfIntegers :=
integralClosure ℤ K
#align number_field.ring_of_integers NumberField.ringOfIntegers
+-/
scoped notation "𝓞" => NumberField.ringOfIntegers
+#print NumberField.mem_ringOfIntegers /-
theorem mem_ringOfIntegers (x : K) : x ∈ 𝓞 K ↔ IsIntegral ℤ x :=
Iff.rfl
#align number_field.mem_ring_of_integers NumberField.mem_ringOfIntegers
+-/
+#print NumberField.isIntegral_of_mem_ringOfIntegers /-
theorem isIntegral_of_mem_ringOfIntegers {K : Type _} [Field K] {x : K} (hx : x ∈ 𝓞 K) :
IsIntegral ℤ (⟨x, hx⟩ : 𝓞 K) := by
obtain ⟨P, hPm, hP⟩ := hx
@@ -82,7 +93,9 @@ theorem isIntegral_of_mem_ringOfIntegers {K : Type _} [Field K] {x : K} (hx : x
rw [← Polynomial.aeval_def, ← Subalgebra.coe_eq_zero, Polynomial.aeval_subalgebra_coe,
Polynomial.aeval_def, Subtype.coe_mk, hP]
#align number_field.is_integral_of_mem_ring_of_integers NumberField.isIntegral_of_mem_ringOfIntegers
+-/
+#print NumberField.ringOfIntegersAlgebra /-
/-- Given an algebra between two fields, create an algebra between their two rings of integers.
For now, this is not an instance by default as it creates an equal-but-not-defeq diamond with
@@ -98,6 +111,7 @@ def ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
map_mul' := fun x y =>
Subtype.ext <| by simp only [Subalgebra.coe_mul, map_mul, Subtype.coe_mk] }
#align number_field.ring_of_integers_algebra NumberField.ringOfIntegersAlgebra
+-/
namespace RingOfIntegers
@@ -112,20 +126,26 @@ instance : IsIntegralClosure (𝓞 K) ℤ K :=
instance [NumberField K] : IsIntegrallyClosed (𝓞 K) :=
integralClosure.isIntegrallyClosedOfFiniteExtension ℚ
+#print NumberField.RingOfIntegers.isIntegral_coe /-
theorem isIntegral_coe (x : 𝓞 K) : IsIntegral ℤ (x : K) :=
x.2
-#align number_field.ring_of_integers.is_integral_coe NumberField.ringOfIntegers.isIntegral_coe
+#align number_field.ring_of_integers.is_integral_coe NumberField.RingOfIntegers.isIntegral_coe
+-/
+#print NumberField.RingOfIntegers.map_mem /-
theorem map_mem {F L : Type _} [Field L] [CharZero K] [CharZero L] [AlgHomClass F ℚ K L] (f : F)
(x : 𝓞 K) : f x ∈ 𝓞 L :=
- (mem_ringOfIntegers _ _).2 <| map_isIntegral_int f <| ringOfIntegers.isIntegral_coe x
-#align number_field.ring_of_integers.map_mem NumberField.ringOfIntegers.map_mem
+ (mem_ringOfIntegers _ _).2 <| map_isIntegral_int f <| RingOfIntegers.isIntegral_coe x
+#align number_field.ring_of_integers.map_mem NumberField.RingOfIntegers.map_mem
+-/
+#print NumberField.RingOfIntegers.equiv /-
/-- The ring of integers of `K` are equivalent to any integral closure of `ℤ` in `K` -/
protected noncomputable def equiv (R : Type _) [CommRing R] [Algebra R K]
[IsIntegralClosure R ℤ K] : 𝓞 K ≃+* R :=
(IsIntegralClosure.equiv ℤ R K _).symm.toRingEquiv
-#align number_field.ring_of_integers.equiv NumberField.ringOfIntegers.equiv
+#align number_field.ring_of_integers.equiv NumberField.RingOfIntegers.equiv
+-/
variable (K)
@@ -135,6 +155,7 @@ instance : CharZero (𝓞 K) :=
instance : IsNoetherian ℤ (𝓞 K) :=
IsIntegralClosure.isNoetherian _ ℚ K _
+#print NumberField.RingOfIntegers.not_isField /-
/-- The ring of integers of a number field is not a field. -/
theorem not_isField : ¬IsField (𝓞 K) :=
by
@@ -143,7 +164,8 @@ theorem not_isField : ¬IsField (𝓞 K) :=
intro hf
exact
Int.not_isField (((IsIntegralClosure.isIntegral_algebra ℤ K).isField_iff_isField h_inj).mpr hf)
-#align number_field.ring_of_integers.not_is_field NumberField.ringOfIntegers.not_isField
+#align number_field.ring_of_integers.not_is_field NumberField.RingOfIntegers.not_isField
+-/
instance : IsDedekindDomain (𝓞 K) :=
IsIntegralClosure.isDedekindDomain ℤ ℚ K _
@@ -154,27 +176,35 @@ instance : Free ℤ (𝓞 K) :=
instance : IsLocalization (Algebra.algebraMapSubmonoid (𝓞 K) ℤ⁰) K :=
IsIntegralClosure.isLocalization ℤ ℚ K (𝓞 K)
+#print NumberField.RingOfIntegers.basis /-
/-- A ℤ-basis of the ring of integers of `K`. -/
noncomputable def basis : Basis (Free.ChooseBasisIndex ℤ (𝓞 K)) ℤ (𝓞 K) :=
Free.chooseBasis ℤ (𝓞 K)
-#align number_field.ring_of_integers.basis NumberField.ringOfIntegers.basis
+#align number_field.ring_of_integers.basis NumberField.RingOfIntegers.basis
+-/
end RingOfIntegers
+#print NumberField.integralBasis /-
/-- A basis of `K` over `ℚ` that is also a basis of `𝓞 K` over `ℤ`. -/
noncomputable def integralBasis : Basis (Free.ChooseBasisIndex ℤ (𝓞 K)) ℚ K :=
- Basis.localizationLocalization ℚ (nonZeroDivisors ℤ) K (ringOfIntegers.basis K)
+ Basis.localizationLocalization ℚ (nonZeroDivisors ℤ) K (RingOfIntegers.basis K)
#align number_field.integral_basis NumberField.integralBasis
+-/
+#print NumberField.integralBasis_apply /-
@[simp]
theorem integralBasis_apply (i : Free.ChooseBasisIndex ℤ (𝓞 K)) :
- integralBasis K i = algebraMap (𝓞 K) K (ringOfIntegers.basis K i) :=
- Basis.localizationLocalization_apply ℚ (nonZeroDivisors ℤ) K (ringOfIntegers.basis K) i
+ integralBasis K i = algebraMap (𝓞 K) K (RingOfIntegers.basis K i) :=
+ Basis.localizationLocalization_apply ℚ (nonZeroDivisors ℤ) K (RingOfIntegers.basis K) i
#align number_field.integral_basis_apply NumberField.integralBasis_apply
+-/
-theorem ringOfIntegers.rank : FiniteDimensional.finrank ℤ (𝓞 K) = FiniteDimensional.finrank ℚ K :=
+#print NumberField.RingOfIntegers.rank /-
+theorem RingOfIntegers.rank : FiniteDimensional.finrank ℤ (𝓞 K) = FiniteDimensional.finrank ℚ K :=
IsIntegralClosure.rank ℤ ℚ K (𝓞 K)
-#align number_field.ring_of_integers.rank NumberField.ringOfIntegers.rank
+#align number_field.ring_of_integers.rank NumberField.RingOfIntegers.rank
+-/
end NumberField
@@ -182,6 +212,7 @@ namespace Rat
open NumberField
+#print Rat.numberField /-
instance numberField : NumberField ℚ
where
to_charZero := inferInstance
@@ -191,11 +222,14 @@ instance numberField : NumberField ℚ
-- Show that these coincide:
by convert (inferInstance : FiniteDimensional ℚ ℚ)
#align rat.number_field Rat.numberField
+-/
+#print Rat.ringOfIntegersEquiv /-
/-- The ring of integers of `ℚ` as a number field is just `ℤ`. -/
noncomputable def ringOfIntegersEquiv : ringOfIntegers ℚ ≃+* ℤ :=
- ringOfIntegers.equiv ℤ
+ RingOfIntegers.equiv ℤ
#align rat.ring_of_integers_equiv Rat.ringOfIntegersEquiv
+-/
end Rat
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -56,8 +56,6 @@ namespace NumberField
variable (K L : Type _) [Field K] [Field L] [nf : NumberField K]
-include nf
-
-- See note [lower instance priority]
attribute [instance] NumberField.to_charZero NumberField.to_finiteDimensional
@@ -65,15 +63,12 @@ protected theorem isAlgebraic : Algebra.IsAlgebraic ℚ K :=
Algebra.isAlgebraic_of_finite _ _
#align number_field.is_algebraic NumberField.isAlgebraic
-omit nf
-
/-- The ring of integers (or number ring) corresponding to a number field
is the integral closure of ℤ in the number field. -/
def ringOfIntegers :=
integralClosure ℤ K
#align number_field.ring_of_integers NumberField.ringOfIntegers
--- mathport name: ring_of_integers
scoped notation "𝓞" => NumberField.ringOfIntegers
theorem mem_ringOfIntegers (x : K) : x ∈ 𝓞 K ↔ IsIntegral ℤ x :=
@@ -134,8 +129,6 @@ protected noncomputable def equiv (R : Type _) [CommRing R] [Algebra R K]
variable (K)
-include nf
-
instance : CharZero (𝓞 K) :=
CharZero.of_module _ K
@@ -168,8 +161,6 @@ noncomputable def basis : Basis (Free.ChooseBasisIndex ℤ (𝓞 K)) ℤ (𝓞 K
end RingOfIntegers
-include nf
-
/-- A basis of `K` over `ℚ` that is also a basis of `𝓞 K` over `ℤ`. -/
noncomputable def integralBasis : Basis (Free.ChooseBasisIndex ℤ (𝓞 K)) ℚ K :=
Basis.localizationLocalization ℚ (nonZeroDivisors ℤ) K (ringOfIntegers.basis K)
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -198,7 +198,7 @@ instance numberField : NumberField ℚ
-- all fields are vector spaces over themselves (used in `rat.finite_dimensional`)
-- all char 0 fields have a canonical embedding of `ℚ` (used in `number_field`).
-- Show that these coincide:
- by convert(inferInstance : FiniteDimensional ℚ ℚ)
+ by convert (inferInstance : FiniteDimensional ℚ ℚ)
#align rat.number_field Rat.numberField
/-- The ring of integers of `ℚ` as a number field is just `ℤ`. -/
@@ -221,7 +221,7 @@ is a number field. -/
instance {f : ℚ[X]} [hf : Fact (Irreducible f)] : NumberField (AdjoinRoot f)
where
to_charZero := charZero_of_injective_algebraMap (algebraMap ℚ _).Injective
- to_finiteDimensional := by convert(AdjoinRoot.powerBasis hf.out.ne_zero).FiniteDimensional
+ to_finiteDimensional := by convert (AdjoinRoot.powerBasis hf.out.ne_zero).FiniteDimensional
end
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -44,7 +44,7 @@ class NumberField (K : Type _) [Field K] : Prop where
open Function Module
-open Classical BigOperators nonZeroDivisors
+open scoped Classical BigOperators nonZeroDivisors
/-- `ℤ` with its usual ring structure is not a field. -/
theorem Int.not_isField : ¬IsField ℤ := fun h =>
@@ -212,7 +212,7 @@ namespace AdjoinRoot
section
-open Polynomial
+open scoped Polynomial
attribute [-instance] algebraRat
mathlib commit https://github.com/leanprover-community/mathlib/commit/738054fa93d43512da144ec45ce799d18fd44248
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Ashvni Narayanan, Anne Baanen
! This file was ported from Lean 3 source module number_theory.number_field.basic
-! leanprover-community/mathlib commit 641b6a82006416ec431b2987b354af9311fed4f2
+! leanprover-community/mathlib commit f0c8bf9245297a541f468be517f1bde6195105e9
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -198,7 +198,7 @@ instance numberField : NumberField ℚ
-- all fields are vector spaces over themselves (used in `rat.finite_dimensional`)
-- all char 0 fields have a canonical embedding of `ℚ` (used in `number_field`).
-- Show that these coincide:
- by convert (inferInstance : FiniteDimensional ℚ ℚ)
+ by convert(inferInstance : FiniteDimensional ℚ ℚ)
#align rat.number_field Rat.numberField
/-- The ring of integers of `ℚ` as a number field is just `ℤ`. -/
@@ -221,7 +221,7 @@ is a number field. -/
instance {f : ℚ[X]} [hf : Fact (Irreducible f)] : NumberField (AdjoinRoot f)
where
to_charZero := charZero_of_injective_algebraMap (algebraMap ℚ _).Injective
- to_finiteDimensional := by convert (AdjoinRoot.powerBasis hf.out.ne_zero).FiniteDimensional
+ to_finiteDimensional := by convert(AdjoinRoot.powerBasis hf.out.ne_zero).FiniteDimensional
end
mathlib commit https://github.com/leanprover-community/mathlib/commit/641b6a82006416ec431b2987b354af9311fed4f2
@@ -4,12 +4,12 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Ashvni Narayanan, Anne Baanen
! This file was ported from Lean 3 source module number_theory.number_field.basic
-! leanprover-community/mathlib commit 297610838471f6ea3368bf26d2642e63a159fbcf
+! leanprover-community/mathlib commit 641b6a82006416ec431b2987b354af9311fed4f2
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
-import Mathbin.RingTheory.DedekindDomain.IntegralClosure
import Mathbin.Algebra.CharP.Algebra
+import Mathbin.RingTheory.DedekindDomain.IntegralClosure
/-!
# Number fields
@@ -42,9 +42,9 @@ class NumberField (K : Type _) [Field K] : Prop where
[to_finiteDimensional : FiniteDimensional ℚ K]
#align number_field NumberField
-open Function
+open Function Module
-open Classical BigOperators
+open Classical BigOperators nonZeroDivisors
/-- `ℤ` with its usual ring structure is not a field. -/
theorem Int.not_isField : ¬IsField ℤ := fun h =>
@@ -134,14 +134,16 @@ protected noncomputable def equiv (R : Type _) [CommRing R] [Algebra R K]
variable (K)
-instance [NumberField K] : CharZero (𝓞 K) :=
+include nf
+
+instance : CharZero (𝓞 K) :=
CharZero.of_module _ K
-instance [NumberField K] : IsNoetherian ℤ (𝓞 K) :=
+instance : IsNoetherian ℤ (𝓞 K) :=
IsIntegralClosure.isNoetherian _ ℚ K _
/-- The ring of integers of a number field is not a field. -/
-theorem not_isField [NumberField K] : ¬IsField (𝓞 K) :=
+theorem not_isField : ¬IsField (𝓞 K) :=
by
have h_inj : Function.Injective ⇑(algebraMap ℤ (𝓞 K)) :=
RingHom.injective_int (algebraMap ℤ (𝓞 K))
@@ -150,11 +152,39 @@ theorem not_isField [NumberField K] : ¬IsField (𝓞 K) :=
Int.not_isField (((IsIntegralClosure.isIntegral_algebra ℤ K).isField_iff_isField h_inj).mpr hf)
#align number_field.ring_of_integers.not_is_field NumberField.ringOfIntegers.not_isField
-instance [NumberField K] : IsDedekindDomain (𝓞 K) :=
+instance : IsDedekindDomain (𝓞 K) :=
IsIntegralClosure.isDedekindDomain ℤ ℚ K _
+instance : Free ℤ (𝓞 K) :=
+ IsIntegralClosure.module_free ℤ ℚ K (𝓞 K)
+
+instance : IsLocalization (Algebra.algebraMapSubmonoid (𝓞 K) ℤ⁰) K :=
+ IsIntegralClosure.isLocalization ℤ ℚ K (𝓞 K)
+
+/-- A ℤ-basis of the ring of integers of `K`. -/
+noncomputable def basis : Basis (Free.ChooseBasisIndex ℤ (𝓞 K)) ℤ (𝓞 K) :=
+ Free.chooseBasis ℤ (𝓞 K)
+#align number_field.ring_of_integers.basis NumberField.ringOfIntegers.basis
+
end RingOfIntegers
+include nf
+
+/-- A basis of `K` over `ℚ` that is also a basis of `𝓞 K` over `ℤ`. -/
+noncomputable def integralBasis : Basis (Free.ChooseBasisIndex ℤ (𝓞 K)) ℚ K :=
+ Basis.localizationLocalization ℚ (nonZeroDivisors ℤ) K (ringOfIntegers.basis K)
+#align number_field.integral_basis NumberField.integralBasis
+
+@[simp]
+theorem integralBasis_apply (i : Free.ChooseBasisIndex ℤ (𝓞 K)) :
+ integralBasis K i = algebraMap (𝓞 K) K (ringOfIntegers.basis K i) :=
+ Basis.localizationLocalization_apply ℚ (nonZeroDivisors ℤ) K (ringOfIntegers.basis K) i
+#align number_field.integral_basis_apply NumberField.integralBasis_apply
+
+theorem ringOfIntegers.rank : FiniteDimensional.finrank ℤ (𝓞 K) = FiniteDimensional.finrank ℚ K :=
+ IsIntegralClosure.rank ℤ ℚ K (𝓞 K)
+#align number_field.ring_of_integers.rank NumberField.ringOfIntegers.rank
+
end NumberField
namespace Rat
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
Currently, we have multiple "no-diamond" tests of the form
example : x = y := rfl
where X
and Y
are instances of some class
. The problem is that since simp
and type class synthesis operate at reducible_and_instances
transparency this check means little.
We went through all the mentions of diamonds and either added with_reducible_and_instancse
or added a reference to the issue #10906.
Co-authored-by: Kevin Buzzard <k.buzzard@imperial.ac.uk>
@@ -95,7 +95,7 @@ instance inst_ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
Subtype.ext <| by simp only [Subalgebra.coe_mul, map_mul, Subtype.coe_mk] }
#align number_field.ring_of_integers_algebra NumberField.inst_ringOfIntegersAlgebra
--- no diamond
+-- diamond at `reducible_and_instances` #10906
example : Algebra.id (𝓞 K) = inst_ringOfIntegersAlgebra K K := rfl
namespace RingOfIntegers
Prove that each class of the classgroup of a number field contains an integral ideal of small norm.
@@ -170,6 +170,11 @@ theorem integralBasis_apply (i : Free.ChooseBasisIndex ℤ (𝓞 K)) :
Basis.localizationLocalization_apply ℚ (nonZeroDivisors ℤ) K (RingOfIntegers.basis K) i
#align number_field.integral_basis_apply NumberField.integralBasis_apply
+@[simp]
+theorem integralBasis_repr_apply (x : (𝓞 K)) (i : Free.ChooseBasisIndex ℤ (𝓞 K)):
+ (integralBasis K).repr x i = (algebraMap ℤ ℚ) ((RingOfIntegers.basis K).repr x i) :=
+ Basis.localizationLocalization_repr_algebraMap ℚ (nonZeroDivisors ℤ) K _ x i
+
theorem mem_span_integralBasis {x : K} :
x ∈ Submodule.span ℤ (Set.range (integralBasis K)) ↔ x ∈ 𝓞 K := by
rw [integralBasis, Basis.localizationLocalization_span, Subalgebra.range_isScalarTower_toAlgHom,
The FunLike hierarchy is very big and gets scanned through each time we need a coercion (via the CoeFun
instance). It looks like unbundled inheritance suits Lean 4 better here. The only class that still extends FunLike
is EquivLike
, since that has a custom coe_injective'
field that is easier to implement. All other classes should take FunLike
or EquivLike
as a parameter.
Previously, morphism classes would be Type
-valued and extend FunLike
:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
extends FunLike F A B :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
After this PR, they should be Prop
-valued and take FunLike
as a parameter:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
[FunLike F A B] : Prop :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
(Note that A B
stay marked as outParam
even though they are not purely required to be so due to the FunLike
parameter already filling them in. This is required to see through type synonyms, which is important in the category theory library. Also, I think keeping them as outParam
is slightly faster.)
Similarly, MyEquivClass
should take EquivLike
as a parameter.
As a result, every mention of [MyHomClass F A B]
should become [FunLike F A B] [MyHomClass F A B]
.
While overall this gives some great speedups, there are some cases that are noticeably slower. In particular, a failing application of a lemma such as map_mul
is more expensive. This is due to suboptimal processing of arguments. For example:
variable [FunLike F M N] [Mul M] [Mul N] (f : F) (x : M) (y : M)
theorem map_mul [MulHomClass F M N] : f (x * y) = f x * f y
example [AddHomClass F A B] : f (x * y) = f x * f y := map_mul f _ _
Before this PR, applying map_mul f
gives the goals [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Since M
and N
are out_param
s, [MulHomClass F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found.
After this PR, the goals become [FunLike F ?M ?N] [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Now [FunLike F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found, before trying MulHomClass F M N
which fails. Since the Mul
hierarchy is very big, this can be slow to fail, especially when there is no such Mul
instance.
A long-term but harder to achieve solution would be to specify the order in which instance goals get solved. For example, we'd like to change the arguments to map_mul
to look like [FunLike F M N] [Mul M] [Mul N] [highPriority <| MulHomClass F M N]
because MulHomClass
fails or succeeds much faster than the others.
As a consequence, the simpNF
linter is much slower since by design it tries and fails to apply many map_
lemmas. The same issue occurs a few times in existing calls to simp [map_mul]
, where map_mul
is tried "too soon" and fails. Thanks to the speedup of leanprover/lean4#2478 the impact is very limited, only in files that already were close to the timeout.
simp
not firing sometimesThis affects map_smulₛₗ
and related definitions. For simp
lemmas Lean apparently uses a slightly different mechanism to find instances, so that rw
can find every argument to map_smulₛₗ
successfully but simp
can't: leanprover/lean4#3701.
Especially in the category theory library, we might sometimes have a type A
which is also accessible as a synonym (Bundled A hA).1
. Instance synthesis doesn't always work if we have f : A →* B
but x * y : (Bundled A hA).1
or vice versa. This seems to be mostly fixed by keeping A B
as outParam
s in MulHomClass F A B
. (Presumably because Lean will do a definitional check A =?= (Bundled A hA).1
instead of using the syntax in the discrimination tree.)
The timeouts can be worked around for now by specifying which map_mul
we mean, either as map_mul f
for some explicit f
, or as e.g. MonoidHomClass.map_mul
.
map_smulₛₗ
not firing as simp
lemma can be worked around by going back to the pre-FunLike situation and making LinearMap.map_smulₛₗ
a simp
lemma instead of the generic map_smulₛₗ
. Writing simp [map_smulₛₗ _]
also works.
Co-authored-by: Matthew Ballard <matt@mrb.email> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott@tqft.net> Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
@@ -115,7 +115,8 @@ theorem isIntegral_coe (x : 𝓞 K) : IsIntegral ℤ (x : K) :=
x.2
#align number_field.ring_of_integers.is_integral_coe NumberField.RingOfIntegers.isIntegral_coe
-theorem map_mem {F L : Type*} [Field L] [CharZero K] [CharZero L] [AlgHomClass F ℚ K L] (f : F)
+theorem map_mem {F L : Type*} [Field L] [CharZero K] [CharZero L]
+ [FunLike F K L] [AlgHomClass F ℚ K L] (f : F)
(x : 𝓞 K) : f x ∈ 𝓞 L :=
(mem_ringOfIntegers _ _).2 <| map_isIntegral_int f <| RingOfIntegers.isIntegral_coe x
#align number_field.ring_of_integers.map_mem NumberField.RingOfIntegers.map_mem
@[inherit_doc]
on notations (#9942)
Make all the notations that unambiguously should inherit the docstring of their definition actually inherit it.
Also write a few docstrings by hand. I only wrote the ones I was competent to write and which I was sure of. Some docstrings come from mathlib3 as they were lost during the early port.
This PR is only intended as a first pass There are many more docstrings to add.
@@ -69,7 +69,7 @@ def ringOfIntegers :=
integralClosure ℤ K
#align number_field.ring_of_integers NumberField.ringOfIntegers
-scoped notation "𝓞" => NumberField.ringOfIntegers
+@[inherit_doc] scoped notation "𝓞" => NumberField.ringOfIntegers
theorem mem_ringOfIntegers (x : K) : x ∈ 𝓞 K ↔ IsIntegral ℤ x :=
Iff.rfl
@@ -3,7 +3,7 @@ Copyright (c) 2021 Ashvni Narayanan. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Ashvni Narayanan, Anne Baanen
-/
-import Mathlib.Algebra.CharP.Algebra
+import Mathlib.Data.Int.Parity
import Mathlib.RingTheory.DedekindDomain.IntegralClosure
#align_import number_theory.number_field.basic from "leanprover-community/mathlib"@"f0c8bf9245297a541f468be517f1bde6195105e9"
@@ -60,6 +60,9 @@ protected theorem isAlgebraic : Algebra.IsAlgebraic ℚ K :=
Algebra.IsAlgebraic.of_finite _ _
#align number_field.is_algebraic NumberField.isAlgebraic
+instance [NumberField L] [Algebra K L] : FiniteDimensional K L :=
+ Module.Finite.of_restrictScalars_finite ℚ K L
+
/-- The ring of integers (or number ring) corresponding to a number field
is the integral closure of ℤ in the number field. -/
def ringOfIntegers :=
@@ -146,7 +146,7 @@ instance : Free ℤ (𝓞 K) :=
IsIntegralClosure.module_free ℤ ℚ K (𝓞 K)
instance : IsLocalization (Algebra.algebraMapSubmonoid (𝓞 K) ℤ⁰) K :=
- IsIntegralClosure.isLocalization ℤ ℚ K (𝓞 K)
+ IsIntegralClosure.isLocalization_of_isSeparable ℤ ℚ K (𝓞 K)
/-- A ℤ-basis of the ring of integers of `K`. -/
noncomputable def basis : Basis (Free.ChooseBasisIndex ℤ (𝓞 K)) ℤ (𝓞 K) :=
Initially I just wanted to add more dot notations for IsIntegral and IsAlgebraic (done in #8437); then I noticed near-duplicates
Algebra.isIntegral_of_finite [Field R] [Ring A]
and
RingHom.IsIntegral.of_finite [CommRing R] [CommRing A]
so I went on to generalize the latter to cover the former, and generalized everything in the IntegralClosure file to the noncommutative case whenever possible.
In the process I noticed more golfs, which result in this PR. Most notably, isIntegral_of_mem_of_FG is now proven using Cayley-Hamilton and doesn't depend on the Noetherian case isIntegral_of_noetherian; the latter is now proven using the former. In total the golfs makes mathlib 227 lines leaner (+487 -714).
The main changes are in the single file RingTheory/IntegralClosure:
Change the definition of Algebra.IsIntegral
which makes it unfold to IsIntegral
rather than RingHom.IsIntegralElem
because the former has much more APIs.
Fix lemma names involving is_integral
which are actually about IsIntegralElem
:
RingHom.is_integral_map
→ RingHom.isIntegralElem_map
RingHom.is_integral_of_mem_closure
→ RingHom.IsIntegralElem.of_mem_closure
RingHom.is_integral_zero/one
→ RingHom.isIntegralElem_zero/one
RingHom.is_integral_add/neg/sub/mul/of_mul_unit
→ RingHom.IsIntegralElem.add/neg/sub/mul/of_mul_unit
Add a lemma Algebra.IsIntegral.of_injective
.
Move isIntegral_of_(submodule_)noetherian
down and golf them.
Remove (Algebra.)isIntegral_of_finite
that work only over fields, in favor of the more general (Algebra.)isIntegral.of_finite
.
Merge duplicate lemmas isIntegral_of_isScalarTower
and isIntegral_tower_top_of_isIntegral
into IsIntegral.tower_top
.
Golf IsIntegral.of_mem_of_fg
by first proving IsIntegral.of_finite
using Cayley-Hamilton.
Add a docstring mentioning the Kurosh problem at Algebra.IsIntegral.finite
. The negative solution to the problem means the theorem doesn't generalize to noncommutative algebras.
Golf IsIntegral.tmul
and isField_of_isIntegral_of_isField(')
.
Combine isIntegral_trans_aux
into isIntegral_trans
and golf.
Add Algebra
namespace to isIntegral_sup
.
rename lemmas for dot notation:
RingHom.isIntegral_trans
→ RingHom.IsIntegral.trans
RingHom.isIntegral_quotient/tower_bot/top_of_isIntegral
→ RingHom.IsIntegral.quotient/tower_bot/top
isIntegral_of_mem_closure'
→ IsIntegral.of_mem_closure'
(and the '' version)
isIntegral_of_surjective
→ Algebra.isIntegral_of_surjective
The next changed file is RingTheory/Algebraic:
Rename:
of_larger_base
→ tower_top
(for consistency with IsIntegral
)
Algebra.isAlgebraic_of_finite
→ Algebra.IsAlgebraic.of_finite
Algebra.isAlgebraic_trans
→ Algebra.IsAlgebraic.trans
Add new lemmasAlgebra.IsIntegral.isAlgebraic
, isAlgebraic_algHom_iff
, and Algebra.IsAlgebraic.of_injective
to streamline some proofs.
The generalization from CommRing to Ring requires an additional lemma scaleRoots_eval₂_mul_of_commute
in Polynomial/ScaleRoots.
A lemma Algebra.lmul_injective
is added to Algebra/Bilinear (in order to golf the proof of IsIntegral.of_mem_of_fg
).
In all other files, I merely fix the changed names, or use newly available dot notations.
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -57,7 +57,7 @@ variable (K L : Type*) [Field K] [Field L] [nf : NumberField K]
attribute [instance] NumberField.to_charZero NumberField.to_finiteDimensional
protected theorem isAlgebraic : Algebra.IsAlgebraic ℚ K :=
- Algebra.isAlgebraic_of_finite _ _
+ Algebra.IsAlgebraic.of_finite _ _
#align number_field.is_algebraic NumberField.isAlgebraic
/-- The ring of integers (or number ring) corresponding to a number field
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -34,7 +34,7 @@ number field, ring of integers
/-- A number field is a field which has characteristic zero and is finite
dimensional over ℚ. -/
-class NumberField (K : Type _) [Field K] : Prop where
+class NumberField (K : Type*) [Field K] : Prop where
[to_charZero : CharZero K]
[to_finiteDimensional : FiniteDimensional ℚ K]
#align number_field NumberField
@@ -51,7 +51,7 @@ theorem Int.not_isField : ¬IsField ℤ := fun h =>
namespace NumberField
-variable (K L : Type _) [Field K] [Field L] [nf : NumberField K]
+variable (K L : Type*) [Field K] [Field L] [nf : NumberField K]
-- See note [lower instance priority]
attribute [instance] NumberField.to_charZero NumberField.to_finiteDimensional
@@ -72,7 +72,7 @@ theorem mem_ringOfIntegers (x : K) : x ∈ 𝓞 K ↔ IsIntegral ℤ x :=
Iff.rfl
#align number_field.mem_ring_of_integers NumberField.mem_ringOfIntegers
-theorem isIntegral_of_mem_ringOfIntegers {K : Type _} [Field K] {x : K} (hx : x ∈ 𝓞 K) :
+theorem isIntegral_of_mem_ringOfIntegers {K : Type*} [Field K] {x : K} (hx : x ∈ 𝓞 K) :
IsIntegral ℤ (⟨x, hx⟩ : 𝓞 K) := by
obtain ⟨P, hPm, hP⟩ := hx
refine' ⟨P, hPm, _⟩
@@ -112,13 +112,13 @@ theorem isIntegral_coe (x : 𝓞 K) : IsIntegral ℤ (x : K) :=
x.2
#align number_field.ring_of_integers.is_integral_coe NumberField.RingOfIntegers.isIntegral_coe
-theorem map_mem {F L : Type _} [Field L] [CharZero K] [CharZero L] [AlgHomClass F ℚ K L] (f : F)
+theorem map_mem {F L : Type*} [Field L] [CharZero K] [CharZero L] [AlgHomClass F ℚ K L] (f : F)
(x : 𝓞 K) : f x ∈ 𝓞 L :=
(mem_ringOfIntegers _ _).2 <| map_isIntegral_int f <| RingOfIntegers.isIntegral_coe x
#align number_field.ring_of_integers.map_mem NumberField.RingOfIntegers.map_mem
/-- The ring of integers of `K` are equivalent to any integral closure of `ℤ` in `K` -/
-protected noncomputable def equiv (R : Type _) [CommRing R] [Algebra R K]
+protected noncomputable def equiv (R : Type*) [CommRing R] [Algebra R K]
[IsIntegralClosure R ℤ K] : 𝓞 K ≃+* R :=
(IsIntegralClosure.equiv ℤ R K _).symm.toRingEquiv
#align number_field.ring_of_integers.equiv NumberField.RingOfIntegers.equiv
@@ -80,13 +80,8 @@ theorem isIntegral_of_mem_ringOfIntegers {K : Type _} [Field K] {x : K} (hx : x
Polynomial.aeval_def, Subtype.coe_mk, hP]
#align number_field.is_integral_of_mem_ring_of_integers NumberField.isIntegral_of_mem_ringOfIntegers
-/-- Given an algebra between two fields, create an algebra between their two rings of integers.
-
-For now, this is not an instance by default as it creates an equal-but-not-defeq diamond with
-`Algebra.id` when `K = L`. This is caused by `x = ⟨x, x.prop⟩` not being defeq on subtypes. This
-will likely change in Lean 4. -/
--- Porting note: check if this can be an instance now
-def ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
+/-- Given an algebra between two fields, create an algebra between their two rings of integers. -/
+instance inst_ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
RingHom.toAlgebra
{ toFun := fun k => ⟨algebraMap K L k, IsIntegral.algebraMap k.2⟩
map_zero' := Subtype.ext <| by simp only [Subtype.coe_mk, Subalgebra.coe_zero, map_zero]
@@ -95,7 +90,10 @@ def ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
Subtype.ext <| by simp only [map_add, Subalgebra.coe_add, Subtype.coe_mk]
map_mul' := fun x y =>
Subtype.ext <| by simp only [Subalgebra.coe_mul, map_mul, Subtype.coe_mk] }
-#align number_field.ring_of_integers_algebra NumberField.ringOfIntegersAlgebra
+#align number_field.ring_of_integers_algebra NumberField.inst_ringOfIntegersAlgebra
+
+-- no diamond
+example : Algebra.id (𝓞 K) = inst_ringOfIntegersAlgebra K K := rfl
namespace RingOfIntegers
Add the following result:
theorem mem_span_integralBasis {x : K} :
x ∈ Submodule.span ℤ (Set.range (integralBasis K)) ↔ x ∈ 𝓞 K
that is, integralBasis
is indeed a ℤ
-basis of the ring of integers.
Co-authored-by: Riccardo Brasca <riccardo.brasca@gmail.com>
Co-authored-by: Riccardo Brasca <riccardo.brasca@gmail.com>
@@ -168,6 +168,11 @@ theorem integralBasis_apply (i : Free.ChooseBasisIndex ℤ (𝓞 K)) :
Basis.localizationLocalization_apply ℚ (nonZeroDivisors ℤ) K (RingOfIntegers.basis K) i
#align number_field.integral_basis_apply NumberField.integralBasis_apply
+theorem mem_span_integralBasis {x : K} :
+ x ∈ Submodule.span ℤ (Set.range (integralBasis K)) ↔ x ∈ 𝓞 K := by
+ rw [integralBasis, Basis.localizationLocalization_span, Subalgebra.range_isScalarTower_toAlgHom,
+ Subalgebra.mem_toSubmodule]
+
theorem RingOfIntegers.rank : FiniteDimensional.finrank ℤ (𝓞 K) = FiniteDimensional.finrank ℚ K :=
IsIntegralClosure.rank ℤ ℚ K (𝓞 K)
#align number_field.ring_of_integers.rank NumberField.RingOfIntegers.rank
@@ -2,15 +2,12 @@
Copyright (c) 2021 Ashvni Narayanan. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Ashvni Narayanan, Anne Baanen
-
-! This file was ported from Lean 3 source module number_theory.number_field.basic
-! leanprover-community/mathlib commit f0c8bf9245297a541f468be517f1bde6195105e9
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.CharP.Algebra
import Mathlib.RingTheory.DedekindDomain.IntegralClosure
+#align_import number_theory.number_field.basic from "leanprover-community/mathlib"@"f0c8bf9245297a541f468be517f1bde6195105e9"
+
/-!
# Number fields
This file defines a number field and the ring of integers corresponding to it.
@@ -88,6 +88,7 @@ theorem isIntegral_of_mem_ringOfIntegers {K : Type _} [Field K] {x : K} (hx : x
For now, this is not an instance by default as it creates an equal-but-not-defeq diamond with
`Algebra.id` when `K = L`. This is caused by `x = ⟨x, x.prop⟩` not being defeq on subtypes. This
will likely change in Lean 4. -/
+-- Porting note: check if this can be an instance now
def ringOfIntegersAlgebra [Algebra K L] : Algebra (𝓞 K) (𝓞 L) :=
RingHom.toAlgebra
{ toFun := fun k => ⟨algebraMap K L k, IsIntegral.algebraMap k.2⟩
The unported dependencies are