ring_theory.discriminant
⟷
Mathlib.RingTheory.Discriminant
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)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(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
@@ -152,7 +152,7 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b
classical
rw [discr_def, trace_matrix]
simp_rw [← Basis.mk_apply b.linear_independent this.ge]
- rw [← trace_matrix, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
+ rw [← trace_matrix, trace_matrix_of_basis, ← LinearMap.BilinForm.nondegenerate_iff_det_ne_zero]
exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -103,7 +103,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
this j, ← map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
by_contra h
- rw [discr_def] at h
+ rw [discr_def] at h
simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
#align algebra.discr_zero_of_not_linear_independent Algebra.discr_zero_of_not_linearIndependent
-/
@@ -276,17 +276,17 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
← Finset.prod_mk _ (hnodup.erase _)]
rw [prod_sigma', prod_sigma']
refine'
- prod_bij (fun i hi => ⟨e i.2, e i.1 pb.gen⟩) (fun i hi => _) (fun i hi => by simp at hi )
+ prod_bij (fun i hi => ⟨e i.2, e i.1 pb.gen⟩) (fun i hi => _) (fun i hi => by simp at hi)
(fun i j hi hj hij => _) fun σ hσ => _
· simp only [true_and_iff, Finset.mem_mk, mem_univ, mem_sigma]
rw [Multiset.mem_erase_of_ne fun h => _]
· exact hroots _
- · simp only [true_and_iff, mem_univ, Ne.def, mem_sigma, mem_compl, mem_singleton] at hi
- rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
+ · simp only [true_and_iff, mem_univ, Ne.def, mem_sigma, mem_compl, mem_singleton] at hi
+ rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
exact hi (e.injective <| pb.lift_equiv.injective <| Subtype.eq h.symm)
- · simp only [Equiv.apply_eq_iff_eq, heq_iff_eq] at hij
+ · simp only [Equiv.apply_eq_iff_eq, heq_iff_eq] at hij
have h := hij.2
- rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
+ rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
refine' Sigma.eq (Equiv.injective e (Equiv.injective _ (Subtype.eq h))) (by simp [hij.1])
· simp only [true_and_iff, Finset.mem_mk, mem_univ, mem_sigma] at hσ ⊢
simp only [Sigma.exists, exists_prop, mem_compl, mem_singleton, Ne.def]
@@ -295,8 +295,8 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
· exact Multiset.erase_subset _ _ hσ
· simp [minpoly.ne_zero (IsSeparable.isIntegral K pb.gen)]
· replace h := AlgHom.congr_fun (Equiv.injective _ h) pb.gen
- rw [PowerBasis.lift_gen] at h
- rw [← h] at hσ
+ rw [PowerBasis.lift_gen] at h
+ rw [← h] at hσ
exact hnodup.not_mem_erase hσ
all_goals simp
#align algebra.discr_power_basis_eq_norm Algebra.discr_powerBasis_eq_norm
@@ -343,7 +343,7 @@ theorem discr_eq_discr_of_toMatrix_coeff_isIntegral [NumberField K] {b : Basis
refine' isUnit_iff_exists_inv.2 ⟨r', _⟩
suffices algebraMap ℤ ℚ (r * r') = 1
by
- rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
+ rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
exact (IsFractionRing.injective ℤ ℚ) this
rw [RingHom.map_mul, hr, hr', ← det_mul, Basis.toMatrix_mul_toMatrix_flip, det_one]
rw [← RingHom.map_one (algebraMap ℤ ℚ), ← hr]
@@ -374,18 +374,18 @@ theorem discr_mul_isIntegral_mem_adjoin [IsDomain R] [IsSeparable K L] [IsIntegr
rw [← B.basis.sum_repr z, Finset.smul_sum]
refine' Subalgebra.sum_mem _ fun i hi => _
replace this := this i
- rw [← discr_def, Pi.smul_apply, mem_bot] at this
+ rw [← discr_def, Pi.smul_apply, mem_bot] at this
obtain ⟨r, hr⟩ := this
- rw [Basis.equivFun_apply] at hr
+ rw [Basis.equivFun_apply] at hr
rw [← smul_assoc, ← hr, algebraMap_smul]
refine' Subalgebra.smul_mem _ _ _
rw [B.basis_eq_pow i]
refine' Subalgebra.pow_mem _ (subset_adjoin (Set.mem_singleton _)) _
intro i
- rw [← H, ← mul_vec_smul] at cramer
+ rw [← H, ← mul_vec_smul] at cramer
replace cramer := congr_arg (mul_vec (trace_matrix K B.basis)⁻¹) cramer
rw [mul_vec_mul_vec, nonsing_inv_mul _ hinv, mul_vec_mul_vec, nonsing_inv_mul _ hinv, one_mul_vec,
- one_mul_vec] at cramer
+ one_mul_vec] at cramer
rw [← congr_fun cramer i, cramer_apply, det_apply]
refine'
Subalgebra.sum_mem _ fun σ _ => Subalgebra.zsmul_mem _ (Subalgebra.prod_mem _ fun j _ => _) _
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -147,7 +147,7 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b
cases isEmpty_or_nonempty ι
· simp [discr]
· have :=
- span_eq_top_of_linearIndependent_of_card_eq_finrank b.linear_independent
+ LinearIndependent.span_eq_top_of_card_eq_finrank b.linear_independent
(finrank_eq_card_basis b).symm
classical
rw [discr_def, trace_matrix]
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -69,7 +69,7 @@ section Discr
/-- Given an `A`-algebra `B` and `b`, an `ι`-indexed family of elements of `B`, we define
`discr A ι b` as the determinant of `trace_matrix A ι b`. -/
noncomputable def discr (A : Type u) {B : Type v} [CommRing A] [CommRing B] [Algebra A B]
- [Fintype ι] (b : ι → B) := by classical
+ [Fintype ι] (b : ι → B) := by classical exact (trace_matrix A b).det
#align algebra.discr Algebra.discr
-/
@@ -86,14 +86,25 @@ section Basic
#print Algebra.discr_reindex /-
@[simp]
theorem discr_reindex (b : Basis ι A B) (f : ι ≃ ι') : discr A (b ∘ ⇑f.symm) = discr A b := by
- classical
+ classical rw [← Basis.coe_reindex, discr_def, trace_matrix_reindex, det_reindex_self, ← discr_def]
#align algebra.discr_reindex Algebra.discr_reindex
-/
#print Algebra.discr_zero_of_not_linearIndependent /-
/-- If `b` is not linear independent, then `algebra.discr A b = 0`. -/
theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
- (hli : ¬LinearIndependent A b) : discr A b = 0 := by classical
+ (hli : ¬LinearIndependent A b) : discr A b = 0 := by
+ classical
+ obtain ⟨g, hg, i, hi⟩ := Fintype.not_linearIndependent_iff.1 hli
+ have : (trace_matrix A b).mulVec g = 0 := by
+ ext i
+ have : ∀ j, (trace A B) (b i * b j) * g j = (trace A B) (g j • b j * b i) := by intro j;
+ simp [mul_comm]
+ simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
+ this j, ← map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
+ by_contra h
+ rw [discr_def] at h
+ simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
#align algebra.discr_zero_of_not_linear_independent Algebra.discr_zero_of_not_linearIndependent
-/
@@ -139,6 +150,10 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b
span_eq_top_of_linearIndependent_of_card_eq_finrank b.linear_independent
(finrank_eq_card_basis b).symm
classical
+ rw [discr_def, trace_matrix]
+ simp_rw [← Basis.mk_apply b.linear_independent this.ge]
+ rw [← trace_matrix, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
+ exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
-/
@@ -296,6 +311,8 @@ variable {R : Type z} [CommRing R] [Algebra R K] [Algebra R L] [IsScalarTower R
` ∀ i, is_integral R (b i)`, then `is_integral R (discr K b)`. -/
theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsIntegral R (discr K b) := by
classical
+ rw [discr_def]
+ exact IsIntegral.det fun i j => is_integral_trace (IsIntegral.mul (h i) (h j))
#align algebra.discr_is_integral Algebra.discr_isIntegral
-/
@@ -312,6 +329,27 @@ theorem discr_eq_discr_of_toMatrix_coeff_isIntegral [NumberField K] {b : Basis
convert h' i ((b.index_equiv b').symm j)
simpa
classical
+ rw [← (b.reindex (b.index_equiv b')).toMatrix_map_vecMul b', discr_of_matrix_vec_mul, ←
+ one_mul (discr ℚ b), Basis.coe_reindex, discr_reindex]
+ congr
+ have hint : IsIntegral ℤ ((b.reindex (b.index_equiv b')).toMatrix b').det :=
+ IsIntegral.det fun i j => h _ _
+ obtain ⟨r, hr⟩ := IsIntegrallyClosed.isIntegral_iff.1 hint
+ have hunit : IsUnit r :=
+ by
+ have : IsIntegral ℤ (b'.to_matrix (b.reindex (b.index_equiv b'))).det :=
+ IsIntegral.det fun i j => h' _ _
+ obtain ⟨r', hr'⟩ := IsIntegrallyClosed.isIntegral_iff.1 this
+ refine' isUnit_iff_exists_inv.2 ⟨r', _⟩
+ suffices algebraMap ℤ ℚ (r * r') = 1
+ by
+ rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
+ exact (IsFractionRing.injective ℤ ℚ) this
+ rw [RingHom.map_mul, hr, hr', ← det_mul, Basis.toMatrix_mul_toMatrix_flip, det_one]
+ rw [← RingHom.map_one (algebraMap ℤ ℚ), ← hr]
+ cases' Int.isUnit_iff.1 hunit with hp hm
+ · simp [hp]
+ · simp [hm]
#align algebra.discr_eq_discr_of_to_matrix_coeff_is_integral Algebra.discr_eq_discr_of_toMatrix_coeff_isIntegral
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -69,7 +69,7 @@ section Discr
/-- Given an `A`-algebra `B` and `b`, an `ι`-indexed family of elements of `B`, we define
`discr A ι b` as the determinant of `trace_matrix A ι b`. -/
noncomputable def discr (A : Type u) {B : Type v} [CommRing A] [CommRing B] [Algebra A B]
- [Fintype ι] (b : ι → B) := by classical exact (trace_matrix A b).det
+ [Fintype ι] (b : ι → B) := by classical
#align algebra.discr Algebra.discr
-/
@@ -86,25 +86,14 @@ section Basic
#print Algebra.discr_reindex /-
@[simp]
theorem discr_reindex (b : Basis ι A B) (f : ι ≃ ι') : discr A (b ∘ ⇑f.symm) = discr A b := by
- classical rw [← Basis.coe_reindex, discr_def, trace_matrix_reindex, det_reindex_self, ← discr_def]
+ classical
#align algebra.discr_reindex Algebra.discr_reindex
-/
#print Algebra.discr_zero_of_not_linearIndependent /-
/-- If `b` is not linear independent, then `algebra.discr A b = 0`. -/
theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
- (hli : ¬LinearIndependent A b) : discr A b = 0 := by
- classical
- obtain ⟨g, hg, i, hi⟩ := Fintype.not_linearIndependent_iff.1 hli
- have : (trace_matrix A b).mulVec g = 0 := by
- ext i
- have : ∀ j, (trace A B) (b i * b j) * g j = (trace A B) (g j • b j * b i) := by intro j;
- simp [mul_comm]
- simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
- this j, ← map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
- by_contra h
- rw [discr_def] at h
- simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
+ (hli : ¬LinearIndependent A b) : discr A b = 0 := by classical
#align algebra.discr_zero_of_not_linear_independent Algebra.discr_zero_of_not_linearIndependent
-/
@@ -150,10 +139,6 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b
span_eq_top_of_linearIndependent_of_card_eq_finrank b.linear_independent
(finrank_eq_card_basis b).symm
classical
- rw [discr_def, trace_matrix]
- simp_rw [← Basis.mk_apply b.linear_independent this.ge]
- rw [← trace_matrix, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
- exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
-/
@@ -311,8 +296,6 @@ variable {R : Type z} [CommRing R] [Algebra R K] [Algebra R L] [IsScalarTower R
` ∀ i, is_integral R (b i)`, then `is_integral R (discr K b)`. -/
theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsIntegral R (discr K b) := by
classical
- rw [discr_def]
- exact IsIntegral.det fun i j => is_integral_trace (IsIntegral.mul (h i) (h j))
#align algebra.discr_is_integral Algebra.discr_isIntegral
-/
@@ -329,27 +312,6 @@ theorem discr_eq_discr_of_toMatrix_coeff_isIntegral [NumberField K] {b : Basis
convert h' i ((b.index_equiv b').symm j)
simpa
classical
- rw [← (b.reindex (b.index_equiv b')).toMatrix_map_vecMul b', discr_of_matrix_vec_mul, ←
- one_mul (discr ℚ b), Basis.coe_reindex, discr_reindex]
- congr
- have hint : IsIntegral ℤ ((b.reindex (b.index_equiv b')).toMatrix b').det :=
- IsIntegral.det fun i j => h _ _
- obtain ⟨r, hr⟩ := IsIntegrallyClosed.isIntegral_iff.1 hint
- have hunit : IsUnit r :=
- by
- have : IsIntegral ℤ (b'.to_matrix (b.reindex (b.index_equiv b'))).det :=
- IsIntegral.det fun i j => h' _ _
- obtain ⟨r', hr'⟩ := IsIntegrallyClosed.isIntegral_iff.1 this
- refine' isUnit_iff_exists_inv.2 ⟨r', _⟩
- suffices algebraMap ℤ ℚ (r * r') = 1
- by
- rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
- exact (IsFractionRing.injective ℤ ℚ) this
- rw [RingHom.map_mul, hr, hr', ← det_mul, Basis.toMatrix_mul_toMatrix_flip, det_one]
- rw [← RingHom.map_one (algebraMap ℤ ℚ), ← hr]
- cases' Int.isUnit_iff.1 hunit with hp hm
- · simp [hp]
- · simp [hm]
#align algebra.discr_eq_discr_of_to_matrix_coeff_is_integral Algebra.discr_eq_discr_of_toMatrix_coeff_isIntegral
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -229,7 +229,7 @@ theorem discr_powerBasis_eq_prod'' [IsSeparable K L] (e : Fin pb.dim ≃ (L →
by
rw [← AlgHom.card K L E, ← Fintype.card_fin pb.dim]
exact card_congr (Equiv.symm e)
- have h₂ : 2 ∣ pb.dim * (pb.dim - 1) := even_iff_two_dvd.1 (Nat.even_mul_self_pred _)
+ have h₂ : 2 ∣ pb.dim * (pb.dim - 1) := even_iff_two_dvd.1 (Nat.even_mul_pred_self _)
have hne : ((2 : ℕ) : ℚ) ≠ 0 := by simp
have hle : 1 ≤ pb.dim :=
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -312,7 +312,7 @@ variable {R : Type z} [CommRing R] [Algebra R K] [Algebra R L] [IsScalarTower R
theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsIntegral R (discr K b) := by
classical
rw [discr_def]
- exact IsIntegral.det fun i j => is_integral_trace (isIntegral_mul (h i) (h j))
+ exact IsIntegral.det fun i j => is_integral_trace (IsIntegral.mul (h i) (h j))
#align algebra.discr_is_integral Algebra.discr_isIntegral
-/
@@ -394,12 +394,12 @@ theorem discr_mul_isIntegral_mem_adjoin [IsDomain R] [IsSeparable K L] [IsIntegr
exact
mem_bot.2
(IsIntegrallyClosed.isIntegral_iff.1 <|
- is_integral_trace <| isIntegral_mul hz <| IsIntegral.pow hint _)
+ is_integral_trace <| IsIntegral.mul hz <| IsIntegral.pow hint _)
· simp only [update_column_apply, hji, PowerBasis.coe_basis]
exact
mem_bot.2
(IsIntegrallyClosed.isIntegral_iff.1 <|
- is_integral_trace <| isIntegral_mul (IsIntegral.pow hint _) (IsIntegral.pow hint _))
+ is_integral_trace <| IsIntegral.mul (IsIntegral.pow hint _) (IsIntegral.pow hint _))
#align algebra.discr_mul_is_integral_mem_adjoin Algebra.discr_mul_isIntegral_mem_adjoin
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -101,7 +101,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
have : ∀ j, (trace A B) (b i * b j) * g j = (trace A B) (g j • b j * b i) := by intro j;
simp [mul_comm]
simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
- this j, ← LinearMap.map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
+ this j, ← map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
by_contra h
rw [discr_def] at h
simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-/
-import Mathbin.RingTheory.Trace
-import Mathbin.RingTheory.Norm
-import Mathbin.NumberTheory.NumberField.Basic
+import RingTheory.Trace
+import RingTheory.Norm
+import NumberTheory.NumberField.Basic
#align_import ring_theory.discriminant from "leanprover-community/mathlib"@"5d0c76894ada7940957143163d7b921345474cbc"
mathlib commit https://github.com/leanprover-community/mathlib/commit/442a83d738cb208d3600056c489be16900ba701d
@@ -247,7 +247,7 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
discr K pb.Basis =
(-1) ^ (n * (n - 1) / 2) * norm K (aeval pb.gen (minpoly K pb.gen).derivative) :=
by
- let E := AlgebraicClosure L
+ let E := AlgebraicClosureAux L
letI := fun a b : E => Classical.propDecidable (Eq a b)
have e : Fin pb.dim ≃ (L →ₐ[K] E) :=
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-
-! This file was ported from Lean 3 source module ring_theory.discriminant
-! leanprover-community/mathlib commit 5d0c76894ada7940957143163d7b921345474cbc
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.RingTheory.Trace
import Mathbin.RingTheory.Norm
import Mathbin.NumberTheory.NumberField.Basic
+#align_import ring_theory.discriminant from "leanprover-community/mathlib"@"5d0c76894ada7940957143163d7b921345474cbc"
+
/-!
# Discriminant of a family of vectors
mathlib commit https://github.com/leanprover-community/mathlib/commit/93f880918cb51905fd51b76add8273cbc27718ab
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module ring_theory.discriminant
-! leanprover-community/mathlib commit 3e068ece210655b7b9a9477c3aff38a492400aa1
+! leanprover-community/mathlib commit 5d0c76894ada7940957143163d7b921345474cbc
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -15,6 +15,9 @@ import Mathbin.NumberTheory.NumberField.Basic
/-!
# Discriminant of a family of vectors
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
Given an `A`-algebra `B` and `b`, an `ι`-indexed family of elements of `B`, we define the
*discriminant* of `b` as the determinant of the matrix whose `(i j)`-th element is the trace of
`b i * b j`.
mathlib commit https://github.com/leanprover-community/mathlib/commit/6285167a053ad0990fc88e56c48ccd9fae6550eb
@@ -65,25 +65,32 @@ variable [CommRing A] [CommRing B] [Algebra A B] [CommRing C] [Algebra A C]
section Discr
+#print Algebra.discr /-
/-- Given an `A`-algebra `B` and `b`, an `ι`-indexed family of elements of `B`, we define
`discr A ι b` as the determinant of `trace_matrix A ι b`. -/
noncomputable def discr (A : Type u) {B : Type v} [CommRing A] [CommRing B] [Algebra A B]
[Fintype ι] (b : ι → B) := by classical exact (trace_matrix A b).det
#align algebra.discr Algebra.discr
+-/
+#print Algebra.discr_def /-
theorem discr_def [DecidableEq ι] [Fintype ι] (b : ι → B) : discr A b = (traceMatrix A b).det := by
convert rfl
#align algebra.discr_def Algebra.discr_def
+-/
variable {ι' : Type _} [Fintype ι'] [Fintype ι]
section Basic
+#print Algebra.discr_reindex /-
@[simp]
theorem discr_reindex (b : Basis ι A B) (f : ι ≃ ι') : discr A (b ∘ ⇑f.symm) = discr A b := by
classical rw [← Basis.coe_reindex, discr_def, trace_matrix_reindex, det_reindex_self, ← discr_def]
#align algebra.discr_reindex Algebra.discr_reindex
+-/
+#print Algebra.discr_zero_of_not_linearIndependent /-
/-- If `b` is not linear independent, then `algebra.discr A b = 0`. -/
theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
(hli : ¬LinearIndependent A b) : discr A b = 0 := by
@@ -99,9 +106,11 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
rw [discr_def] at h
simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
#align algebra.discr_zero_of_not_linear_independent Algebra.discr_zero_of_not_linearIndependent
+-/
variable {A}
+#print Algebra.discr_of_matrix_vecMul /-
/-- Relation between `algebra.discr A ι b` and
`algebra.discr A ((P.map (algebra_map A B)).vec_mul b)`. -/
theorem discr_of_matrix_vecMul [DecidableEq ι] (b : ι → B) (P : Matrix ι ι A) :
@@ -109,7 +118,9 @@ theorem discr_of_matrix_vecMul [DecidableEq ι] (b : ι → B) (P : Matrix ι ι
rw [discr_def, trace_matrix_of_matrix_vec_mul, det_mul, det_mul, det_transpose, mul_comm, ←
mul_assoc, discr_def, pow_two]
#align algebra.discr_of_matrix_vec_mul Algebra.discr_of_matrix_vecMul
+-/
+#print Algebra.discr_of_matrix_mulVec /-
/-- Relation between `algebra.discr A ι b` and
`algebra.discr A ((P.map (algebra_map A B)).mul_vec b)`. -/
theorem discr_of_matrix_mulVec [DecidableEq ι] (b : ι → B) (P : Matrix ι ι A) :
@@ -117,6 +128,7 @@ theorem discr_of_matrix_mulVec [DecidableEq ι] (b : ι → B) (P : Matrix ι ι
rw [discr_def, trace_matrix_of_matrix_mul_vec, det_mul, det_mul, det_transpose, mul_comm, ←
mul_assoc, discr_def, pow_two]
#align algebra.discr_of_matrix_mul_vec Algebra.discr_of_matrix_mulVec
+-/
end Basic
@@ -128,6 +140,7 @@ variable [Algebra K L] [Algebra K E]
variable [Module.Finite K L] [IsAlgClosed E]
+#print Algebra.discr_not_zero_of_basis /-
/-- Over a field, if `b` is a basis, then `algebra.discr K b ≠ 0`. -/
theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b ≠ 0 :=
by
@@ -142,14 +155,18 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b
rw [← trace_matrix, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
+-/
+#print Algebra.discr_isUnit_of_basis /-
/-- Over a field, if `b` is a basis, then `algebra.discr K b` is a unit. -/
theorem discr_isUnit_of_basis [IsSeparable K L] (b : Basis ι K L) : IsUnit (discr K b) :=
IsUnit.mk0 _ (discr_not_zero_of_basis _ _)
#align algebra.discr_is_unit_of_basis Algebra.discr_isUnit_of_basis
+-/
variable (b : ι → L) (pb : PowerBasis K L)
+#print Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two /-
/-- If `L/K` is a field extension and `b : ι → L`, then `discr K b` is the square of the
determinant of the matrix whose `(i, j)` coefficient is `σⱼ (b i)`, where `σⱼ : L →ₐ[K] E` is the
embedding in an algebraically closed field `E` corresponding to `j : ι` via a bijection
@@ -160,7 +177,9 @@ theorem discr_eq_det_embeddingsMatrixReindex_pow_two [DecidableEq ι] [IsSeparab
rw [discr_def, RingHom.map_det, RingHom.mapMatrix_apply,
trace_matrix_eq_embeddings_matrix_reindex_mul_trans, det_mul, det_transpose, pow_two]
#align algebra.discr_eq_det_embeddings_matrix_reindex_pow_two Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two
+-/
+#print Algebra.discr_powerBasis_eq_prod /-
/-- The discriminant of a power basis. -/
theorem discr_powerBasis_eq_prod (e : Fin pb.dim ≃ (L →ₐ[K] E)) [IsSeparable K L] :
algebraMap K E (discr K pb.Basis) =
@@ -171,7 +190,9 @@ theorem discr_powerBasis_eq_prod (e : Fin pb.dim ≃ (L →ₐ[K] E)) [IsSeparab
congr; ext i
rw [← prod_pow]
#align algebra.discr_power_basis_eq_prod Algebra.discr_powerBasis_eq_prod
+-/
+#print Algebra.discr_powerBasis_eq_prod' /-
/-- A variation of `of_power_basis_eq_prod`. -/
theorem discr_powerBasis_eq_prod' [IsSeparable K L] (e : Fin pb.dim ≃ (L →ₐ[K] E)) :
algebraMap K E (discr K pb.Basis) =
@@ -181,9 +202,11 @@ theorem discr_powerBasis_eq_prod' [IsSeparable K L] (e : Fin pb.dim ≃ (L →
congr; ext i; congr; ext j
ring
#align algebra.discr_power_basis_eq_prod' Algebra.discr_powerBasis_eq_prod'
+-/
local notation "n" => finrank K L
+#print Algebra.discr_powerBasis_eq_prod'' /-
/-- A variation of `of_power_basis_eq_prod`. -/
theorem discr_powerBasis_eq_prod'' [IsSeparable K L] (e : Fin pb.dim ≃ (L →ₐ[K] E)) :
algebraMap K E (discr K pb.Basis) =
@@ -216,7 +239,9 @@ theorem discr_powerBasis_eq_prod'' [IsSeparable K L] (e : Fin pb.dim ≃ (L →
field_simp
ring
#align algebra.discr_power_basis_eq_prod'' Algebra.discr_powerBasis_eq_prod''
+-/
+#print Algebra.discr_powerBasis_eq_norm /-
/-- Formula for the discriminant of a power basis using the norm of the field extension. -/
theorem discr_powerBasis_eq_norm [IsSeparable K L] :
discr K pb.Basis =
@@ -275,11 +300,13 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
exact hnodup.not_mem_erase hσ
all_goals simp
#align algebra.discr_power_basis_eq_norm Algebra.discr_powerBasis_eq_norm
+-/
section Integral
variable {R : Type z} [CommRing R] [Algebra R K] [Algebra R L] [IsScalarTower R K L]
+#print Algebra.discr_isIntegral /-
/-- If `K` and `L` are fields and `is_scalar_tower R K L`, and `b : ι → L` satisfies
` ∀ i, is_integral R (b i)`, then `is_integral R (discr K b)`. -/
theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsIntegral R (discr K b) := by
@@ -287,7 +314,9 @@ theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsInte
rw [discr_def]
exact IsIntegral.det fun i j => is_integral_trace (isIntegral_mul (h i) (h j))
#align algebra.discr_is_integral Algebra.discr_isIntegral
+-/
+#print Algebra.discr_eq_discr_of_toMatrix_coeff_isIntegral /-
/-- If `b` and `b'` are `ℚ`-bases of a number field `K` such that
`∀ i j, is_integral ℤ (b.to_matrix b' i j)` and `∀ i j, is_integral ℤ (b'.to_matrix b i j)` then
`discr ℚ b = discr ℚ b'`. -/
@@ -322,7 +351,9 @@ theorem discr_eq_discr_of_toMatrix_coeff_isIntegral [NumberField K] {b : Basis
· simp [hp]
· simp [hm]
#align algebra.discr_eq_discr_of_to_matrix_coeff_is_integral Algebra.discr_eq_discr_of_toMatrix_coeff_isIntegral
+-/
+#print Algebra.discr_mul_isIntegral_mem_adjoin /-
/-- Let `K` be the fraction field of an integrally closed domain `R` and let `L` be a finite
separable extension of `K`. Let `B : power_basis K L` be such that `is_integral R B.gen`.
Then for all, `z : L` that are integral over `R`, we have
@@ -370,6 +401,7 @@ theorem discr_mul_isIntegral_mem_adjoin [IsDomain R] [IsSeparable K L] [IsIntegr
(IsIntegrallyClosed.isIntegral_iff.1 <|
is_integral_trace <| isIntegral_mul (IsIntegral.pow hint _) (IsIntegral.pow hint _))
#align algebra.discr_mul_is_integral_mem_adjoin Algebra.discr_mul_isIntegral_mem_adjoin
+-/
end Integral
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -182,7 +182,6 @@ theorem discr_powerBasis_eq_prod' [IsSeparable K L] (e : Fin pb.dim ≃ (L →
ring
#align algebra.discr_power_basis_eq_prod' Algebra.discr_powerBasis_eq_prod'
--- mathport name: exprn
local notation "n" => finrank K L
/-- A variation of `of_power_basis_eq_prod`. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -88,16 +88,16 @@ theorem discr_reindex (b : Basis ι A B) (f : ι ≃ ι') : discr A (b ∘ ⇑f.
theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
(hli : ¬LinearIndependent A b) : discr A b = 0 := by
classical
- obtain ⟨g, hg, i, hi⟩ := Fintype.not_linearIndependent_iff.1 hli
- have : (trace_matrix A b).mulVec g = 0 := by
- ext i
- have : ∀ j, (trace A B) (b i * b j) * g j = (trace A B) (g j • b j * b i) := by intro j;
- simp [mul_comm]
- simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
- this j, ← LinearMap.map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
- by_contra h
- rw [discr_def] at h
- simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
+ obtain ⟨g, hg, i, hi⟩ := Fintype.not_linearIndependent_iff.1 hli
+ have : (trace_matrix A b).mulVec g = 0 := by
+ ext i
+ have : ∀ j, (trace A B) (b i * b j) * g j = (trace A B) (g j • b j * b i) := by intro j;
+ simp [mul_comm]
+ simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
+ this j, ← LinearMap.map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
+ by_contra h
+ rw [discr_def] at h
+ simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
#align algebra.discr_zero_of_not_linear_independent Algebra.discr_zero_of_not_linearIndependent
variable {A}
@@ -137,10 +137,10 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b
span_eq_top_of_linearIndependent_of_card_eq_finrank b.linear_independent
(finrank_eq_card_basis b).symm
classical
- rw [discr_def, trace_matrix]
- simp_rw [← Basis.mk_apply b.linear_independent this.ge]
- rw [← trace_matrix, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
- exact traceForm_nondegenerate _ _
+ rw [discr_def, trace_matrix]
+ simp_rw [← Basis.mk_apply b.linear_independent this.ge]
+ rw [← trace_matrix, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
+ exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
/-- Over a field, if `b` is a basis, then `algebra.discr K b` is a unit. -/
@@ -285,8 +285,8 @@ variable {R : Type z} [CommRing R] [Algebra R K] [Algebra R L] [IsScalarTower R
` ∀ i, is_integral R (b i)`, then `is_integral R (discr K b)`. -/
theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsIntegral R (discr K b) := by
classical
- rw [discr_def]
- exact IsIntegral.det fun i j => is_integral_trace (isIntegral_mul (h i) (h j))
+ rw [discr_def]
+ exact IsIntegral.det fun i j => is_integral_trace (isIntegral_mul (h i) (h j))
#align algebra.discr_is_integral Algebra.discr_isIntegral
/-- If `b` and `b'` are `ℚ`-bases of a number field `K` such that
@@ -301,27 +301,27 @@ theorem discr_eq_discr_of_toMatrix_coeff_isIntegral [NumberField K] {b : Basis
convert h' i ((b.index_equiv b').symm j)
simpa
classical
- rw [← (b.reindex (b.index_equiv b')).toMatrix_map_vecMul b', discr_of_matrix_vec_mul, ←
- one_mul (discr ℚ b), Basis.coe_reindex, discr_reindex]
- congr
- have hint : IsIntegral ℤ ((b.reindex (b.index_equiv b')).toMatrix b').det :=
- IsIntegral.det fun i j => h _ _
- obtain ⟨r, hr⟩ := IsIntegrallyClosed.isIntegral_iff.1 hint
- have hunit : IsUnit r :=
+ rw [← (b.reindex (b.index_equiv b')).toMatrix_map_vecMul b', discr_of_matrix_vec_mul, ←
+ one_mul (discr ℚ b), Basis.coe_reindex, discr_reindex]
+ congr
+ have hint : IsIntegral ℤ ((b.reindex (b.index_equiv b')).toMatrix b').det :=
+ IsIntegral.det fun i j => h _ _
+ obtain ⟨r, hr⟩ := IsIntegrallyClosed.isIntegral_iff.1 hint
+ have hunit : IsUnit r :=
+ by
+ have : IsIntegral ℤ (b'.to_matrix (b.reindex (b.index_equiv b'))).det :=
+ IsIntegral.det fun i j => h' _ _
+ obtain ⟨r', hr'⟩ := IsIntegrallyClosed.isIntegral_iff.1 this
+ refine' isUnit_iff_exists_inv.2 ⟨r', _⟩
+ suffices algebraMap ℤ ℚ (r * r') = 1
by
- have : IsIntegral ℤ (b'.to_matrix (b.reindex (b.index_equiv b'))).det :=
- IsIntegral.det fun i j => h' _ _
- obtain ⟨r', hr'⟩ := IsIntegrallyClosed.isIntegral_iff.1 this
- refine' isUnit_iff_exists_inv.2 ⟨r', _⟩
- suffices algebraMap ℤ ℚ (r * r') = 1
- by
- rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
- exact (IsFractionRing.injective ℤ ℚ) this
- rw [RingHom.map_mul, hr, hr', ← det_mul, Basis.toMatrix_mul_toMatrix_flip, det_one]
- rw [← RingHom.map_one (algebraMap ℤ ℚ), ← hr]
- cases' Int.isUnit_iff.1 hunit with hp hm
- · simp [hp]
- · simp [hm]
+ rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
+ exact (IsFractionRing.injective ℤ ℚ) this
+ rw [RingHom.map_mul, hr, hr', ← det_mul, Basis.toMatrix_mul_toMatrix_flip, det_one]
+ rw [← RingHom.map_one (algebraMap ℤ ℚ), ← hr]
+ cases' Int.isUnit_iff.1 hunit with hp hm
+ · simp [hp]
+ · simp [hm]
#align algebra.discr_eq_discr_of_to_matrix_coeff_is_integral Algebra.discr_eq_discr_of_toMatrix_coeff_isIntegral
/-- Let `K` be the fraction field of an integrally closed domain `R` and let `L` be a finite
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -96,7 +96,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
this j, ← LinearMap.map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
by_contra h
- rw [discr_def] at h
+ rw [discr_def] at h
simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
#align algebra.discr_zero_of_not_linear_independent Algebra.discr_zero_of_not_linearIndependent
@@ -168,7 +168,7 @@ theorem discr_powerBasis_eq_prod (e : Fin pb.dim ≃ (L →ₐ[K] E)) [IsSeparab
by
rw [discr_eq_det_embeddings_matrix_reindex_pow_two K E pb.basis e,
embeddings_matrix_reindex_eq_vandermonde, det_transpose, det_vandermonde, ← prod_pow]
- congr ; ext i
+ congr; ext i
rw [← prod_pow]
#align algebra.discr_power_basis_eq_prod Algebra.discr_powerBasis_eq_prod
@@ -178,7 +178,7 @@ theorem discr_powerBasis_eq_prod' [IsSeparable K L] (e : Fin pb.dim ≃ (L →
∏ i : Fin pb.dim, ∏ j in Ioi i, -((e j pb.gen - e i pb.gen) * (e i pb.gen - e j pb.gen)) :=
by
rw [discr_power_basis_eq_prod _ _ _ e]
- congr ; ext i; congr ; ext j
+ congr; ext i; congr; ext j
ring
#align algebra.discr_power_basis_eq_prod' Algebra.discr_powerBasis_eq_prod'
@@ -252,27 +252,27 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
← Finset.prod_mk _ (hnodup.erase _)]
rw [prod_sigma', prod_sigma']
refine'
- prod_bij (fun i hi => ⟨e i.2, e i.1 pb.gen⟩) (fun i hi => _) (fun i hi => by simp at hi)
+ prod_bij (fun i hi => ⟨e i.2, e i.1 pb.gen⟩) (fun i hi => _) (fun i hi => by simp at hi )
(fun i j hi hj hij => _) fun σ hσ => _
· simp only [true_and_iff, Finset.mem_mk, mem_univ, mem_sigma]
rw [Multiset.mem_erase_of_ne fun h => _]
· exact hroots _
- · simp only [true_and_iff, mem_univ, Ne.def, mem_sigma, mem_compl, mem_singleton] at hi
- rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
+ · simp only [true_and_iff, mem_univ, Ne.def, mem_sigma, mem_compl, mem_singleton] at hi
+ rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
exact hi (e.injective <| pb.lift_equiv.injective <| Subtype.eq h.symm)
- · simp only [Equiv.apply_eq_iff_eq, heq_iff_eq] at hij
+ · simp only [Equiv.apply_eq_iff_eq, heq_iff_eq] at hij
have h := hij.2
- rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
+ rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
refine' Sigma.eq (Equiv.injective e (Equiv.injective _ (Subtype.eq h))) (by simp [hij.1])
- · simp only [true_and_iff, Finset.mem_mk, mem_univ, mem_sigma] at hσ⊢
+ · simp only [true_and_iff, Finset.mem_mk, mem_univ, mem_sigma] at hσ ⊢
simp only [Sigma.exists, exists_prop, mem_compl, mem_singleton, Ne.def]
refine' ⟨e.symm (PowerBasis.lift pb σ.2 _), e.symm σ.1, ⟨fun h => _, Sigma.eq _ _⟩⟩
· rw [aeval_def, eval₂_eq_eval_map, ← is_root.def, ← mem_roots]
· exact Multiset.erase_subset _ _ hσ
· simp [minpoly.ne_zero (IsSeparable.isIntegral K pb.gen)]
· replace h := AlgHom.congr_fun (Equiv.injective _ h) pb.gen
- rw [PowerBasis.lift_gen] at h
- rw [← h] at hσ
+ rw [PowerBasis.lift_gen] at h
+ rw [← h] at hσ
exact hnodup.not_mem_erase hσ
all_goals simp
#align algebra.discr_power_basis_eq_norm Algebra.discr_powerBasis_eq_norm
@@ -315,7 +315,7 @@ theorem discr_eq_discr_of_toMatrix_coeff_isIntegral [NumberField K] {b : Basis
refine' isUnit_iff_exists_inv.2 ⟨r', _⟩
suffices algebraMap ℤ ℚ (r * r') = 1
by
- rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
+ rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
exact (IsFractionRing.injective ℤ ℚ) this
rw [RingHom.map_mul, hr, hr', ← det_mul, Basis.toMatrix_mul_toMatrix_flip, det_one]
rw [← RingHom.map_one (algebraMap ℤ ℚ), ← hr]
@@ -337,25 +337,25 @@ theorem discr_mul_isIntegral_mem_adjoin [IsDomain R] [IsSeparable K L] [IsIntegr
have H :
(trace_matrix K B.basis).det • (trace_matrix K B.basis).mulVec (B.basis.equiv_fun z) =
(trace_matrix K B.basis).det • fun i => trace K L (z * B.basis i) :=
- by congr ; exact trace_matrix_of_basis_mul_vec _ _
+ by congr; exact trace_matrix_of_basis_mul_vec _ _
have cramer := mul_vec_cramer (trace_matrix K B.basis) fun i => trace K L (z * B.basis i)
suffices ∀ i, ((trace_matrix K B.basis).det • B.basis.equiv_fun z) i ∈ (⊥ : Subalgebra R K)
by
rw [← B.basis.sum_repr z, Finset.smul_sum]
refine' Subalgebra.sum_mem _ fun i hi => _
replace this := this i
- rw [← discr_def, Pi.smul_apply, mem_bot] at this
+ rw [← discr_def, Pi.smul_apply, mem_bot] at this
obtain ⟨r, hr⟩ := this
- rw [Basis.equivFun_apply] at hr
+ rw [Basis.equivFun_apply] at hr
rw [← smul_assoc, ← hr, algebraMap_smul]
refine' Subalgebra.smul_mem _ _ _
rw [B.basis_eq_pow i]
refine' Subalgebra.pow_mem _ (subset_adjoin (Set.mem_singleton _)) _
intro i
- rw [← H, ← mul_vec_smul] at cramer
+ rw [← H, ← mul_vec_smul] at cramer
replace cramer := congr_arg (mul_vec (trace_matrix K B.basis)⁻¹) cramer
rw [mul_vec_mul_vec, nonsing_inv_mul _ hinv, mul_vec_mul_vec, nonsing_inv_mul _ hinv, one_mul_vec,
- one_mul_vec] at cramer
+ one_mul_vec] at cramer
rw [← congr_fun cramer i, cramer_apply, det_apply]
refine'
Subalgebra.sum_mem _ fun σ _ => Subalgebra.zsmul_mem _ (Subalgebra.prod_mem _ fun j _ => _) _
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -53,7 +53,7 @@ then `trace A B = 0` by definition, so `discr A b = 0` for any `b`.
universe u v w z
-open Matrix BigOperators
+open scoped Matrix BigOperators
open Matrix FiniteDimensional Fintype Polynomial Finset IntermediateField
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -91,9 +91,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
obtain ⟨g, hg, i, hi⟩ := Fintype.not_linearIndependent_iff.1 hli
have : (trace_matrix A b).mulVec g = 0 := by
ext i
- have : ∀ j, (trace A B) (b i * b j) * g j = (trace A B) (g j • b j * b i) :=
- by
- intro j
+ have : ∀ j, (trace A B) (b i * b j) * g j = (trace A B) (g j • b j * b i) := by intro j;
simp [mul_comm]
simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
this j, ← LinearMap.map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
@@ -339,9 +337,7 @@ theorem discr_mul_isIntegral_mem_adjoin [IsDomain R] [IsSeparable K L] [IsIntegr
have H :
(trace_matrix K B.basis).det • (trace_matrix K B.basis).mulVec (B.basis.equiv_fun z) =
(trace_matrix K B.basis).det • fun i => trace K L (z * B.basis i) :=
- by
- congr
- exact trace_matrix_of_basis_mul_vec _ _
+ by congr ; exact trace_matrix_of_basis_mul_vec _ _
have cramer := mul_vec_cramer (trace_matrix K B.basis) fun i => trace K L (z * B.basis i)
suffices ∀ i, ((trace_matrix K B.basis).det • B.basis.equiv_fun z) i ∈ (⊥ : Subalgebra R K)
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/75e7fca56381d056096ce5d05e938f63a6567828
@@ -142,7 +142,7 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b
rw [discr_def, trace_matrix]
simp_rw [← Basis.mk_apply b.linear_independent this.ge]
rw [← trace_matrix, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
- exact traceFormNondegenerate _ _
+ exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
/-- Over a field, if `b` is a basis, then `algebra.discr K b` is a unit. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/172bf2812857f5e56938cc148b7a539f52f84ca9
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module ring_theory.discriminant
-! leanprover-community/mathlib commit 825edd3cd735e87495b0c2a2114fc3929eefce41
+! leanprover-community/mathlib commit 3e068ece210655b7b9a9477c3aff38a492400aa1
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -95,7 +95,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
by
intro j
simp [mul_comm]
- simp only [mul_vec, dot_product, trace_matrix, Pi.zero_apply, trace_form_apply, fun j =>
+ simp only [mul_vec, dot_product, trace_matrix_apply, Pi.zero_apply, trace_form_apply, fun j =>
this j, ← LinearMap.map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
by_contra h
rw [discr_def] at h
@@ -139,9 +139,9 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) : discr K b
span_eq_top_of_linearIndependent_of_card_eq_finrank b.linear_independent
(finrank_eq_card_basis b).symm
classical
- rw [discr_def, trace_matrix_def]
+ rw [discr_def, trace_matrix]
simp_rw [← Basis.mk_apply b.linear_independent this.ge]
- rw [← trace_matrix_def, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
+ rw [← trace_matrix, trace_matrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
exact traceFormNondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -96,7 +96,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
intro j
simp [mul_comm]
simp only [mul_vec, dot_product, trace_matrix, Pi.zero_apply, trace_form_apply, fun j =>
- this j, ← LinearMap.map_sum, ← sum_mul, hg, zero_mul, LinearMap.map_zero]
+ this j, ← LinearMap.map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
by_contra h
rw [discr_def] at h
simpa [Matrix.eq_zero_of_mulVec_eq_zero h this] using hi
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
structure BilinForm
from Mathlib, migrate all of _root_.BilinForm
to LinearMap.BilinForm
(#11278)
Remove structure BilinForm
from LinearAlgebra/BilinearForm/Basic
and migrate all of _root_.BilinForm
to LinearMap.BilinForm
Closes: #10553
This isn't the end of the story, as there's still a lot of overlap between LinearAlgebra/BilinearForm
and LinearAlgebra/SesquilinearForm
but that can be sorted out in subsequent PRs.
Supersedes:
Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Christopher Hoskin <christopher.hoskin@overleaf.com> Co-authored-by: Christopher Hoskin <mans0954@users.noreply.github.com> Co-authored-by: Vierkantor <vierkantor@vierkantor.com>
@@ -135,7 +135,7 @@ variable [Module.Finite K L] [IsAlgClosed E]
/-- If `b` is a basis of a finite separable field extension `L/K`, then `Algebra.discr K b ≠ 0`. -/
theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) :
discr K b ≠ 0 := by
- rw [discr_def, traceMatrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
+ rw [discr_def, traceMatrix_of_basis, ← LinearMap.BilinForm.nondegenerate_iff_det_ne_zero]
exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
@@ -224,7 +224,7 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
nodup_roots (Separable.map (IsSeparable.separable K pb.gen))
have hroots : ∀ σ : L →ₐ[K] E, σ pb.gen ∈ (minpoly K pb.gen).aroots E := by
intro σ
- rw [mem_roots, IsRoot.definition, eval_map, ← aeval_def, aeval_algHom_apply]
+ rw [mem_roots, IsRoot.def, eval_map, ← aeval_def, aeval_algHom_apply]
repeat' simp [minpoly.ne_zero (IsSeparable.isIntegral K pb.gen)]
apply (algebraMap K E).injective
rw [RingHom.map_mul, RingHom.map_pow, RingHom.map_neg, RingHom.map_one,
@@ -243,7 +243,7 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
refine prod_bij' (fun i _ ↦ ⟨e i.2, e i.1 pb.gen⟩)
(fun σ hσ ↦ ⟨e.symm (PowerBasis.lift pb σ.2 ?_), e.symm σ.1⟩) ?_ ?_ ?_ ?_ (fun i _ ↦ by simp)
-- Porting note: `@mem_compl` was not necessary.
- <;> simp only [mem_sigma, mem_univ, Finset.mem_mk, hnodup.mem_erase_iff, IsRoot.definition,
+ <;> simp only [mem_sigma, mem_univ, Finset.mem_mk, hnodup.mem_erase_iff, IsRoot.def,
mem_roots', minpoly.ne_zero (IsSeparable.isIntegral K pb.gen), not_false_eq_true,
mem_singleton, true_and, @mem_compl _ _ _ (_), Sigma.forall, Equiv.apply_symm_apply,
PowerBasis.lift_gen, and_imp, implies_true, forall_const, Equiv.symm_apply_apply,
@@ -224,7 +224,7 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
nodup_roots (Separable.map (IsSeparable.separable K pb.gen))
have hroots : ∀ σ : L →ₐ[K] E, σ pb.gen ∈ (minpoly K pb.gen).aroots E := by
intro σ
- rw [mem_roots, IsRoot.def, eval_map, ← aeval_def, aeval_algHom_apply]
+ rw [mem_roots, IsRoot.definition, eval_map, ← aeval_def, aeval_algHom_apply]
repeat' simp [minpoly.ne_zero (IsSeparable.isIntegral K pb.gen)]
apply (algebraMap K E).injective
rw [RingHom.map_mul, RingHom.map_pow, RingHom.map_neg, RingHom.map_one,
@@ -243,11 +243,11 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
refine prod_bij' (fun i _ ↦ ⟨e i.2, e i.1 pb.gen⟩)
(fun σ hσ ↦ ⟨e.symm (PowerBasis.lift pb σ.2 ?_), e.symm σ.1⟩) ?_ ?_ ?_ ?_ (fun i _ ↦ by simp)
-- Porting note: `@mem_compl` was not necessary.
- <;> simp only [mem_sigma, mem_univ, Finset.mem_mk, hnodup.mem_erase_iff, IsRoot.def, mem_roots',
- minpoly.ne_zero (IsSeparable.isIntegral K pb.gen), not_false_eq_true, mem_singleton, true_and,
- @mem_compl _ _ _ (_), Sigma.forall, Equiv.apply_symm_apply, PowerBasis.lift_gen, and_imp,
- implies_true, forall_const, Equiv.symm_apply_apply, Sigma.ext_iff, Equiv.symm_apply_eq,
- heq_eq_eq, and_true] at *
+ <;> simp only [mem_sigma, mem_univ, Finset.mem_mk, hnodup.mem_erase_iff, IsRoot.definition,
+ mem_roots', minpoly.ne_zero (IsSeparable.isIntegral K pb.gen), not_false_eq_true,
+ mem_singleton, true_and, @mem_compl _ _ _ (_), Sigma.forall, Equiv.apply_symm_apply,
+ PowerBasis.lift_gen, and_imp, implies_true, forall_const, Equiv.symm_apply_apply,
+ Sigma.ext_iff, Equiv.symm_apply_eq, heq_eq_eq, and_true] at *
· simpa only [aeval_def, eval₂_eq_eval_map] using hσ.2.2
· exact fun a b hba ↦ ⟨fun h ↦ hba <| e.injective <| pb.algHom_ext h.symm, hroots _⟩
· rintro a b hba ha
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -57,7 +57,6 @@ open Matrix FiniteDimensional Fintype Polynomial Finset IntermediateField
namespace Algebra
variable (A : Type u) {B : Type v} (C : Type z) {ι : Type w} [DecidableEq ι]
-
variable [CommRing A] [CommRing B] [Algebra A B] [CommRing C] [Algebra A C]
section Discr
@@ -130,9 +129,7 @@ end Basic
section Field
variable (K : Type u) {L : Type v} (E : Type z) [Field K] [Field L] [Field E]
-
variable [Algebra K L] [Algebra K E]
-
variable [Module.Finite K L] [IsAlgClosed E]
/-- If `b` is a basis of a finite separable field extension `L/K`, then `Algebra.discr K b ≠ 0`. -/
refine
s (#10762)
I replaced a few "terminal" refine/refine'
s with exact
.
The strategy was very simple-minded: essentially any refine
whose following line had smaller indentation got replaced by exact
and then I cleaned up the mess.
This PR certainly leaves some further terminal refine
s, but maybe the current change is beneficial.
@@ -295,7 +295,7 @@ theorem discr_mul_isIntegral_mem_adjoin [IsSeparable K L] [IsIntegrallyClosed R]
rw [← smul_assoc, ← hr, algebraMap_smul]
refine' Subalgebra.smul_mem _ _ _
rw [B.basis_eq_pow i]
- refine' Subalgebra.pow_mem _ (subset_adjoin (Set.mem_singleton _)) _
+ exact Subalgebra.pow_mem _ (subset_adjoin (Set.mem_singleton _)) _
intro i
rw [← H, ← mulVec_smul] at cramer
replace cramer := congr_arg (mulVec (traceMatrix K B.basis)⁻¹) cramer
span_eq_top_of_linearIndependent_of_card_eq_finrank
to LinearIndependent.span_eq_top_of_card_eq_finrank
;LinearIndependent.span_eq_top_of_card_eq_finrank'
with different typeclass assumptions;rfl
to prove Algebra.discr_def
;Algebra.discr_not_zero_of_basis
.@@ -70,10 +70,7 @@ noncomputable def discr (A : Type u) {B : Type v} [CommRing A] [CommRing B] [Alg
[Fintype ι] (b : ι → B) := (traceMatrix A b).det
#align algebra.discr Algebra.discr
-theorem discr_def [Fintype ι] (b : ι → B) : discr A b = (traceMatrix A b).det := by
--- Porting note: `unfold discr` was not necessary. `rfl` still does not work.
- unfold discr
- convert rfl
+theorem discr_def [Fintype ι] (b : ι → B) : discr A b = (traceMatrix A b).det := rfl
variable {A C} in
/-- Mapping a family of vectors along an `AlgEquiv` preserves the discriminant. -/
@@ -141,19 +138,8 @@ variable [Module.Finite K L] [IsAlgClosed E]
/-- If `b` is a basis of a finite separable field extension `L/K`, then `Algebra.discr K b ≠ 0`. -/
theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) :
discr K b ≠ 0 := by
- cases isEmpty_or_nonempty ι
--- Porting note: the following proof was `simp [discr]`. Variations like `exact this` do not work.
- · have : det (traceMatrix K ↑b) ≠ 0 := by simp
- unfold discr
- convert this
- · have :=
- span_eq_top_of_linearIndependent_of_card_eq_finrank b.linearIndependent
- (finrank_eq_card_basis b).symm
- classical
- rw [discr_def, traceMatrix]
- simp_rw [← Basis.mk_apply b.linearIndependent this.ge]
- rw [← traceMatrix, traceMatrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
- exact traceForm_nondegenerate _ _
+ rw [discr_def, traceMatrix_of_basis, ← BilinForm.nondegenerate_iff_det_ne_zero]
+ exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
/-- If `b` is a basis of a finite separable field extension `L/K`,
Matrix.mulVec
and Matrix.vecMul
get infix notation (#10297)
Zulip discussion: https://leanprover.zulipchat.com/#narrow/stream/113488-general/topic/Notation.20for.20mul_vec.20and.20vec_mul
Co-authored-by: Martin Dvorak <mdvorak@ista.ac.at>
@@ -25,8 +25,8 @@ Given an `A`-algebra `B` and `b`, an `ι`-indexed family of elements of `B`, we
* `Algebra.discr_zero_of_not_linearIndependent` : if `b` is not linear independent, then
`Algebra.discr A b = 0`.
* `Algebra.discr_of_matrix_vecMul` and `Algebra.discr_of_matrix_mulVec` : formulas relating
- `Algebra.discr A ι b` with `Algebra.discr A ((P.map (algebraMap A B)).vecMul b)` and
- `Algebra.discr A ((P.map (algebraMap A B)).mulVec b)`.
+ `Algebra.discr A ι b` with `Algebra.discr A (b ᵥ* P.map (algebraMap A B))` and
+ `Algebra.discr A (P.map (algebraMap A B) *ᵥ b)`.
* `Algebra.discr_not_zero_of_basis` : over a field, if `b` is a basis, then
`Algebra.discr K b ≠ 0`.
* `Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two` : if `L/K` is a field extension and
@@ -98,7 +98,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
(hli : ¬LinearIndependent A b) : discr A b = 0 := by
classical
obtain ⟨g, hg, i, hi⟩ := Fintype.not_linearIndependent_iff.1 hli
- have : (traceMatrix A b).mulVec g = 0 := by
+ have : (traceMatrix A b) *ᵥ g = 0 := by
ext i
have : ∀ j, (trace A B) (b i * b j) * g j = (trace A B) (g j • b j * b i) := by
intro j;
@@ -113,17 +113,17 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
variable {A}
/-- Relation between `Algebra.discr A ι b` and
-`Algebra.discr A ((P.map (algebraMap A B)).vecMul b)`. -/
+`Algebra.discr A (b ᵥ* P.map (algebraMap A B))`. -/
theorem discr_of_matrix_vecMul (b : ι → B) (P : Matrix ι ι A) :
- discr A ((P.map (algebraMap A B)).vecMul b) = P.det ^ 2 * discr A b := by
+ discr A (b ᵥ* P.map (algebraMap A B)) = P.det ^ 2 * discr A b := by
rw [discr_def, traceMatrix_of_matrix_vecMul, det_mul, det_mul, det_transpose, mul_comm, ←
mul_assoc, discr_def, pow_two]
#align algebra.discr_of_matrix_vec_mul Algebra.discr_of_matrix_vecMul
/-- Relation between `Algebra.discr A ι b` and
-`Algebra.discr A ((P.map (algebraMap A B)).mulVec b)`. -/
+`Algebra.discr A ((P.map (algebraMap A B)) *ᵥ b)`. -/
theorem discr_of_matrix_mulVec (b : ι → B) (P : Matrix ι ι A) :
- discr A ((P.map (algebraMap A B)).mulVec b) = P.det ^ 2 * discr A b := by
+ discr A (P.map (algebraMap A B) *ᵥ b) = P.det ^ 2 * discr A b := by
rw [discr_def, traceMatrix_of_matrix_mulVec, det_mul, det_mul, det_transpose, mul_comm, ←
mul_assoc, discr_def, pow_two]
#align algebra.discr_of_matrix_mul_vec Algebra.discr_of_matrix_mulVec
@@ -295,7 +295,7 @@ theorem discr_mul_isIntegral_mem_adjoin [IsSeparable K L] [IsIntegrallyClosed R]
have hinv : IsUnit (traceMatrix K B.basis).det := by
simpa [← discr_def] using discr_isUnit_of_basis _ B.basis
have H :
- (traceMatrix K B.basis).det • (traceMatrix K B.basis).mulVec (B.basis.equivFun z) =
+ (traceMatrix K B.basis).det • (traceMatrix K B.basis) *ᵥ (B.basis.equivFun z) =
(traceMatrix K B.basis).det • fun i => trace K L (z * B.basis i) :=
by congr; exact traceMatrix_of_basis_mulVec _ _
have cramer := mulVec_cramer (traceMatrix K B.basis) fun i => trace K L (z * B.basis i)
Also rename Nat.even_mul_self_pred
for consistency with Nat.even_mul_succ_self
.
@@ -215,7 +215,7 @@ theorem discr_powerBasis_eq_prod'' [IsSeparable K L] (e : Fin pb.dim ≃ (L →
have hn : n = pb.dim := by
rw [← AlgHom.card K L E, ← Fintype.card_fin pb.dim]
exact card_congr (Equiv.symm e)
- have h₂ : 2 ∣ pb.dim * (pb.dim - 1) := even_iff_two_dvd.1 (Nat.even_mul_self_pred _)
+ have h₂ : 2 ∣ pb.dim * (pb.dim - 1) := pb.dim.even_mul_pred_self.two_dvd
have hne : ((2 : ℕ) : ℚ) ≠ 0 := by simp
have hle : 1 ≤ pb.dim := by
rw [← hn, Nat.one_le_iff_ne_zero, ← zero_lt_iff, FiniteDimensional.finrank_pos_iff]
$
with <|
(#9319)
See Zulip thread for the discussion.
@@ -266,11 +266,11 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
implies_true, forall_const, Equiv.symm_apply_apply, Sigma.ext_iff, Equiv.symm_apply_eq,
heq_eq_eq, and_true] at *
· simpa only [aeval_def, eval₂_eq_eval_map] using hσ.2.2
- · exact fun a b hba ↦ ⟨fun h ↦ hba $ e.injective $ pb.algHom_ext h.symm, hroots _⟩
+ · exact fun a b hba ↦ ⟨fun h ↦ hba <| e.injective <| pb.algHom_ext h.symm, hroots _⟩
· rintro a b hba ha
rw [ha, PowerBasis.lift_gen] at hba
exact hba.1 rfl
- · exact fun a b _ ↦ pb.algHom_ext $ pb.lift_gen _ _
+ · exact fun a b _ ↦ pb.algHom_ext <| pb.lift_gen _ _
#align algebra.discr_power_basis_eq_norm Algebra.discr_powerBasis_eq_norm
section Integral
Lemmas around this were a mess, throth in terms of names, statement and location. This PR standardises everything to be in Algebra.BigOperators.Basic
and changes the lemmas to take in InjOn
and SurjOn
assumptions where possible (and where impossible make sure the hypotheses are taken in the correct order) and moves the equality of functions hypothesis last.
Also add a few lemmas that help fix downstream uses by golfing.
From LeanAPAP and LeanCamCombi
@@ -257,35 +257,20 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
(IsAlgClosed.splits_codomain _) (hroots σ),
← Finset.prod_mk _ (hnodup.erase _)]
rw [prod_sigma', prod_sigma']
- refine'
- prod_bij (fun i _ => ⟨e i.2, e i.1 pb.gen⟩) (fun i hi => _) (fun i _ => by simp)
- (fun i j hi hj hij => _) fun σ hσ => _
- · simp only [true_and_iff, Finset.mem_mk, mem_univ, mem_sigma]
- rw [Multiset.mem_erase_of_ne fun h => ?_]
- · exact hroots _
--- Porting note: `@mem_compl` was not necessary.
- · simp only [true_and_iff, mem_univ, Ne.def, mem_sigma, @mem_compl _ _ _ (_),
- mem_singleton] at hi
- rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
- exact hi (e.injective <| pb.liftEquiv.injective <| Subtype.eq h.symm)
- · simp only [Sigma.mk.inj_iff, EmbeddingLike.apply_eq_iff_eq, heq_eq_eq] at hij
- have h := hij.2
- rw [← PowerBasis.liftEquiv_apply_coe, ← PowerBasis.liftEquiv_apply_coe] at h
- refine' Sigma.eq (Equiv.injective e (Equiv.injective _ (Subtype.eq h))) (by simp [hij.1])
- · simp only [true_and_iff, Finset.mem_mk, mem_univ, mem_sigma] at hσ ⊢
- simp only [Sigma.exists, exists_prop, mem_compl, mem_singleton, Ne.def]
- refine' ⟨e.symm (PowerBasis.lift pb σ.2 _), e.symm σ.1, ⟨_, Sigma.eq _ _⟩⟩
- · rw [aeval_def, eval₂_eq_eval_map, ← IsRoot.def, ← mem_roots]
- · exact Multiset.erase_subset _ _ hσ
- · simp [minpoly.ne_zero (IsSeparable.isIntegral K pb.gen)]
--- Porting note: the `simp only` was not needed.
- · simp only [@mem_compl _ _ _ (_), mem_singleton]
- intro h
- replace h := AlgHom.congr_fun (Equiv.injective _ h) pb.gen
- rw [PowerBasis.lift_gen] at h
- rw [← h] at hσ
- exact hnodup.not_mem_erase hσ
- all_goals simp
+ refine prod_bij' (fun i _ ↦ ⟨e i.2, e i.1 pb.gen⟩)
+ (fun σ hσ ↦ ⟨e.symm (PowerBasis.lift pb σ.2 ?_), e.symm σ.1⟩) ?_ ?_ ?_ ?_ (fun i _ ↦ by simp)
+ -- Porting note: `@mem_compl` was not necessary.
+ <;> simp only [mem_sigma, mem_univ, Finset.mem_mk, hnodup.mem_erase_iff, IsRoot.def, mem_roots',
+ minpoly.ne_zero (IsSeparable.isIntegral K pb.gen), not_false_eq_true, mem_singleton, true_and,
+ @mem_compl _ _ _ (_), Sigma.forall, Equiv.apply_symm_apply, PowerBasis.lift_gen, and_imp,
+ implies_true, forall_const, Equiv.symm_apply_apply, Sigma.ext_iff, Equiv.symm_apply_eq,
+ heq_eq_eq, and_true] at *
+ · simpa only [aeval_def, eval₂_eq_eval_map] using hσ.2.2
+ · exact fun a b hba ↦ ⟨fun h ↦ hba $ e.injective $ pb.algHom_ext h.symm, hroots _⟩
+ · rintro a b hba ha
+ rw [ha, PowerBasis.lift_gen] at hba
+ exact hba.1 rfl
+ · exact fun a b _ ↦ pb.algHom_ext $ pb.lift_gen _ _
#align algebra.discr_power_basis_eq_norm Algebra.discr_powerBasis_eq_norm
section Integral
Nsmul
-> NSMul
, Zpow
-> ZPow
, etc (#9067)
Normalising to naming convention rule number 6.
@@ -39,7 +39,7 @@ Given an `A`-algebra `B` and `b`, an `ι`-indexed family of elements of `B`, we
* `Algebra.discr_mul_isIntegral_mem_adjoin` : let `K` be the fraction field of an integrally
closed domain `R` and let `L` be a finite separable extension of `K`. Let `B : PowerBasis K L`
be such that `IsIntegral R B.gen`. Then for all, `z : L` we have
- `(discr K B.basis) • z ∈ adjoin R ({B.gen} : set L)`.
+ `(discr K B.basis) • z ∈ adjoin R ({B.gen} : Set L)`.
## Implementation details
@@ -303,7 +303,7 @@ theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsInte
/-- Let `K` be the fraction field of an integrally closed domain `R` and let `L` be a finite
separable extension of `K`. Let `B : PowerBasis K L` be such that `IsIntegral R B.gen`.
Then for all, `z : L` that are integral over `R`, we have
-`(discr K B.basis) • z ∈ adjoin R ({B.gen} : set L)`. -/
+`(discr K B.basis) • z ∈ adjoin R ({B.gen} : Set L)`. -/
theorem discr_mul_isIntegral_mem_adjoin [IsSeparable K L] [IsIntegrallyClosed R]
[IsFractionRing R K] {B : PowerBasis K L} (hint : IsIntegral R B.gen) {z : L}
(hz : IsIntegral R z) : discr K B.basis • z ∈ adjoin R ({B.gen} : Set L) := by
@@ -75,6 +75,12 @@ theorem discr_def [Fintype ι] (b : ι → B) : discr A b = (traceMatrix A b).de
unfold discr
convert rfl
+variable {A C} in
+/-- Mapping a family of vectors along an `AlgEquiv` preserves the discriminant. -/
+theorem discr_eq_discr_of_algEquiv [Fintype ι] (b : ι → B) (f : B ≃ₐ[A] C) :
+ Algebra.discr A b = Algebra.discr A (f ∘ b) := by
+ rw [discr_def]; congr; ext
+ simp_rw [traceMatrix_apply, traceForm_apply, Function.comp, ← map_mul f, trace_eq_of_algEquiv]
#align algebra.discr_def Algebra.discr_def
@@ -132,7 +138,7 @@ variable [Algebra K L] [Algebra K E]
variable [Module.Finite K L] [IsAlgClosed E]
-/-- Over a field, if `b` is a basis, then `Algebra.discr K b ≠ 0`. -/
+/-- If `b` is a basis of a finite separable field extension `L/K`, then `Algebra.discr K b ≠ 0`. -/
theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) :
discr K b ≠ 0 := by
cases isEmpty_or_nonempty ι
@@ -150,7 +156,8 @@ theorem discr_not_zero_of_basis [IsSeparable K L] (b : Basis ι K L) :
exact traceForm_nondegenerate _ _
#align algebra.discr_not_zero_of_basis Algebra.discr_not_zero_of_basis
-/-- Over a field, if `b` is a basis, then `Algebra.discr K b` is a unit. -/
+/-- If `b` is a basis of a finite separable field extension `L/K`,
+ then `Algebra.discr K b` is a unit. -/
theorem discr_isUnit_of_basis [IsSeparable K L] (b : Basis ι K L) : IsUnit (discr K b) :=
IsUnit.mk0 _ (discr_not_zero_of_basis _ _)
#align algebra.discr_is_unit_of_basis Algebra.discr_isUnit_of_basis
@@ -167,20 +174,6 @@ theorem discr_eq_det_embeddingsMatrixReindex_pow_two [IsSeparable K L] (e : ι
traceMatrix_eq_embeddingsMatrixReindex_mul_trans, det_mul, det_transpose, pow_two]
#align algebra.discr_eq_det_embeddings_matrix_reindex_pow_two Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two
-/-- Mapping a family of vectors along an `AlgEquiv` preserves the discriminant. -/
-theorem discr_eq_discr_of_algEquiv {L' : Type*} [Field L'] [Algebra K L'] [IsSeparable K L]
- (e : ι ≃ (L →ₐ[K] E)) (f : L ≃ₐ[K] L') :
- Algebra.discr K b = Algebra.discr K (f ∘ b) := by
- have : Module.Finite K L' := Module.Finite.equiv f.toLinearEquiv
- have : IsSeparable K L' := IsSeparable.of_algHom K L f.symm
- apply (NoZeroSMulDivisors.algebraMap_injective K E)
- let e' : ι ≃ (L' →ₐ[K] E) := e.trans (f.arrowCongr AlgEquiv.refl)
- rw [Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two _ _ _ e,
- Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two _ _ _ e']
- congr
- ext
- simp [Algebra.embeddingsMatrixReindex]
-
/-- The discriminant of a power basis. -/
theorem discr_powerBasis_eq_prod (e : Fin pb.dim ≃ (L →ₐ[K] E)) [IsSeparable K L] :
algebraMap K E (discr K pb.basis) =
@@ -3,7 +3,7 @@ Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-/
-import Mathlib.NumberTheory.NumberField.Basic
+import Mathlib.RingTheory.IntegrallyClosed
import Mathlib.RingTheory.Trace
import Mathlib.RingTheory.Norm
@@ -307,39 +307,6 @@ theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsInte
exact IsIntegral.det fun i j ↦ isIntegral_trace ((h i).mul (h j))
#align algebra.discr_is_integral Algebra.discr_isIntegral
-/-- If `b` and `b'` are `ℚ`-bases of a number field `K` such that
-`∀ i j, IsIntegral ℤ (b.toMatrix b' i j)` and `∀ i j, IsIntegral ℤ (b'.toMatrix b i j)` then
-`discr ℚ b = discr ℚ b'`. -/
-theorem discr_eq_discr_of_toMatrix_coeff_isIntegral [NumberField K] {b : Basis ι ℚ K}
- {b' : Basis ι' ℚ K} (h : ∀ i j, IsIntegral ℤ (b.toMatrix b' i j))
- (h' : ∀ i j, IsIntegral ℤ (b'.toMatrix b i j)) : discr ℚ b = discr ℚ b' := by
- replace h' : ∀ i j, IsIntegral ℤ (b'.toMatrix (b.reindex (b.indexEquiv b')) i j)
- · intro i j
- convert h' i ((b.indexEquiv b').symm j)
--- Porting note: `simp; rfl` was `simpa`.
- simp; rfl
- classical
- rw [← (b.reindex (b.indexEquiv b')).toMatrix_map_vecMul b', discr_of_matrix_vecMul,
- ← one_mul (discr ℚ b), Basis.coe_reindex, discr_reindex]
- congr
- have hint : IsIntegral ℤ ((b.reindex (b.indexEquiv b')).toMatrix b').det :=
- IsIntegral.det fun i j => h _ _
- obtain ⟨r, hr⟩ := IsIntegrallyClosed.isIntegral_iff.1 hint
- have hunit : IsUnit r := by
- have : IsIntegral ℤ (b'.toMatrix (b.reindex (b.indexEquiv b'))).det :=
- IsIntegral.det fun i j => h' _ _
- obtain ⟨r', hr'⟩ := IsIntegrallyClosed.isIntegral_iff.1 this
- refine' isUnit_iff_exists_inv.2 ⟨r', _⟩
- suffices algebraMap ℤ ℚ (r * r') = 1 by
- rw [← RingHom.map_one (algebraMap ℤ ℚ)] at this
- exact (IsFractionRing.injective ℤ ℚ) this
- rw [RingHom.map_mul, hr, hr', ← det_mul, Basis.toMatrix_mul_toMatrix_flip, det_one]
- rw [← RingHom.map_one (algebraMap ℤ ℚ), ← hr]
- cases' Int.isUnit_iff.1 hunit with hp hm
- · simp [hp]
- · simp [hm]
-#align algebra.discr_eq_discr_of_to_matrix_coeff_is_integral Algebra.discr_eq_discr_of_toMatrix_coeff_isIntegral
-
/-- Let `K` be the fraction field of an integrally closed domain `R` and let `L` be a finite
separable extension of `K`. Let `B : PowerBasis K L` be such that `IsIntegral R B.gen`.
Then for all, `z : L` that are integral over `R`, we have
@@ -167,6 +167,20 @@ theorem discr_eq_det_embeddingsMatrixReindex_pow_two [IsSeparable K L] (e : ι
traceMatrix_eq_embeddingsMatrixReindex_mul_trans, det_mul, det_transpose, pow_two]
#align algebra.discr_eq_det_embeddings_matrix_reindex_pow_two Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two
+/-- Mapping a family of vectors along an `AlgEquiv` preserves the discriminant. -/
+theorem discr_eq_discr_of_algEquiv {L' : Type*} [Field L'] [Algebra K L'] [IsSeparable K L]
+ (e : ι ≃ (L →ₐ[K] E)) (f : L ≃ₐ[K] L') :
+ Algebra.discr K b = Algebra.discr K (f ∘ b) := by
+ have : Module.Finite K L' := Module.Finite.equiv f.toLinearEquiv
+ have : IsSeparable K L' := IsSeparable.of_algHom K L f.symm
+ apply (NoZeroSMulDivisors.algebraMap_injective K E)
+ let e' : ι ≃ (L' →ₐ[K] E) := e.trans (f.arrowCongr AlgEquiv.refl)
+ rw [Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two _ _ _ e,
+ Algebra.discr_eq_det_embeddingsMatrixReindex_pow_two _ _ _ e']
+ congr
+ ext
+ simp [Algebra.embeddingsMatrixReindex]
+
/-- The discriminant of a power basis. -/
theorem discr_powerBasis_eq_prod (e : Fin pb.dim ≃ (L →ₐ[K] E)) [IsSeparable K L] :
algebraMap K E (discr K pb.basis) =
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>
@@ -290,7 +290,7 @@ variable {R : Type z} [CommRing R] [Algebra R K] [Algebra R L] [IsScalarTower R
theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsIntegral R (discr K b) := by
classical
rw [discr_def]
- exact IsIntegral.det fun i j => isIntegral_trace (IsIntegral.mul (h i) (h j))
+ exact IsIntegral.det fun i j ↦ isIntegral_trace ((h i).mul (h j))
#align algebra.discr_is_integral Algebra.discr_isIntegral
/-- If `b` and `b'` are `ℚ`-bases of a number field `K` such that
@@ -361,15 +361,10 @@ theorem discr_mul_isIntegral_mem_adjoin [IsSeparable K L] [IsIntegrallyClosed R]
Subalgebra.sum_mem _ fun σ _ => Subalgebra.zsmul_mem _ (Subalgebra.prod_mem _ fun j _ => _) _
by_cases hji : j = i
· simp only [updateColumn_apply, hji, eq_self_iff_true, PowerBasis.coe_basis]
- exact
- mem_bot.2
- (IsIntegrallyClosed.isIntegral_iff.1 <|
- isIntegral_trace <| IsIntegral.mul hz <| IsIntegral.pow hint _)
+ exact mem_bot.2 (IsIntegrallyClosed.isIntegral_iff.1 <| isIntegral_trace (hz.mul <| hint.pow _))
· simp only [updateColumn_apply, hji, PowerBasis.coe_basis]
- exact
- mem_bot.2
- (IsIntegrallyClosed.isIntegral_iff.1 <|
- isIntegral_trace <| IsIntegral.mul (IsIntegral.pow hint _) (IsIntegral.pow hint _))
+ exact mem_bot.2
+ (IsIntegrallyClosed.isIntegral_iff.1 <| isIntegral_trace <| (hint.pow _).mul (hint.pow _))
#align algebra.discr_mul_is_integral_mem_adjoin Algebra.discr_mul_isIntegral_mem_adjoin
end Integral
This PR tests a string-based tool for renaming declarations.
Inspired by this Zulip thread, I am trying to reduce the diff of #8406.
This PR makes the following renames:
| From | To |
@@ -290,7 +290,7 @@ variable {R : Type z} [CommRing R] [Algebra R K] [Algebra R L] [IsScalarTower R
theorem discr_isIntegral {b : ι → L} (h : ∀ i, IsIntegral R (b i)) : IsIntegral R (discr K b) := by
classical
rw [discr_def]
- exact IsIntegral.det fun i j => isIntegral_trace (isIntegral_mul (h i) (h j))
+ exact IsIntegral.det fun i j => isIntegral_trace (IsIntegral.mul (h i) (h j))
#align algebra.discr_is_integral Algebra.discr_isIntegral
/-- If `b` and `b'` are `ℚ`-bases of a number field `K` such that
@@ -364,12 +364,12 @@ theorem discr_mul_isIntegral_mem_adjoin [IsSeparable K L] [IsIntegrallyClosed R]
exact
mem_bot.2
(IsIntegrallyClosed.isIntegral_iff.1 <|
- isIntegral_trace <| isIntegral_mul hz <| IsIntegral.pow hint _)
+ isIntegral_trace <| IsIntegral.mul hz <| IsIntegral.pow hint _)
· simp only [updateColumn_apply, hji, PowerBasis.coe_basis]
exact
mem_bot.2
(IsIntegrallyClosed.isIntegral_iff.1 <|
- isIntegral_trace <| isIntegral_mul (IsIntegral.pow hint _) (IsIntegral.pow hint _))
+ isIntegral_trace <| IsIntegral.mul (IsIntegral.pow hint _) (IsIntegral.pow hint _))
#align algebra.discr_mul_is_integral_mem_adjoin Algebra.discr_mul_isIntegral_mem_adjoin
end Integral
This will improve spaces in the mathlib4 docs.
@@ -35,7 +35,7 @@ Given an `A`-algebra `B` and `b`, an `ι`-indexed family of elements of `B`, we
field `E` corresponding to `j : ι` via a bijection `e : ι ≃ (L →ₐ[K] E)`.
* `Algebra.discr_powerBasis_eq_prod` : the discriminant of a power basis.
* `Algebra.discr_isIntegral` : if `K` and `L` are fields and `IsScalarTower R K L`, if
- `b : ι → L` satisfies ` ∀ i, IsIntegral R (b i)`, then `IsIntegral R (discr K b)`.
+ `b : ι → L` satisfies `∀ i, IsIntegral R (b i)`, then `IsIntegral R (discr K b)`.
* `Algebra.discr_mul_isIntegral_mem_adjoin` : let `K` be the fraction field of an integrally
closed domain `R` and let `L` be a finite separable extension of `K`. Let `B : PowerBasis K L`
be such that `IsIntegral R B.gen`. Then for all, `z : L` we have
@@ -251,7 +251,7 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
← Finset.prod_mk _ (hnodup.erase _)]
rw [prod_sigma', prod_sigma']
refine'
- prod_bij (fun i _ => ⟨e i.2, e i.1 pb.gen⟩) (fun i hi => _) (fun i _ => by simp )
+ prod_bij (fun i _ => ⟨e i.2, e i.1 pb.gen⟩) (fun i hi => _) (fun i _ => by simp)
(fun i j hi hj hij => _) fun σ hσ => _
· simp only [true_and_iff, Finset.mem_mk, mem_univ, mem_sigma]
rw [Multiset.mem_erase_of_ne fun h => ?_]
_root_.map_sum
more consistently (#7189)
Also _root_.map_smul
when in the neighbourhood.
@@ -98,7 +98,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
intro j;
simp [mul_comm]
simp only [mulVec, dotProduct, traceMatrix_apply, Pi.zero_apply, traceForm_apply, fun j =>
- this j, ← LinearMap.map_sum, ← sum_mul, hg, zero_mul, LinearMap.map_zero]
+ this j, ← map_sum, ← sum_mul, hg, zero_mul, LinearMap.map_zero]
by_contra h
rw [discr_def] at h
simp [Matrix.eq_zero_of_mulVec_eq_zero h this] at hi
IsDomain
hypothesis from IsIntegrallyClosed
(#6126)
This PR modifies the definition of IsIntegrallyClosed
to drop the IsDomain
hypothesis. This change came out of the discussions of modifying IsDedekindDomain
to either extend IsDomain
or to drop IsDomain
entirely and change it to IsDedekindRing
. (The former being a dependency of this PR, the latter a follow-up.)
@@ -330,7 +330,7 @@ theorem discr_eq_discr_of_toMatrix_coeff_isIntegral [NumberField K] {b : Basis
separable extension of `K`. Let `B : PowerBasis K L` be such that `IsIntegral R B.gen`.
Then for all, `z : L` that are integral over `R`, we have
`(discr K B.basis) • z ∈ adjoin R ({B.gen} : set L)`. -/
-theorem discr_mul_isIntegral_mem_adjoin [IsDomain R] [IsSeparable K L] [IsIntegrallyClosed R]
+theorem discr_mul_isIntegral_mem_adjoin [IsSeparable K L] [IsIntegrallyClosed R]
[IsFractionRing R K] {B : PowerBasis K L} (hint : IsIntegral R B.gen) {z : L}
(hz : IsIntegral R z) : discr K B.basis • z ∈ adjoin R ({B.gen} : Set L) := by
have hinv : IsUnit (traceMatrix K B.basis).det := by
@@ -230,9 +230,9 @@ theorem discr_powerBasis_eq_norm [IsSeparable K L] :
refine' equivOfCardEq _
rw [Fintype.card_fin, AlgHom.card]
exact (PowerBasis.finrank pb).symm
- have hnodup : ((minpoly K pb.gen).map (algebraMap K E)).roots.Nodup :=
+ have hnodup : ((minpoly K pb.gen).aroots E).Nodup :=
nodup_roots (Separable.map (IsSeparable.separable K pb.gen))
- have hroots : ∀ σ : L →ₐ[K] E, σ pb.gen ∈ ((minpoly K pb.gen).map (algebraMap K E)).roots := by
+ have hroots : ∀ σ : L →ₐ[K] E, σ pb.gen ∈ (minpoly K pb.gen).aroots E := by
intro σ
rw [mem_roots, IsRoot.def, eval_map, ← aeval_def, aeval_algHom_apply]
repeat' simp [minpoly.ne_zero (IsSeparable.isIntegral K pb.gen)]
MulZeroClass.
in mul_zero
/zero_mul
(#6682)
Search&replace MulZeroClass.mul_zero
-> mul_zero
, MulZeroClass.zero_mul
-> zero_mul
.
These were introduced by Mathport, as the full name of mul_zero
is actually MulZeroClass.mul_zero
(it's exported with the short name).
@@ -98,7 +98,7 @@ theorem discr_zero_of_not_linearIndependent [IsDomain A] {b : ι → B}
intro j;
simp [mul_comm]
simp only [mulVec, dotProduct, traceMatrix_apply, Pi.zero_apply, traceForm_apply, fun j =>
- this j, ← LinearMap.map_sum, ← sum_mul, hg, MulZeroClass.zero_mul, LinearMap.map_zero]
+ this j, ← LinearMap.map_sum, ← sum_mul, hg, zero_mul, LinearMap.map_zero]
by_contra h
rw [discr_def] at h
simp [Matrix.eq_zero_of_mulVec_eq_zero h this] at hi
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -78,7 +78,7 @@ theorem discr_def [Fintype ι] (b : ι → B) : discr A b = (traceMatrix A b).de
#align algebra.discr_def Algebra.discr_def
-variable {ι' : Type _} [Fintype ι'] [Fintype ι] [DecidableEq ι']
+variable {ι' : Type*} [Fintype ι'] [Fintype ι] [DecidableEq ι']
section Basic
@@ -3,9 +3,9 @@ Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-/
+import Mathlib.NumberTheory.NumberField.Basic
import Mathlib.RingTheory.Trace
import Mathlib.RingTheory.Norm
-import Mathlib.NumberTheory.NumberField.Basic
#align_import ring_theory.discriminant from "leanprover-community/mathlib"@"3e068ece210655b7b9a9477c3aff38a492400aa1"
@@ -376,6 +376,21 @@ end Integral
end Field
+section Int
+
+/-- Two (finite) ℤ-bases have the same discriminant. -/
+theorem discr_eq_discr [Fintype ι] (b : Basis ι ℤ A) (b' : Basis ι ℤ A) :
+ Algebra.discr ℤ b = Algebra.discr ℤ b' := by
+ convert Algebra.discr_of_matrix_vecMul b' (b'.toMatrix b)
+ · rw [Basis.toMatrix_map_vecMul]
+ · suffices IsUnit (b'.toMatrix b).det by
+ rw [Int.isUnit_iff, ← sq_eq_one_iff] at this
+ rw [this, one_mul]
+ rw [← LinearMap.toMatrix_id_eq_basis_toMatrix b b']
+ exact LinearEquiv.isUnit_det (LinearEquiv.refl ℤ A) b b'
+
+end Int
+
end Discr
end Algebra
@@ -2,16 +2,13 @@
Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-
-! This file was ported from Lean 3 source module ring_theory.discriminant
-! leanprover-community/mathlib commit 3e068ece210655b7b9a9477c3aff38a492400aa1
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.RingTheory.Trace
import Mathlib.RingTheory.Norm
import Mathlib.NumberTheory.NumberField.Basic
+#align_import ring_theory.discriminant from "leanprover-community/mathlib"@"3e068ece210655b7b9a9477c3aff38a492400aa1"
+
/-!
# Discriminant of a family of vectors
The unported dependencies are