algebra.algebra.spectrum
⟷
Mathlib.Algebra.Algebra.Spectrum
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)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -180,7 +180,7 @@ theorem units_smul_resolvent {r : Rˣ} {s : R} {a : A} :
r • resolvent a (s : R) = resolvent (r⁻¹ • a) (r⁻¹ • s : R) :=
by
by_cases h : s ∈ spectrum R a
- · rw [mem_iff] at h
+ · rw [mem_iff] at h
simp only [resolvent, Algebra.algebraMap_eq_smul_one] at *
rw [smul_assoc, ← smul_sub]
have h' : ¬IsUnit (r⁻¹ • (s • 1 - a)) := fun hu =>
@@ -220,7 +220,7 @@ theorem inv_mem_resolventSet {r : Rˣ} {a : Aˣ} (h : (r : R) ∈ resolventSet R
rw [mul_sub, mul_smul_comm, a.mul_inv, mul_one]
have h₂ : (r • (↑a⁻¹ : A) - 1) * a = r • 1 - a := by
rw [sub_mul, smul_mul_assoc, a.inv_mul, one_mul]
- have hcomm : Commute (a : A) (r • (↑a⁻¹ : A) - 1) := by rwa [← h₂] at h₁
+ have hcomm : Commute (a : A) (r • (↑a⁻¹ : A) - 1) := by rwa [← h₂] at h₁
exact (hcomm.is_unit_mul_iff.mp (h₁.symm ▸ h)).2
#align spectrum.inv_mem_resolvent_set spectrum.inv_mem_resolventSet
-/
@@ -411,7 +411,7 @@ theorem zero_eq [Nontrivial A] : σ (0 : A) = {0} :=
refine' Set.Subset.antisymm _ (by simp [Algebra.algebraMap_eq_smul_one, mem_iff])
rw [spectrum, Set.compl_subset_comm]
intro k hk
- rw [Set.mem_compl_singleton_iff] at hk
+ rw [Set.mem_compl_singleton_iff] at hk
have : IsUnit (Units.mk0 k hk • (1 : A)) := IsUnit.smul (Units.mk0 k hk) isUnit_one
simpa [mem_resolvent_set_iff, Algebra.algebraMap_eq_smul_one]
#align spectrum.zero_eq spectrum.zero_eq
@@ -450,7 +450,7 @@ theorem nonzero_mul_eq_swap_mul (a b : A) : σ (a * b) \ {0} = σ (b * a) \ {0}
suffices h : ∀ x y : A, σ (x * y) \ {0} ⊆ σ (y * x) \ {0}
· exact Set.eq_of_subset_of_subset (h a b) (h b a)
· rintro _ _ k ⟨k_mem, k_neq⟩
- change k with ↑(Units.mk0 k k_neq) at k_mem
+ change k with ↑(Units.mk0 k k_neq) at k_mem
exact ⟨unit_mem_mul_iff_mem_swap_mul.mp k_mem, k_neq⟩
#align spectrum.nonzero_mul_eq_swap_mul spectrum.nonzero_mul_eq_swap_mul
-/
@@ -459,10 +459,10 @@ theorem nonzero_mul_eq_swap_mul (a b : A) : σ (a * b) \ {0} = σ (b * a) \ {0}
protected theorem map_inv (a : Aˣ) : (σ (a : A))⁻¹ = σ (↑a⁻¹ : A) :=
by
refine' Set.eq_of_subset_of_subset (fun k hk => _) fun k hk => _
- · rw [Set.mem_inv] at hk
+ · rw [Set.mem_inv] at hk
have : k ≠ 0 := by simpa only [inv_inv] using inv_ne_zero (ne_zero_of_mem_of_unit hk)
lift k to 𝕜ˣ using is_unit_iff_ne_zero.mpr this
- rw [← Units.val_inv_eq_inv_val k] at hk
+ rw [← Units.val_inv_eq_inv_val k] at hk
exact inv_mem_iff.mp hk
· lift k to 𝕜ˣ using is_unit_iff_ne_zero.mpr (ne_zero_of_mem_of_unit hk)
simpa only [Units.val_inv_eq_inv_val] using inv_mem_iff.mp hk
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2021 Jireh Loreaux. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
-/
-import Mathbin.Algebra.Star.Pointwise
-import Mathbin.Algebra.Star.Subalgebra
-import Mathbin.Tactic.NoncommRing
+import Algebra.Star.Pointwise
+import Algebra.Star.Subalgebra
+import Tactic.NoncommRing
#align_import algebra.algebra.spectrum from "leanprover-community/mathlib"@"6b31d1eebd64eab86d5bd9936bfaada6ca8b5842"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2021 Jireh Loreaux. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
-
-! This file was ported from Lean 3 source module algebra.algebra.spectrum
-! leanprover-community/mathlib commit 6b31d1eebd64eab86d5bd9936bfaada6ca8b5842
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.Star.Pointwise
import Mathbin.Algebra.Star.Subalgebra
import Mathbin.Tactic.NoncommRing
+#align_import algebra.algebra.spectrum from "leanprover-community/mathlib"@"6b31d1eebd64eab86d5bd9936bfaada6ca8b5842"
+
/-!
# Spectrum of an element in an algebra
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -57,7 +57,6 @@ variable (R : Type u) {A : Type v}
variable [CommSemiring R] [Ring A] [Algebra R A]
--- mathport name: «expr↑ₐ»
local notation "↑ₐ" => algebraMap R A
#print resolventSet /-
@@ -92,6 +91,7 @@ noncomputable def resolvent (a : A) (r : R) : A :=
#align resolvent resolvent
-/
+#print IsUnit.subInvSMul /-
/-- The unit `1 - r⁻¹ • a` constructed from `r • 1 - a` when the latter is a unit. -/
@[simps]
noncomputable def IsUnit.subInvSMul {r : Rˣ} {s : R} {a : A} (h : IsUnit <| r • ↑ₐ s - a) : Aˣ
@@ -101,6 +101,7 @@ noncomputable def IsUnit.subInvSMul {r : Rˣ} {s : R} {a : A} (h : IsUnit <| r
val_inv := by rw [mul_smul_comm, ← smul_mul_assoc, smul_sub, smul_inv_smul, h.mul_coe_inv]
inv_val := by rw [smul_mul_assoc, ← mul_smul_comm, smul_sub, smul_inv_smul, h.coe_inv_mul]
#align is_unit.sub_inv_smul IsUnit.subInvSMul
+-/
end Defs
@@ -112,40 +113,50 @@ variable {R : Type u} {A : Type v}
variable [CommSemiring R] [Ring A] [Algebra R A]
--- mathport name: exprσ
local notation "σ" => spectrum R
--- mathport name: «expr↑ₐ»
local notation "↑ₐ" => algebraMap R A
+#print spectrum.mem_iff /-
theorem mem_iff {r : R} {a : A} : r ∈ σ a ↔ ¬IsUnit (↑ₐ r - a) :=
Iff.rfl
#align spectrum.mem_iff spectrum.mem_iff
+-/
+#print spectrum.not_mem_iff /-
theorem not_mem_iff {r : R} {a : A} : r ∉ σ a ↔ IsUnit (↑ₐ r - a) := by apply not_iff_not.mp;
simp [Set.not_not_mem, mem_iff]
#align spectrum.not_mem_iff spectrum.not_mem_iff
+-/
variable (R)
+#print spectrum.zero_mem_iff /-
theorem zero_mem_iff {a : A} : (0 : R) ∈ σ a ↔ ¬IsUnit a := by
rw [mem_iff, map_zero, zero_sub, IsUnit.neg_iff]
#align spectrum.zero_mem_iff spectrum.zero_mem_iff
+-/
+#print spectrum.zero_not_mem_iff /-
theorem zero_not_mem_iff {a : A} : (0 : R) ∉ σ a ↔ IsUnit a := by
rw [zero_mem_iff, Classical.not_not]
#align spectrum.zero_not_mem_iff spectrum.zero_not_mem_iff
+-/
variable {R}
+#print spectrum.mem_resolventSet_of_left_right_inverse /-
theorem mem_resolventSet_of_left_right_inverse {r : R} {a b c : A} (h₁ : (↑ₐ r - a) * b = 1)
(h₂ : c * (↑ₐ r - a) = 1) : r ∈ resolventSet R a :=
Units.isUnit ⟨↑ₐ r - a, b, h₁, by rwa [← left_inv_eq_right_inv h₂ h₁]⟩
#align spectrum.mem_resolvent_set_of_left_right_inverse spectrum.mem_resolventSet_of_left_right_inverse
+-/
+#print spectrum.mem_resolventSet_iff /-
theorem mem_resolventSet_iff {r : R} {a : A} : r ∈ resolventSet R a ↔ IsUnit (↑ₐ r - a) :=
Iff.rfl
#align spectrum.mem_resolvent_set_iff spectrum.mem_resolventSet_iff
+-/
#print spectrum.resolventSet_of_subsingleton /-
@[simp]
@@ -161,10 +172,13 @@ theorem of_subsingleton [Subsingleton A] (a : A) : spectrum R a = ∅ := by
#align spectrum.of_subsingleton spectrum.of_subsingleton
-/
+#print spectrum.resolvent_eq /-
theorem resolvent_eq {a : A} {r : R} (h : r ∈ resolventSet R a) : resolvent a r = ↑h.Unit⁻¹ :=
Ring.inverse_unit h.Unit
#align spectrum.resolvent_eq spectrum.resolvent_eq
+-/
+#print spectrum.units_smul_resolvent /-
theorem units_smul_resolvent {r : Rˣ} {s : R} {a : A} :
r • resolvent a (s : R) = resolvent (r⁻¹ • a) (r⁻¹ • s : R) :=
by
@@ -182,6 +196,7 @@ theorem units_smul_resolvent {r : Rˣ} {s : R} {a : A} :
h'.coe_inv_sub_inv_smul]
simp only [Algebra.algebraMap_eq_smul_one, smul_assoc, smul_inv_smul]
#align spectrum.units_smul_resolvent spectrum.units_smul_resolvent
+-/
#print spectrum.units_smul_resolvent_self /-
theorem units_smul_resolvent_self {r : Rˣ} {a : A} :
@@ -191,11 +206,14 @@ theorem units_smul_resolvent_self {r : Rˣ} {a : A} :
#align spectrum.units_smul_resolvent_self spectrum.units_smul_resolvent_self
-/
+#print spectrum.isUnit_resolvent /-
/-- The resolvent is a unit when the argument is in the resolvent set. -/
theorem isUnit_resolvent {r : R} {a : A} : r ∈ resolventSet R a ↔ IsUnit (resolvent a r) :=
isUnit_ring_inverse.symm
#align spectrum.is_unit_resolvent spectrum.isUnit_resolvent
+-/
+#print spectrum.inv_mem_resolventSet /-
theorem inv_mem_resolventSet {r : Rˣ} {a : Aˣ} (h : (r : R) ∈ resolventSet R (a : A)) :
(↑r⁻¹ : R) ∈ resolventSet R (↑a⁻¹ : A) :=
by
@@ -208,32 +226,46 @@ theorem inv_mem_resolventSet {r : Rˣ} {a : Aˣ} (h : (r : R) ∈ resolventSet R
have hcomm : Commute (a : A) (r • (↑a⁻¹ : A) - 1) := by rwa [← h₂] at h₁
exact (hcomm.is_unit_mul_iff.mp (h₁.symm ▸ h)).2
#align spectrum.inv_mem_resolvent_set spectrum.inv_mem_resolventSet
+-/
+#print spectrum.inv_mem_iff /-
theorem inv_mem_iff {r : Rˣ} {a : Aˣ} : (r : R) ∈ σ (a : A) ↔ (↑r⁻¹ : R) ∈ σ (↑a⁻¹ : A) :=
not_iff_not.2 <| ⟨inv_mem_resolventSet, inv_mem_resolventSet⟩
#align spectrum.inv_mem_iff spectrum.inv_mem_iff
+-/
+#print spectrum.zero_mem_resolventSet_of_unit /-
theorem zero_mem_resolventSet_of_unit (a : Aˣ) : 0 ∈ resolventSet R (a : A) := by
simpa only [mem_resolvent_set_iff, ← not_mem_iff, zero_not_mem_iff] using a.is_unit
#align spectrum.zero_mem_resolvent_set_of_unit spectrum.zero_mem_resolventSet_of_unit
+-/
+#print spectrum.ne_zero_of_mem_of_unit /-
theorem ne_zero_of_mem_of_unit {a : Aˣ} {r : R} (hr : r ∈ σ (a : A)) : r ≠ 0 := fun hn =>
(hn ▸ hr) (zero_mem_resolventSet_of_unit a)
#align spectrum.ne_zero_of_mem_of_unit spectrum.ne_zero_of_mem_of_unit
+-/
+#print spectrum.add_mem_iff /-
theorem add_mem_iff {a : A} {r s : R} : r + s ∈ σ a ↔ r ∈ σ (-↑ₐ s + a) := by
simp only [mem_iff, sub_neg_eq_add, ← sub_sub, map_add]
#align spectrum.add_mem_iff spectrum.add_mem_iff
+-/
+#print spectrum.add_mem_add_iff /-
theorem add_mem_add_iff {a : A} {r s : R} : r + s ∈ σ (↑ₐ s + a) ↔ r ∈ σ a := by
rw [add_mem_iff, neg_add_cancel_left]
#align spectrum.add_mem_add_iff spectrum.add_mem_add_iff
+-/
+#print spectrum.smul_mem_smul_iff /-
theorem smul_mem_smul_iff {a : A} {s : R} {r : Rˣ} : r • s ∈ σ (r • a) ↔ s ∈ σ a := by
simp only [mem_iff, not_iff_not, Algebra.algebraMap_eq_smul_one, smul_assoc, ← smul_sub,
isUnit_smul_iff]
#align spectrum.smul_mem_smul_iff spectrum.smul_mem_smul_iff
+-/
+#print spectrum.unit_smul_eq_smul /-
theorem unit_smul_eq_smul (a : A) (r : Rˣ) : σ (r • a) = r • σ a :=
by
ext
@@ -244,7 +276,9 @@ theorem unit_smul_eq_smul (a : A) (r : Rˣ) : σ (r • a) = r • σ a :=
· exact fun h => ⟨r⁻¹ • x, ⟨h, by simp⟩⟩
· rintro ⟨_, _, x'_eq⟩; simpa [← x'_eq]
#align spectrum.unit_smul_eq_smul spectrum.unit_smul_eq_smul
+-/
+#print spectrum.unit_mem_mul_iff_mem_swap_mul /-
-- `r ∈ σ(a*b) ↔ r ∈ σ(b*a)` for any `r : Rˣ`
theorem unit_mem_mul_iff_mem_swap_mul {a b : A} {r : Rˣ} : ↑r ∈ σ (a * b) ↔ ↑r ∈ σ (b * a) :=
by
@@ -265,11 +299,14 @@ theorem unit_mem_mul_iff_mem_swap_mul {a b : A} {r : Rˣ} : ↑r ∈ σ (a * b)
IsUnit.smul_sub_iff_sub_inv_smul, ← smul_mul_assoc, ← mul_smul_comm r⁻¹ b a] using
Iff.intro (h₁ (r⁻¹ • a) b) (h₁ b (r⁻¹ • a))
#align spectrum.unit_mem_mul_iff_mem_swap_mul spectrum.unit_mem_mul_iff_mem_swap_mul
+-/
+#print spectrum.preimage_units_mul_eq_swap_mul /-
theorem preimage_units_mul_eq_swap_mul {a b : A} :
(coe : Rˣ → R) ⁻¹' σ (a * b) = coe ⁻¹' σ (b * a) :=
Set.ext fun _ => unit_mem_mul_iff_mem_swap_mul
#align spectrum.preimage_units_mul_eq_swap_mul spectrum.preimage_units_mul_eq_swap_mul
+-/
section Star
@@ -300,16 +337,16 @@ variable {R : Type u} {A : Type v}
variable [CommRing R] [Ring A] [Algebra R A]
--- mathport name: exprσ
local notation "σ" => spectrum R
--- mathport name: «expr↑ₐ»
local notation "↑ₐ" => algebraMap R A
+#print spectrum.subset_subalgebra /-
-- it would be nice to state this for `subalgebra_class`, but we don't have such a thing yet
theorem subset_subalgebra {S : Subalgebra R A} (a : S) : spectrum R (a : A) ⊆ spectrum R a :=
compl_subset_compl.2 fun _ => IsUnit.map S.val
#align spectrum.subset_subalgebra spectrum.subset_subalgebra
+-/
#print spectrum.subset_starSubalgebra /-
-- this is why it would be nice if `subset_subalgebra` was registered for `subalgebra_class`.
@@ -319,31 +356,43 @@ theorem subset_starSubalgebra [StarRing R] [StarRing A] [StarModule R A] {S : St
#align spectrum.subset_star_subalgebra spectrum.subset_starSubalgebra
-/
+#print spectrum.singleton_add_eq /-
theorem singleton_add_eq (a : A) (r : R) : {r} + σ a = σ (↑ₐ r + a) :=
ext fun x => by
rw [singleton_add, image_add_left, mem_preimage, add_comm, add_mem_iff, map_neg, neg_neg]
#align spectrum.singleton_add_eq spectrum.singleton_add_eq
+-/
+#print spectrum.add_singleton_eq /-
theorem add_singleton_eq (a : A) (r : R) : σ a + {r} = σ (a + ↑ₐ r) :=
add_comm {r} (σ a) ▸ add_comm (algebraMap R A r) a ▸ singleton_add_eq a r
#align spectrum.add_singleton_eq spectrum.add_singleton_eq
+-/
+#print spectrum.vadd_eq /-
theorem vadd_eq (a : A) (r : R) : r +ᵥ σ a = σ (↑ₐ r + a) :=
singleton_add.symm.trans <| singleton_add_eq a r
#align spectrum.vadd_eq spectrum.vadd_eq
+-/
+#print spectrum.neg_eq /-
theorem neg_eq (a : A) : -σ a = σ (-a) :=
Set.ext fun x => by
simp only [mem_neg, mem_iff, map_neg, ← neg_add', IsUnit.neg_iff, sub_neg_eq_add]
#align spectrum.neg_eq spectrum.neg_eq
+-/
+#print spectrum.singleton_sub_eq /-
theorem singleton_sub_eq (a : A) (r : R) : {r} - σ a = σ (↑ₐ r - a) := by
rw [sub_eq_add_neg, neg_eq, singleton_add_eq, sub_eq_add_neg]
#align spectrum.singleton_sub_eq spectrum.singleton_sub_eq
+-/
+#print spectrum.sub_singleton_eq /-
theorem sub_singleton_eq (a : A) (r : R) : σ a - {r} = σ (a - ↑ₐ r) := by
simpa only [neg_sub, neg_eq] using congr_arg Neg.neg (singleton_sub_eq a r)
#align spectrum.sub_singleton_eq spectrum.sub_singleton_eq
+-/
end ScalarRing
@@ -353,12 +402,11 @@ variable {𝕜 : Type u} {A : Type v}
variable [Field 𝕜] [Ring A] [Algebra 𝕜 A]
--- mathport name: exprσ
local notation "σ" => spectrum 𝕜
--- mathport name: «expr↑ₐ»
local notation "↑ₐ" => algebraMap 𝕜 A
+#print spectrum.zero_eq /-
/-- Without the assumption `nontrivial A`, then `0 : A` would be invertible. -/
@[simp]
theorem zero_eq [Nontrivial A] : σ (0 : A) = {0} :=
@@ -370,19 +418,25 @@ theorem zero_eq [Nontrivial A] : σ (0 : A) = {0} :=
have : IsUnit (Units.mk0 k hk • (1 : A)) := IsUnit.smul (Units.mk0 k hk) isUnit_one
simpa [mem_resolvent_set_iff, Algebra.algebraMap_eq_smul_one]
#align spectrum.zero_eq spectrum.zero_eq
+-/
+#print spectrum.scalar_eq /-
@[simp]
theorem scalar_eq [Nontrivial A] (k : 𝕜) : σ (↑ₐ k) = {k} := by
rw [← add_zero (↑ₐ k), ← singleton_add_eq, zero_eq, Set.singleton_add_singleton, add_zero]
#align spectrum.scalar_eq spectrum.scalar_eq
+-/
+#print spectrum.one_eq /-
@[simp]
theorem one_eq [Nontrivial A] : σ (1 : A) = {1} :=
calc
σ (1 : A) = σ (↑ₐ 1) := by rw [Algebra.algebraMap_eq_smul_one, one_smul]
_ = {1} := scalar_eq 1
#align spectrum.one_eq spectrum.one_eq
+-/
+#print spectrum.smul_eq_smul /-
/-- the assumption `(σ a).nonempty` is necessary and cannot be removed without
further conditions on the algebra `A` and scalar field `𝕜`. -/
theorem smul_eq_smul [Nontrivial A] (k : 𝕜) (a : A) (ha : (σ a).Nonempty) : σ (k • a) = k • σ a :=
@@ -391,7 +445,9 @@ theorem smul_eq_smul [Nontrivial A] (k : 𝕜) (a : A) (ha : (σ a).Nonempty) :
· simpa [ha, zero_smul_set]
· exact unit_smul_eq_smul a (Units.mk0 k h)
#align spectrum.smul_eq_smul spectrum.smul_eq_smul
+-/
+#print spectrum.nonzero_mul_eq_swap_mul /-
theorem nonzero_mul_eq_swap_mul (a b : A) : σ (a * b) \ {0} = σ (b * a) \ {0} :=
by
suffices h : ∀ x y : A, σ (x * y) \ {0} ⊆ σ (y * x) \ {0}
@@ -400,7 +456,9 @@ theorem nonzero_mul_eq_swap_mul (a b : A) : σ (a * b) \ {0} = σ (b * a) \ {0}
change k with ↑(Units.mk0 k k_neq) at k_mem
exact ⟨unit_mem_mul_iff_mem_swap_mul.mp k_mem, k_neq⟩
#align spectrum.nonzero_mul_eq_swap_mul spectrum.nonzero_mul_eq_swap_mul
+-/
+#print spectrum.map_inv /-
protected theorem map_inv (a : Aˣ) : (σ (a : A))⁻¹ = σ (↑a⁻¹ : A) :=
by
refine' Set.eq_of_subset_of_subset (fun k hk => _) fun k hk => _
@@ -412,6 +470,7 @@ protected theorem map_inv (a : Aˣ) : (σ (a : A))⁻¹ = σ (↑a⁻¹ : A) :=
· lift k to 𝕜ˣ using is_unit_iff_ne_zero.mpr (ne_zero_of_mem_of_unit hk)
simpa only [Units.val_inv_eq_inv_val] using inv_mem_iff.mp hk
#align spectrum.map_inv spectrum.map_inv
+-/
end ScalarField
@@ -425,20 +484,22 @@ variable {F R A B : Type _} [CommSemiring R] [Ring A] [Algebra R A] [Ring B] [Al
variable [AlgHomClass F R A B]
--- mathport name: exprσ
local notation "σ" => spectrum R
--- mathport name: «expr↑ₐ»
local notation "↑ₐ" => algebraMap R A
+#print AlgHom.mem_resolventSet_apply /-
theorem mem_resolventSet_apply (φ : F) {a : A} {r : R} (h : r ∈ resolventSet R a) :
r ∈ resolventSet R ((φ : A → B) a) := by
simpa only [map_sub, AlgHomClass.commutes] using h.map φ
#align alg_hom.mem_resolvent_set_apply AlgHom.mem_resolventSet_apply
+-/
+#print AlgHom.spectrum_apply_subset /-
theorem spectrum_apply_subset (φ : F) (a : A) : σ ((φ : A → B) a) ⊆ σ a := fun _ =>
mt (mem_resolventSet_apply φ)
#align alg_hom.spectrum_apply_subset AlgHom.spectrum_apply_subset
+-/
end CommSemiring
@@ -448,12 +509,11 @@ variable {F R A B : Type _} [CommRing R] [Ring A] [Algebra R A] [Ring B] [Algebr
variable [AlgHomClass F R A R]
--- mathport name: exprσ
local notation "σ" => spectrum R
--- mathport name: «expr↑ₐ»
local notation "↑ₐ" => algebraMap R A
+#print AlgHom.apply_mem_spectrum /-
theorem apply_mem_spectrum [Nontrivial R] (φ : F) (a : A) : φ a ∈ σ a :=
by
have h : ↑ₐ (φ a) - a ∈ (φ : A →+* R).ker := by
@@ -461,6 +521,7 @@ theorem apply_mem_spectrum [Nontrivial R] (φ : F) (a : A) : φ a ∈ σ a :=
Algebra.id.map_eq_id, RingHom.id_apply, sub_self]
simp only [spectrum.mem_iff, ← mem_nonunits_iff, coe_subset_nonunits (φ : A →+* R).ker_ne_top h]
#align alg_hom.apply_mem_spectrum AlgHom.apply_mem_spectrum
+-/
end CommRing
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module algebra.algebra.spectrum
-! leanprover-community/mathlib commit 58a272265b5e05f258161260dd2c5d247213cbd3
+! leanprover-community/mathlib commit 6b31d1eebd64eab86d5bd9936bfaada6ca8b5842
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -14,6 +14,9 @@ import Mathbin.Tactic.NoncommRing
/-!
# Spectrum of an element in an algebra
+
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
This file develops the basic theory of the spectrum of an element of an algebra.
This theory will serve as the foundation for spectral theory in Banach algebras.
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -253,13 +253,11 @@ theorem unit_mem_mul_iff_mem_swap_mul {a b : A} {r : Rˣ} : ↑r ∈ σ (a * b)
1 - y * x + y * ((1 - x * y) * h.unit.inv) * x :=
by noncomm_ring
_ = 1 := by simp only [Units.inv_eq_val_inv, IsUnit.mul_val_inv, mul_one, sub_add_cancel]
-
calc
(1 + y * (IsUnit.unit h).inv * x) * (1 - y * x) =
1 - y * x + y * (h.unit.inv * (1 - x * y)) * x :=
by noncomm_ring
_ = 1 := by simp only [Units.inv_eq_val_inv, IsUnit.val_inv_mul, mul_one, sub_add_cancel]
-
simpa only [mem_iff, not_iff_not, Algebra.algebraMap_eq_smul_one, ← Units.smul_def,
IsUnit.smul_sub_iff_sub_inv_smul, ← smul_mul_assoc, ← mul_smul_comm r⁻¹ b a] using
Iff.intro (h₁ (r⁻¹ • a) b) (h₁ b (r⁻¹ • a))
@@ -380,7 +378,6 @@ theorem one_eq [Nontrivial A] : σ (1 : A) = {1} :=
calc
σ (1 : A) = σ (↑ₐ 1) := by rw [Algebra.algebraMap_eq_smul_one, one_smul]
_ = {1} := scalar_eq 1
-
#align spectrum.one_eq spectrum.one_eq
/-- the assumption `(σ a).nonempty` is necessary and cannot be removed without
mathlib commit https://github.com/leanprover-community/mathlib/commit/58a272265b5e05f258161260dd2c5d247213cbd3
@@ -57,6 +57,7 @@ variable [CommSemiring R] [Ring A] [Algebra R A]
-- mathport name: «expr↑ₐ»
local notation "↑ₐ" => algebraMap R A
+#print resolventSet /-
-- definition and basic properties
/-- Given a commutative ring `R` and an `R`-algebra `A`, the *resolvent set* of `a : A`
is the `set R` consisting of those `r : R` for which `r•1 - a` is a unit of the
@@ -64,7 +65,9 @@ algebra `A`. -/
def resolventSet (a : A) : Set R :=
{r : R | IsUnit (↑ₐ r - a)}
#align resolvent_set resolventSet
+-/
+#print spectrum /-
/-- Given a commutative ring `R` and an `R`-algebra `A`, the *spectrum* of `a : A`
is the `set R` consisting of those `r : R` for which `r•1 - a` is not a unit of the
algebra `A`.
@@ -73,25 +76,28 @@ The spectrum is simply the complement of the resolvent set. -/
def spectrum (a : A) : Set R :=
resolventSet R aᶜ
#align spectrum spectrum
+-/
variable {R}
+#print resolvent /-
/-- Given an `a : A` where `A` is an `R`-algebra, the *resolvent* is
a map `R → A` which sends `r : R` to `(algebra_map R A r - a)⁻¹` when
`r ∈ resolvent R A` and `0` when `r ∈ spectrum R A`. -/
noncomputable def resolvent (a : A) (r : R) : A :=
Ring.inverse (↑ₐ r - a)
#align resolvent resolvent
+-/
/-- The unit `1 - r⁻¹ • a` constructed from `r • 1 - a` when the latter is a unit. -/
@[simps]
-noncomputable def IsUnit.subInvSmul {r : Rˣ} {s : R} {a : A} (h : IsUnit <| r • ↑ₐ s - a) : Aˣ
+noncomputable def IsUnit.subInvSMul {r : Rˣ} {s : R} {a : A} (h : IsUnit <| r • ↑ₐ s - a) : Aˣ
where
val := ↑ₐ s - r⁻¹ • a
inv := r • ↑h.Unit⁻¹
val_inv := by rw [mul_smul_comm, ← smul_mul_assoc, smul_sub, smul_inv_smul, h.mul_coe_inv]
inv_val := by rw [smul_mul_assoc, ← mul_smul_comm, smul_sub, smul_inv_smul, h.coe_inv_mul]
-#align is_unit.sub_inv_smul IsUnit.subInvSmul
+#align is_unit.sub_inv_smul IsUnit.subInvSMul
end Defs
@@ -138,15 +144,19 @@ theorem mem_resolventSet_iff {r : R} {a : A} : r ∈ resolventSet R a ↔ IsUnit
Iff.rfl
#align spectrum.mem_resolvent_set_iff spectrum.mem_resolventSet_iff
+#print spectrum.resolventSet_of_subsingleton /-
@[simp]
theorem resolventSet_of_subsingleton [Subsingleton A] (a : A) : resolventSet R a = Set.univ := by
simp_rw [resolventSet, Subsingleton.elim (algebraMap R A _ - a) 1, isUnit_one, Set.setOf_true]
#align spectrum.resolvent_set_of_subsingleton spectrum.resolventSet_of_subsingleton
+-/
+#print spectrum.of_subsingleton /-
@[simp]
theorem of_subsingleton [Subsingleton A] (a : A) : spectrum R a = ∅ := by
rw [spectrum, resolvent_set_of_subsingleton, Set.compl_univ]
#align spectrum.of_subsingleton spectrum.of_subsingleton
+-/
theorem resolvent_eq {a : A} {r : R} (h : r ∈ resolventSet R a) : resolvent a r = ↑h.Unit⁻¹ :=
Ring.inverse_unit h.Unit
@@ -170,11 +180,13 @@ theorem units_smul_resolvent {r : Rˣ} {s : R} {a : A} :
simp only [Algebra.algebraMap_eq_smul_one, smul_assoc, smul_inv_smul]
#align spectrum.units_smul_resolvent spectrum.units_smul_resolvent
+#print spectrum.units_smul_resolvent_self /-
theorem units_smul_resolvent_self {r : Rˣ} {a : A} :
r • resolvent a (r : R) = resolvent (r⁻¹ • a) (1 : R) := by
simpa only [Units.smul_def, Algebra.id.smul_eq_mul, Units.inv_mul] using
@units_smul_resolvent _ _ _ _ _ r r a
#align spectrum.units_smul_resolvent_self spectrum.units_smul_resolvent_self
+-/
/-- The resolvent is a unit when the argument is in the resolvent set. -/
theorem isUnit_resolvent {r : R} {a : A} : r ∈ resolventSet R a ↔ IsUnit (resolvent a r) :=
@@ -262,16 +274,20 @@ section Star
variable [InvolutiveStar R] [StarRing A] [StarModule R A]
+#print spectrum.star_mem_resolventSet_iff /-
theorem star_mem_resolventSet_iff {r : R} {a : A} :
star r ∈ resolventSet R a ↔ r ∈ resolventSet R (star a) := by
refine' ⟨fun h => _, fun h => _⟩ <;>
simpa only [mem_resolvent_set_iff, Algebra.algebraMap_eq_smul_one, star_sub, star_smul,
star_star, star_one] using IsUnit.star h
#align spectrum.star_mem_resolvent_set_iff spectrum.star_mem_resolventSet_iff
+-/
+#print spectrum.map_star /-
protected theorem map_star (a : A) : σ (star a) = star (σ a) := by ext;
simpa only [Set.mem_star, mem_iff, not_iff_not] using star_mem_resolvent_set_iff.symm
#align spectrum.map_star spectrum.map_star
+-/
end Star
@@ -294,11 +310,13 @@ theorem subset_subalgebra {S : Subalgebra R A} (a : S) : spectrum R (a : A) ⊆
compl_subset_compl.2 fun _ => IsUnit.map S.val
#align spectrum.subset_subalgebra spectrum.subset_subalgebra
+#print spectrum.subset_starSubalgebra /-
-- this is why it would be nice if `subset_subalgebra` was registered for `subalgebra_class`.
theorem subset_starSubalgebra [StarRing R] [StarRing A] [StarModule R A] {S : StarSubalgebra R A}
(a : S) : spectrum R (a : A) ⊆ spectrum R a :=
compl_subset_compl.2 fun _ => IsUnit.map S.Subtype
#align spectrum.subset_star_subalgebra spectrum.subset_starSubalgebra
+-/
theorem singleton_add_eq (a : A) (r : R) : {r} + σ a = σ (↑ₐ r + a) :=
ext fun x => by
mathlib commit https://github.com/leanprover-community/mathlib/commit/58a272265b5e05f258161260dd2c5d247213cbd3
@@ -4,13 +4,12 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
! This file was ported from Lean 3 source module algebra.algebra.spectrum
-! leanprover-community/mathlib commit 11dcb6b59dc9cc74e053b7ca8569bf6df4ac0f1e
+! leanprover-community/mathlib commit 58a272265b5e05f258161260dd2c5d247213cbd3
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.Algebra.Star.Pointwise
import Mathbin.Algebra.Star.Subalgebra
-import Mathbin.FieldTheory.IsAlgClosed.Basic
import Mathbin.Tactic.NoncommRing
/-!
@@ -36,8 +35,6 @@ This theory will serve as the foundation for spectral theory in Banach algebras.
units (of `R`) in `σ (a*b)` coincide with those in `σ (b*a)`.
* `spectrum.scalar_eq`: in a nontrivial algebra over a field, the spectrum of a scalar is
a singleton.
-* `spectrum.subset_polynomial_aeval`, `spectrum.map_polynomial_aeval_of_degree_pos`,
- `spectrum.map_polynomial_aeval_of_nonempty`: variations on the spectral mapping theorem.
## Notations
@@ -100,8 +97,6 @@ end Defs
namespace spectrum
-open scoped Polynomial
-
section ScalarSemiring
variable {R : Type u} {A : Type v}
@@ -224,8 +219,6 @@ theorem smul_mem_smul_iff {a : A} {s : R} {r : Rˣ} : r • s ∈ σ (r • a)
isUnit_smul_iff]
#align spectrum.smul_mem_smul_iff spectrum.smul_mem_smul_iff
-open scoped Polynomial
-
theorem unit_smul_eq_smul (a : A) (r : Rˣ) : σ (r • a) = r • σ a :=
by
ext
@@ -333,20 +326,6 @@ theorem sub_singleton_eq (a : A) (r : R) : σ a - {r} = σ (a - ↑ₐ r) := by
simpa only [neg_sub, neg_eq] using congr_arg Neg.neg (singleton_sub_eq a r)
#align spectrum.sub_singleton_eq spectrum.sub_singleton_eq
-open Polynomial
-
-theorem exists_mem_of_not_isUnit_aeval_prod [IsDomain R] {p : R[X]} {a : A} (hp : p ≠ 0)
- (h : ¬IsUnit (aeval a (Multiset.map (fun x : R => X - C x) p.roots).Prod)) :
- ∃ k : R, k ∈ σ a ∧ eval k p = 0 :=
- by
- rw [← Multiset.prod_toList, AlgHom.map_list_prod] at h
- replace h := mt List.prod_isUnit h
- simp only [not_forall, exists_prop, aeval_C, Multiset.mem_toList, List.mem_map, aeval_X,
- exists_exists_and_eq_and, Multiset.mem_map, AlgHom.map_sub] at h
- rcases h with ⟨r, r_mem, r_nu⟩
- exact ⟨r, by rwa [mem_iff, ← IsUnit.sub_iff], by rwa [← is_root.def, ← mem_roots hp]⟩
-#align spectrum.exists_mem_of_not_is_unit_aeval_prod spectrum.exists_mem_of_not_isUnit_aeval_prod
-
end ScalarRing
section ScalarField
@@ -416,97 +395,6 @@ protected theorem map_inv (a : Aˣ) : (σ (a : A))⁻¹ = σ (↑a⁻¹ : A) :=
simpa only [Units.val_inv_eq_inv_val] using inv_mem_iff.mp hk
#align spectrum.map_inv spectrum.map_inv
-open Polynomial
-
-/-- Half of the spectral mapping theorem for polynomials. We prove it separately
-because it holds over any field, whereas `spectrum.map_polynomial_aeval_of_degree_pos` and
-`spectrum.map_polynomial_aeval_of_nonempty` need the field to be algebraically closed. -/
-theorem subset_polynomial_aeval (a : A) (p : 𝕜[X]) : (fun k => eval k p) '' σ a ⊆ σ (aeval a p) :=
- by
- rintro _ ⟨k, hk, rfl⟩
- let q := C (eval k p) - p
- have hroot : is_root q k := by simp only [eval_C, eval_sub, sub_self, is_root.def]
- rw [← mul_div_eq_iff_is_root, ← neg_mul_neg, neg_sub] at hroot
- have aeval_q_eq : ↑ₐ (eval k p) - aeval a p = aeval a q := by
- simp only [aeval_C, AlgHom.map_sub, sub_left_inj]
- rw [mem_iff, aeval_q_eq, ← hroot, aeval_mul]
- have hcomm := (Commute.all (C k - X) (-(q / (X - C k)))).map (aeval a)
- apply mt fun h => (hcomm.is_unit_mul_iff.mp h).1
- simpa only [aeval_X, aeval_C, AlgHom.map_sub] using hk
-#align spectrum.subset_polynomial_aeval spectrum.subset_polynomial_aeval
-
-/-- The *spectral mapping theorem* for polynomials. Note: the assumption `degree p > 0`
-is necessary in case `σ a = ∅`, for then the left-hand side is `∅` and the right-hand side,
-assuming `[nontrivial A]`, is `{k}` where `p = polynomial.C k`. -/
-theorem map_polynomial_aeval_of_degree_pos [IsAlgClosed 𝕜] (a : A) (p : 𝕜[X])
- (hdeg : 0 < degree p) : σ (aeval a p) = (fun k => eval k p) '' σ a :=
- by
- -- handle the easy direction via `spectrum.subset_polynomial_aeval`
- refine' Set.eq_of_subset_of_subset (fun k hk => _) (subset_polynomial_aeval a p)
- -- write `C k - p` product of linear factors and a constant; show `C k - p ≠ 0`.
- have hprod := eq_prod_roots_of_splits_id (IsAlgClosed.splits (C k - p))
- have h_ne : C k - p ≠ 0 :=
- ne_zero_of_degree_gt
- (by rwa [degree_sub_eq_right_of_degree_lt (lt_of_le_of_lt degree_C_le hdeg)])
- have lead_ne := leading_coeff_ne_zero.mpr h_ne
- have lead_unit := (Units.map ↑ₐ.toMonoidHom (Units.mk0 _ lead_ne)).IsUnit
- /- leading coefficient is a unit so product of linear factors is not a unit;
- apply `exists_mem_of_not_is_unit_aeval_prod`. -/
- have p_a_eq : aeval a (C k - p) = ↑ₐ k - aeval a p := by
- simp only [aeval_C, AlgHom.map_sub, sub_left_inj]
- rw [mem_iff, ← p_a_eq, hprod, aeval_mul, ((Commute.all _ _).map (aeval a)).isUnit_mul_iff,
- aeval_C] at hk
- replace hk := exists_mem_of_not_is_unit_aeval_prod h_ne (not_and.mp hk lead_unit)
- rcases hk with ⟨r, r_mem, r_ev⟩
- exact ⟨r, r_mem, symm (by simpa [eval_sub, eval_C, sub_eq_zero] using r_ev)⟩
-#align spectrum.map_polynomial_aeval_of_degree_pos spectrum.map_polynomial_aeval_of_degree_pos
-
-/-- In this version of the spectral mapping theorem, we assume the spectrum
-is nonempty instead of assuming the degree of the polynomial is positive. -/
-theorem map_polynomial_aeval_of_nonempty [IsAlgClosed 𝕜] (a : A) (p : 𝕜[X])
- (hnon : (σ a).Nonempty) : σ (aeval a p) = (fun k => eval k p) '' σ a :=
- by
- nontriviality A
- refine' Or.elim (le_or_gt (degree p) 0) (fun h => _) (map_polynomial_aeval_of_degree_pos a p)
- · rw [eq_C_of_degree_le_zero h]
- simp only [Set.image_congr, eval_C, aeval_C, scalar_eq, Set.Nonempty.image_const hnon]
-#align spectrum.map_polynomial_aeval_of_nonempty spectrum.map_polynomial_aeval_of_nonempty
-
-/-- A specialization of `spectrum.subset_polynomial_aeval` to monic monomials for convenience. -/
-theorem pow_image_subset (a : A) (n : ℕ) : (fun x => x ^ n) '' σ a ⊆ σ (a ^ n) := by
- simpa only [eval_pow, eval_X, aeval_X_pow] using subset_polynomial_aeval a (X ^ n : 𝕜[X])
-#align spectrum.pow_image_subset spectrum.pow_image_subset
-
-/-- A specialization of `spectrum.map_polynomial_aeval_of_nonempty` to monic monomials for
-convenience. -/
-theorem map_pow_of_pos [IsAlgClosed 𝕜] (a : A) {n : ℕ} (hn : 0 < n) :
- σ (a ^ n) = (fun x => x ^ n) '' σ a := by
- simpa only [aeval_X_pow, eval_pow, eval_X] using
- map_polynomial_aeval_of_degree_pos a (X ^ n : 𝕜[X]) (by rw_mod_cast [degree_X_pow]; exact hn)
-#align spectrum.map_pow_of_pos spectrum.map_pow_of_pos
-
-/-- A specialization of `spectrum.map_polynomial_aeval_of_nonempty` to monic monomials for
-convenience. -/
-theorem map_pow_of_nonempty [IsAlgClosed 𝕜] {a : A} (ha : (σ a).Nonempty) (n : ℕ) :
- σ (a ^ n) = (fun x => x ^ n) '' σ a := by
- simpa only [aeval_X_pow, eval_pow, eval_X] using map_polynomial_aeval_of_nonempty a (X ^ n) ha
-#align spectrum.map_pow_of_nonempty spectrum.map_pow_of_nonempty
-
-variable (𝕜)
-
--- We will use this both to show eigenvalues exist, and to prove Schur's lemma.
-/-- Every element `a` in a nontrivial finite-dimensional algebra `A`
-over an algebraically closed field `𝕜` has non-empty spectrum. -/
-theorem nonempty_of_isAlgClosed_of_finiteDimensional [IsAlgClosed 𝕜] [Nontrivial A]
- [I : FiniteDimensional 𝕜 A] (a : A) : ∃ k : 𝕜, k ∈ σ a :=
- by
- obtain ⟨p, ⟨h_mon, h_eval_p⟩⟩ := isIntegral_of_noetherian (IsNoetherian.iff_fg.2 I) a
- have nu : ¬IsUnit (aeval a p) := by rw [← aeval_def] at h_eval_p ; rw [h_eval_p]; simp
- rw [eq_prod_roots_of_monic_of_splits_id h_mon (IsAlgClosed.splits p)] at nu
- obtain ⟨k, hk, _⟩ := exists_mem_of_not_is_unit_aeval_prod (monic.ne_zero h_mon) nu
- exact ⟨k, hk⟩
-#align spectrum.nonempty_of_is_alg_closed_of_finite_dimensional spectrum.nonempty_of_isAlgClosed_of_finiteDimensional
-
end ScalarField
end spectrum
@@ -515,7 +403,7 @@ namespace AlgHom
section CommSemiring
-variable {F R A B : Type _} [CommRing R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
+variable {F R A B : Type _} [CommSemiring R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
variable [AlgHomClass F R A B]
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -65,7 +65,7 @@ local notation "↑ₐ" => algebraMap R A
is the `set R` consisting of those `r : R` for which `r•1 - a` is a unit of the
algebra `A`. -/
def resolventSet (a : A) : Set R :=
- { r : R | IsUnit (↑ₐ r - a) }
+ {r : R | IsUnit (↑ₐ r - a)}
#align resolvent_set resolventSet
/-- Given a commutative ring `R` and an `R`-algebra `A`, the *spectrum* of `a : A`
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -161,7 +161,7 @@ theorem units_smul_resolvent {r : Rˣ} {s : R} {a : A} :
r • resolvent a (s : R) = resolvent (r⁻¹ • a) (r⁻¹ • s : R) :=
by
by_cases h : s ∈ spectrum R a
- · rw [mem_iff] at h
+ · rw [mem_iff] at h
simp only [resolvent, Algebra.algebraMap_eq_smul_one] at *
rw [smul_assoc, ← smul_sub]
have h' : ¬IsUnit (r⁻¹ • (s • 1 - a)) := fun hu =>
@@ -189,13 +189,13 @@ theorem isUnit_resolvent {r : R} {a : A} : r ∈ resolventSet R a ↔ IsUnit (re
theorem inv_mem_resolventSet {r : Rˣ} {a : Aˣ} (h : (r : R) ∈ resolventSet R (a : A)) :
(↑r⁻¹ : R) ∈ resolventSet R (↑a⁻¹ : A) :=
by
- rw [mem_resolvent_set_iff, Algebra.algebraMap_eq_smul_one, ← Units.smul_def] at h⊢
+ rw [mem_resolvent_set_iff, Algebra.algebraMap_eq_smul_one, ← Units.smul_def] at h ⊢
rw [IsUnit.smul_sub_iff_sub_inv_smul, inv_inv, IsUnit.sub_iff]
have h₁ : (a : A) * (r • (↑a⁻¹ : A) - 1) = r • 1 - a := by
rw [mul_sub, mul_smul_comm, a.mul_inv, mul_one]
have h₂ : (r • (↑a⁻¹ : A) - 1) * a = r • 1 - a := by
rw [sub_mul, smul_mul_assoc, a.inv_mul, one_mul]
- have hcomm : Commute (a : A) (r • (↑a⁻¹ : A) - 1) := by rwa [← h₂] at h₁
+ have hcomm : Commute (a : A) (r • (↑a⁻¹ : A) - 1) := by rwa [← h₂] at h₁
exact (hcomm.is_unit_mul_iff.mp (h₁.symm ▸ h)).2
#align spectrum.inv_mem_resolvent_set spectrum.inv_mem_resolventSet
@@ -339,10 +339,10 @@ theorem exists_mem_of_not_isUnit_aeval_prod [IsDomain R] {p : R[X]} {a : A} (hp
(h : ¬IsUnit (aeval a (Multiset.map (fun x : R => X - C x) p.roots).Prod)) :
∃ k : R, k ∈ σ a ∧ eval k p = 0 :=
by
- rw [← Multiset.prod_toList, AlgHom.map_list_prod] at h
+ rw [← Multiset.prod_toList, AlgHom.map_list_prod] at h
replace h := mt List.prod_isUnit h
simp only [not_forall, exists_prop, aeval_C, Multiset.mem_toList, List.mem_map, aeval_X,
- exists_exists_and_eq_and, Multiset.mem_map, AlgHom.map_sub] at h
+ exists_exists_and_eq_and, Multiset.mem_map, AlgHom.map_sub] at h
rcases h with ⟨r, r_mem, r_nu⟩
exact ⟨r, by rwa [mem_iff, ← IsUnit.sub_iff], by rwa [← is_root.def, ← mem_roots hp]⟩
#align spectrum.exists_mem_of_not_is_unit_aeval_prod spectrum.exists_mem_of_not_isUnit_aeval_prod
@@ -368,7 +368,7 @@ theorem zero_eq [Nontrivial A] : σ (0 : A) = {0} :=
refine' Set.Subset.antisymm _ (by simp [Algebra.algebraMap_eq_smul_one, mem_iff])
rw [spectrum, Set.compl_subset_comm]
intro k hk
- rw [Set.mem_compl_singleton_iff] at hk
+ rw [Set.mem_compl_singleton_iff] at hk
have : IsUnit (Units.mk0 k hk • (1 : A)) := IsUnit.smul (Units.mk0 k hk) isUnit_one
simpa [mem_resolvent_set_iff, Algebra.algebraMap_eq_smul_one]
#align spectrum.zero_eq spectrum.zero_eq
@@ -400,17 +400,17 @@ theorem nonzero_mul_eq_swap_mul (a b : A) : σ (a * b) \ {0} = σ (b * a) \ {0}
suffices h : ∀ x y : A, σ (x * y) \ {0} ⊆ σ (y * x) \ {0}
· exact Set.eq_of_subset_of_subset (h a b) (h b a)
· rintro _ _ k ⟨k_mem, k_neq⟩
- change k with ↑(Units.mk0 k k_neq) at k_mem
+ change k with ↑(Units.mk0 k k_neq) at k_mem
exact ⟨unit_mem_mul_iff_mem_swap_mul.mp k_mem, k_neq⟩
#align spectrum.nonzero_mul_eq_swap_mul spectrum.nonzero_mul_eq_swap_mul
protected theorem map_inv (a : Aˣ) : (σ (a : A))⁻¹ = σ (↑a⁻¹ : A) :=
by
refine' Set.eq_of_subset_of_subset (fun k hk => _) fun k hk => _
- · rw [Set.mem_inv] at hk
+ · rw [Set.mem_inv] at hk
have : k ≠ 0 := by simpa only [inv_inv] using inv_ne_zero (ne_zero_of_mem_of_unit hk)
lift k to 𝕜ˣ using is_unit_iff_ne_zero.mpr this
- rw [← Units.val_inv_eq_inv_val k] at hk
+ rw [← Units.val_inv_eq_inv_val k] at hk
exact inv_mem_iff.mp hk
· lift k to 𝕜ˣ using is_unit_iff_ne_zero.mpr (ne_zero_of_mem_of_unit hk)
simpa only [Units.val_inv_eq_inv_val] using inv_mem_iff.mp hk
@@ -426,7 +426,7 @@ theorem subset_polynomial_aeval (a : A) (p : 𝕜[X]) : (fun k => eval k p) ''
rintro _ ⟨k, hk, rfl⟩
let q := C (eval k p) - p
have hroot : is_root q k := by simp only [eval_C, eval_sub, sub_self, is_root.def]
- rw [← mul_div_eq_iff_is_root, ← neg_mul_neg, neg_sub] at hroot
+ rw [← mul_div_eq_iff_is_root, ← neg_mul_neg, neg_sub] at hroot
have aeval_q_eq : ↑ₐ (eval k p) - aeval a p = aeval a q := by
simp only [aeval_C, AlgHom.map_sub, sub_left_inj]
rw [mem_iff, aeval_q_eq, ← hroot, aeval_mul]
@@ -455,7 +455,7 @@ theorem map_polynomial_aeval_of_degree_pos [IsAlgClosed 𝕜] (a : A) (p : 𝕜[
have p_a_eq : aeval a (C k - p) = ↑ₐ k - aeval a p := by
simp only [aeval_C, AlgHom.map_sub, sub_left_inj]
rw [mem_iff, ← p_a_eq, hprod, aeval_mul, ((Commute.all _ _).map (aeval a)).isUnit_mul_iff,
- aeval_C] at hk
+ aeval_C] at hk
replace hk := exists_mem_of_not_is_unit_aeval_prod h_ne (not_and.mp hk lead_unit)
rcases hk with ⟨r, r_mem, r_ev⟩
exact ⟨r, r_mem, symm (by simpa [eval_sub, eval_C, sub_eq_zero] using r_ev)⟩
@@ -501,8 +501,8 @@ theorem nonempty_of_isAlgClosed_of_finiteDimensional [IsAlgClosed 𝕜] [Nontriv
[I : FiniteDimensional 𝕜 A] (a : A) : ∃ k : 𝕜, k ∈ σ a :=
by
obtain ⟨p, ⟨h_mon, h_eval_p⟩⟩ := isIntegral_of_noetherian (IsNoetherian.iff_fg.2 I) a
- have nu : ¬IsUnit (aeval a p) := by rw [← aeval_def] at h_eval_p; rw [h_eval_p]; simp
- rw [eq_prod_roots_of_monic_of_splits_id h_mon (IsAlgClosed.splits p)] at nu
+ have nu : ¬IsUnit (aeval a p) := by rw [← aeval_def] at h_eval_p ; rw [h_eval_p]; simp
+ rw [eq_prod_roots_of_monic_of_splits_id h_mon (IsAlgClosed.splits p)] at nu
obtain ⟨k, hk, _⟩ := exists_mem_of_not_is_unit_aeval_prod (monic.ne_zero h_mon) nu
exact ⟨k, hk⟩
#align spectrum.nonempty_of_is_alg_closed_of_finite_dimensional spectrum.nonempty_of_isAlgClosed_of_finiteDimensional
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -47,7 +47,7 @@ This theory will serve as the foundation for spectral theory in Banach algebras.
open Set
-open Pointwise
+open scoped Pointwise
universe u v
@@ -100,7 +100,7 @@ end Defs
namespace spectrum
-open Polynomial
+open scoped Polynomial
section ScalarSemiring
@@ -224,7 +224,7 @@ theorem smul_mem_smul_iff {a : A} {s : R} {r : Rˣ} : r • s ∈ σ (r • a)
isUnit_smul_iff]
#align spectrum.smul_mem_smul_iff spectrum.smul_mem_smul_iff
-open Polynomial
+open scoped Polynomial
theorem unit_smul_eq_smul (a : A) (r : Rˣ) : σ (r • a) = r • σ a :=
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -118,9 +118,7 @@ theorem mem_iff {r : R} {a : A} : r ∈ σ a ↔ ¬IsUnit (↑ₐ r - a) :=
Iff.rfl
#align spectrum.mem_iff spectrum.mem_iff
-theorem not_mem_iff {r : R} {a : A} : r ∉ σ a ↔ IsUnit (↑ₐ r - a) :=
- by
- apply not_iff_not.mp
+theorem not_mem_iff {r : R} {a : A} : r ∉ σ a ↔ IsUnit (↑ₐ r - a) := by apply not_iff_not.mp;
simp [Set.not_not_mem, mem_iff]
#align spectrum.not_mem_iff spectrum.not_mem_iff
@@ -236,8 +234,7 @@ theorem unit_smul_eq_smul (a : A) (r : Rˣ) : σ (r • a) = r • σ a :=
rw [smul_mem_smul_iff]
constructor
· exact fun h => ⟨r⁻¹ • x, ⟨h, by simp⟩⟩
- · rintro ⟨_, _, x'_eq⟩
- simpa [← x'_eq]
+ · rintro ⟨_, _, x'_eq⟩; simpa [← x'_eq]
#align spectrum.unit_smul_eq_smul spectrum.unit_smul_eq_smul
-- `r ∈ σ(a*b) ↔ r ∈ σ(b*a)` for any `r : Rˣ`
@@ -279,9 +276,7 @@ theorem star_mem_resolventSet_iff {r : R} {a : A} :
star_star, star_one] using IsUnit.star h
#align spectrum.star_mem_resolvent_set_iff spectrum.star_mem_resolventSet_iff
-protected theorem map_star (a : A) : σ (star a) = star (σ a) :=
- by
- ext
+protected theorem map_star (a : A) : σ (star a) = star (σ a) := by ext;
simpa only [Set.mem_star, mem_iff, not_iff_not] using star_mem_resolvent_set_iff.symm
#align spectrum.map_star spectrum.map_star
@@ -487,10 +482,7 @@ convenience. -/
theorem map_pow_of_pos [IsAlgClosed 𝕜] (a : A) {n : ℕ} (hn : 0 < n) :
σ (a ^ n) = (fun x => x ^ n) '' σ a := by
simpa only [aeval_X_pow, eval_pow, eval_X] using
- map_polynomial_aeval_of_degree_pos a (X ^ n : 𝕜[X])
- (by
- rw_mod_cast [degree_X_pow]
- exact hn)
+ map_polynomial_aeval_of_degree_pos a (X ^ n : 𝕜[X]) (by rw_mod_cast [degree_X_pow]; exact hn)
#align spectrum.map_pow_of_pos spectrum.map_pow_of_pos
/-- A specialization of `spectrum.map_polynomial_aeval_of_nonempty` to monic monomials for
@@ -509,10 +501,7 @@ theorem nonempty_of_isAlgClosed_of_finiteDimensional [IsAlgClosed 𝕜] [Nontriv
[I : FiniteDimensional 𝕜 A] (a : A) : ∃ k : 𝕜, k ∈ σ a :=
by
obtain ⟨p, ⟨h_mon, h_eval_p⟩⟩ := isIntegral_of_noetherian (IsNoetherian.iff_fg.2 I) a
- have nu : ¬IsUnit (aeval a p) := by
- rw [← aeval_def] at h_eval_p
- rw [h_eval_p]
- simp
+ have nu : ¬IsUnit (aeval a p) := by rw [← aeval_def] at h_eval_p; rw [h_eval_p]; simp
rw [eq_prod_roots_of_monic_of_splits_id h_mon (IsAlgClosed.splits p)] at nu
obtain ⟨k, hk, _⟩ := exists_mem_of_not_is_unit_aeval_prod (monic.ne_zero h_mon) nu
exact ⟨k, hk⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce86f4e05e9a9b8da5e316b22c76ce76440c56a1
@@ -346,7 +346,7 @@ theorem exists_mem_of_not_isUnit_aeval_prod [IsDomain R] {p : R[X]} {a : A} (hp
by
rw [← Multiset.prod_toList, AlgHom.map_list_prod] at h
replace h := mt List.prod_isUnit h
- simp only [not_forall, exists_prop, aeval_C, Multiset.mem_toList, List.mem_map', aeval_X,
+ simp only [not_forall, exists_prop, aeval_C, Multiset.mem_toList, List.mem_map, aeval_X,
exists_exists_and_eq_and, Multiset.mem_map, AlgHom.map_sub] at h
rcases h with ⟨r, r_mem, r_nu⟩
exact ⟨r, by rwa [mem_iff, ← IsUnit.sub_iff], by rwa [← is_root.def, ← mem_roots hp]⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/38f16f960f5006c6c0c2bac7b0aba5273188f4e5
@@ -341,7 +341,7 @@ theorem sub_singleton_eq (a : A) (r : R) : σ a - {r} = σ (a - ↑ₐ r) := by
open Polynomial
theorem exists_mem_of_not_isUnit_aeval_prod [IsDomain R] {p : R[X]} {a : A} (hp : p ≠ 0)
- (h : ¬IsUnit (aeval a (Multiset.map (fun x : R => x - c x) p.roots).Prod)) :
+ (h : ¬IsUnit (aeval a (Multiset.map (fun x : R => X - C x) p.roots).Prod)) :
∃ k : R, k ∈ σ a ∧ eval k p = 0 :=
by
rw [← Multiset.prod_toList, AlgHom.map_list_prod] at h
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -248,14 +248,14 @@ theorem unit_smul_eq_smul (a : A) (r : Rˣ) : σ (r • a) = r • σ a := by
theorem unit_mem_mul_iff_mem_swap_mul {a b : A} {r : Rˣ} : ↑r ∈ σ (a * b) ↔ ↑r ∈ σ (b * a) := by
have h₁ : ∀ x y : A, IsUnit (1 - x * y) → IsUnit (1 - y * x) := by
refine' fun x y h => ⟨⟨1 - y * x, 1 + y * h.unit.inv * x, _, _⟩, rfl⟩
- calc
- (1 - y * x) * (1 + y * (IsUnit.unit h).inv * x) =
- 1 - y * x + y * ((1 - x * y) * h.unit.inv) * x := by noncomm_ring
- _ = 1 := by simp only [Units.inv_eq_val_inv, IsUnit.mul_val_inv, mul_one, sub_add_cancel]
- calc
- (1 + y * (IsUnit.unit h).inv * x) * (1 - y * x) =
- 1 - y * x + y * (h.unit.inv * (1 - x * y)) * x := by noncomm_ring
- _ = 1 := by simp only [Units.inv_eq_val_inv, IsUnit.val_inv_mul, mul_one, sub_add_cancel]
+ · calc
+ (1 - y * x) * (1 + y * (IsUnit.unit h).inv * x) =
+ 1 - y * x + y * ((1 - x * y) * h.unit.inv) * x := by noncomm_ring
+ _ = 1 := by simp only [Units.inv_eq_val_inv, IsUnit.mul_val_inv, mul_one, sub_add_cancel]
+ · calc
+ (1 + y * (IsUnit.unit h).inv * x) * (1 - y * x) =
+ 1 - y * x + y * (h.unit.inv * (1 - x * y)) * x := by noncomm_ring
+ _ = 1 := by simp only [Units.inv_eq_val_inv, IsUnit.val_inv_mul, mul_one, sub_add_cancel]
have := Iff.intro (h₁ (r⁻¹ • a) b) (h₁ b (r⁻¹ • a))
rw [mul_smul_comm r⁻¹ b a] at this
simpa only [mem_iff, not_iff_not, Algebra.algebraMap_eq_smul_one, ← Units.smul_def,
@@ -484,8 +484,8 @@ variable [IsScalarTower R S A] {a : A} {f : S → R} (h : SpectrumRestricts a f)
theorem algebraMap_image : algebraMap R S '' spectrum R a = spectrum S a := by
refine' Set.eq_of_subset_of_subset _ fun s hs => ⟨f s, _⟩
- simpa only [spectrum.preimage_algebraMap] using
- (spectrum S a).image_preimage_subset (algebraMap R S)
+ · simpa only [spectrum.preimage_algebraMap] using
+ (spectrum S a).image_preimage_subset (algebraMap R S)
exact ⟨spectrum.of_algebraMap_mem S ((h.rightInvOn hs).symm ▸ hs), h.rightInvOn hs⟩
theorem image : f '' spectrum S a = spectrum R a := by
Subalgebra.Basic
(#12267)
This PR was supposed to be simultaneous with #12090 but I got ill last week.
This is based on seeing the import Algebra.Algebra.Subalgebra.Basic → RingTheory.Ideal.Operations
on the longest pole. It feels like Ideal.Operations
should not be needed to define the notion of subalgebra, only to construct some interesting examples. So I removed the import and split off anything that wouldn't fit.
The following results and their corollaries were split off:
Subalgebra.prod
Subalgebra.iSupLift
AlgHom.ker_rangeRestrict
Subalgebra.mem_of_finset_sum_eq_one_of_pow_smul_mem
Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
@@ -5,6 +5,7 @@ Authors: Jireh Loreaux
-/
import Mathlib.Algebra.Star.Pointwise
import Mathlib.Algebra.Star.Subalgebra
+import Mathlib.RingTheory.Ideal.Operations
import Mathlib.Tactic.NoncommRing
#align_import algebra.algebra.spectrum from "leanprover-community/mathlib"@"58a272265b5e05f258161260dd2c5d247213cbd3"
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)
@@ -48,7 +48,6 @@ universe u v
section Defs
variable (R : Type u) {A : Type v}
-
variable [CommSemiring R] [Ring A] [Algebra R A]
local notation "↑ₐ" => algebraMap R A
@@ -97,7 +96,6 @@ namespace spectrum
section ScalarSemiring
variable {R : Type u} {A : Type v}
-
variable [CommSemiring R] [Ring A] [Algebra R A]
local notation "σ" => spectrum R
@@ -291,7 +289,6 @@ end ScalarSemiring
section ScalarRing
variable {R : Type u} {A : Type v}
-
variable [CommRing R] [Ring A] [Algebra R A]
local notation "σ" => spectrum R
@@ -340,7 +337,6 @@ end ScalarRing
section ScalarField
variable {𝕜 : Type u} {A : Type v}
-
variable [Field 𝕜] [Ring A] [Algebra 𝕜 A]
local notation "σ" => spectrum 𝕜
@@ -408,7 +404,6 @@ namespace AlgHom
section CommSemiring
variable {F R A B : Type*} [CommSemiring R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
-
variable [FunLike F A B] [AlgHomClass F R A B]
local notation "σ" => spectrum R
@@ -429,7 +424,6 @@ end CommSemiring
section CommRing
variable {F R A B : Type*} [CommRing R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
-
variable [FunLike F A R] [AlgHomClass F R A R]
local notation "σ" => spectrum R
SpectrumRestricts
structure (#10735)
when A
is and S
-algebra and R
is a subring of S
, SpectrumRestricts (a : A) (f : S → R)
means that the S
-spectrum of a
is entirely contained within the image of the R
-spectrum of a
under algebraMap R S
. We include f
because we want to explicitly specify the function that takes us back into R
from S
.
@@ -455,3 +455,69 @@ theorem AlgEquiv.spectrum_eq {F R A B : Type*} [CommSemiring R] [Ring A] [Ring B
Set.Subset.antisymm (AlgHom.spectrum_apply_subset _ _) <| by
simpa only [AlgEquiv.coe_algHom, AlgEquiv.coe_coe_symm_apply_coe_apply] using
AlgHom.spectrum_apply_subset (f : A ≃ₐ[R] B).symm (f a)
+
+/-! ### Restriction of the spectrum -/
+
+/-- Given an element `a : A` of an `S`-algebra, where `S` is itself an `R`-algebra, we say that
+the spectrum of `a` restricts via a function `f : S → R` if `f` is a left inverse of
+`algebraMap R S`, and `f` is a right inverse of `algebraMap R S` on `spectrum S a`.
+
+For example, when `f = Complex.re` (so `S := ℂ` and `R := ℝ`), `SpectrumRestricts a f` means that
+the `ℂ`-spectrum of `a` is contained within `ℝ`. This arises naturally when `a` is selfadjoint
+and `A` is a C⋆-algebra.
+
+This is the property allows us to restrict a continuous functional calculus over `S` to a
+continuous functional calculus over `R`. -/
+structure SpectrumRestricts {R S A : Type*} [CommSemiring R] [CommSemiring S] [Ring A]
+ [Algebra R S] [Algebra R A] [Algebra S A] (a : A) (f : S → R) : Prop where
+ /-- `f` is a right inverse of `algebraMap R S` when restricted to `spectrum S a`. -/
+ rightInvOn : (spectrum S a).RightInvOn f (algebraMap R S)
+ /-- `f` is a left inverse of `algebraMap R S`. -/
+ left_inv : Function.LeftInverse f (algebraMap R S)
+
+namespace SpectrumRestricts
+
+variable {R S A : Type*} [CommSemiring R] [CommSemiring S] [Ring A]
+ [Algebra R S] [Algebra R A] [Algebra S A]
+
+theorem of_subset_range_algebraMap (a : A) (f : S → R) (hf : f.LeftInverse (algebraMap R S))
+ (h : spectrum S a ⊆ Set.range (algebraMap R S)) : SpectrumRestricts a f where
+ rightInvOn := fun s hs => by obtain ⟨r, rfl⟩ := h hs; rw [hf r]
+ left_inv := hf
+
+variable [IsScalarTower R S A] {a : A} {f : S → R} (h : SpectrumRestricts a f)
+
+theorem algebraMap_image : algebraMap R S '' spectrum R a = spectrum S a := by
+ refine' Set.eq_of_subset_of_subset _ fun s hs => ⟨f s, _⟩
+ simpa only [spectrum.preimage_algebraMap] using
+ (spectrum S a).image_preimage_subset (algebraMap R S)
+ exact ⟨spectrum.of_algebraMap_mem S ((h.rightInvOn hs).symm ▸ hs), h.rightInvOn hs⟩
+
+theorem image : f '' spectrum S a = spectrum R a := by
+ simp only [← h.algebraMap_image, Set.image_image, h.left_inv _, Set.image_id']
+
+theorem apply_mem {s : S} (hs : s ∈ spectrum S a) : f s ∈ spectrum R a :=
+ h.image ▸ ⟨s, hs, rfl⟩
+
+theorem subset_preimage : spectrum S a ⊆ f ⁻¹' spectrum R a :=
+ h.image ▸ (spectrum S a).subset_preimage_image f
+
+lemma of_spectrum_eq {a b : A} {f : S → R} (ha : SpectrumRestricts a f)
+ (h : spectrum S a = spectrum S b) : SpectrumRestricts b f where
+ rightInvOn := h ▸ ha.rightInvOn
+ left_inv := ha.left_inv
+
+protected lemma comp {R₁ R₂ R₃ A : Type*} [CommSemiring R₁] [CommSemiring R₂] [CommSemiring R₃]
+ [Ring A] [Algebra R₁ A] [Algebra R₂ A] [Algebra R₃ A] [Algebra R₁ R₂] [Algebra R₂ R₃]
+ [Algebra R₁ R₃] [IsScalarTower R₁ R₂ R₃] [IsScalarTower R₂ R₃ A]
+ {a : A} {f : R₃ → R₂} {g : R₂ → R₁} {e : R₃ → R₁} (hfge : g ∘ f = e)
+ (hf : SpectrumRestricts a f) (hg : SpectrumRestricts a g) :
+ SpectrumRestricts a e where
+ left_inv := by
+ convert hfge ▸ hf.left_inv.comp hg.left_inv
+ congrm(⇑$(IsScalarTower.algebraMap_eq R₁ R₂ R₃))
+ rightInvOn := by
+ convert hfge ▸ hg.rightInvOn.comp hf.rightInvOn fun _ ↦ hf.apply_mem
+ congrm(⇑$(IsScalarTower.algebraMap_eq R₁ R₂ R₃))
+
+end SpectrumRestricts
have
, replace
and suffices
(#10640)
No changes to tactic file, it's just boring fixes throughout the library.
This follows on from #6964.
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -381,11 +381,11 @@ theorem smul_eq_smul [Nontrivial A] (k : 𝕜) (a : A) (ha : (σ a).Nonempty) :
#align spectrum.smul_eq_smul spectrum.smul_eq_smul
theorem nonzero_mul_eq_swap_mul (a b : A) : σ (a * b) \ {0} = σ (b * a) \ {0} := by
- suffices h : ∀ x y : A, σ (x * y) \ {0} ⊆ σ (y * x) \ {0}
- · exact Set.eq_of_subset_of_subset (h a b) (h b a)
- · rintro _ _ k ⟨k_mem, k_neq⟩
- change ((Units.mk0 k k_neq) : 𝕜) ∈ _ at k_mem
- exact ⟨unit_mem_mul_iff_mem_swap_mul.mp k_mem, k_neq⟩
+ suffices h : ∀ x y : A, σ (x * y) \ {0} ⊆ σ (y * x) \ {0} from
+ Set.eq_of_subset_of_subset (h a b) (h b a)
+ rintro _ _ k ⟨k_mem, k_neq⟩
+ change ((Units.mk0 k k_neq) : 𝕜) ∈ _ at k_mem
+ exact ⟨unit_mem_mul_iff_mem_swap_mul.mp k_mem, k_neq⟩
#align spectrum.nonzero_mul_eq_swap_mul spectrum.nonzero_mul_eq_swap_mul
protected theorem map_inv (a : Aˣ) : (σ (a : A))⁻¹ = σ (↑a⁻¹ : A) := by
@@ -141,6 +141,20 @@ theorem mem_resolventSet_iff {r : R} {a : A} : r ∈ resolventSet R a ↔ IsUnit
Iff.rfl
#align spectrum.mem_resolvent_set_iff spectrum.mem_resolventSet_iff
+@[simp]
+theorem algebraMap_mem_iff (S : Type*) {R A : Type*} [CommSemiring R] [CommSemiring S]
+ [Ring A] [Algebra R S] [Algebra R A] [Algebra S A] [IsScalarTower R S A] {a : A} {r : R} :
+ algebraMap R S r ∈ spectrum S a ↔ r ∈ spectrum R a := by
+ simp only [spectrum.mem_iff, Algebra.algebraMap_eq_smul_one, smul_assoc, one_smul]
+
+protected alias ⟨of_algebraMap_mem, algebraMap_mem⟩ := spectrum.algebraMap_mem_iff
+
+@[simp]
+theorem preimage_algebraMap (S : Type*) {R A : Type*} [CommSemiring R] [CommSemiring S]
+ [Ring A] [Algebra R S] [Algebra R A] [Algebra S A] [IsScalarTower R S A] {a : A} :
+ algebraMap R S ⁻¹' spectrum S a = spectrum R a :=
+ Set.ext fun _ => spectrum.algebraMap_mem_iff _
+
@[simp]
theorem resolventSet_of_subsingleton [Subsingleton A] (a : A) : resolventSet R a = Set.univ := by
simp_rw [resolventSet, Subsingleton.elim (algebraMap R A _ - a) 1, isUnit_one, Set.setOf_true]
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>
@@ -395,7 +395,7 @@ section CommSemiring
variable {F R A B : Type*} [CommSemiring R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
-variable [AlgHomClass F R A B]
+variable [FunLike F A B] [AlgHomClass F R A B]
local notation "σ" => spectrum R
@@ -416,7 +416,7 @@ section CommRing
variable {F R A B : Type*} [CommRing R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
-variable [AlgHomClass F R A R]
+variable [FunLike F A R] [AlgHomClass F R A R]
local notation "σ" => spectrum R
@@ -436,7 +436,7 @@ end AlgHom
@[simp]
theorem AlgEquiv.spectrum_eq {F R A B : Type*} [CommSemiring R] [Ring A] [Ring B] [Algebra R A]
- [Algebra R B] [AlgEquivClass F R A B] (f : F) (a : A) :
+ [Algebra R B] [EquivLike F A B] [AlgEquivClass F R A B] (f : F) (a : A) :
spectrum R (f a) = spectrum R a :=
Set.Subset.antisymm (AlgHom.spectrum_apply_subset _ _) <| by
simpa only [AlgEquiv.coe_algHom, AlgEquiv.coe_coe_symm_apply_coe_apply] using
@@ -119,10 +119,17 @@ theorem zero_mem_iff {a : A} : (0 : R) ∈ σ a ↔ ¬IsUnit a := by
rw [mem_iff, map_zero, zero_sub, IsUnit.neg_iff]
#align spectrum.zero_mem_iff spectrum.zero_mem_iff
+alias ⟨not_isUnit_of_zero_mem, zero_mem⟩ := spectrum.zero_mem_iff
+
theorem zero_not_mem_iff {a : A} : (0 : R) ∉ σ a ↔ IsUnit a := by
rw [zero_mem_iff, Classical.not_not]
#align spectrum.zero_not_mem_iff spectrum.zero_not_mem_iff
+alias ⟨isUnit_of_zero_not_mem, zero_not_mem⟩ := spectrum.zero_not_mem_iff
+
+lemma subset_singleton_zero_compl {a : A} (ha : IsUnit a) : spectrum R a ⊆ {0}ᶜ :=
+ Set.subset_compl_singleton_iff.mpr <| spectrum.zero_not_mem R ha
+
variable {R}
theorem mem_resolventSet_of_left_right_inverse {r : R} {a b c : A} (h₁ : (↑ₐ r - a) * b = 1)
(· op ·) a
by (a op ·)
(#8843)
I used the regex \(\(· (.) ·\) (.)\)
, replacing with ($2 $1 ·)
.
@@ -290,9 +290,7 @@ theorem subset_starSubalgebra [StarRing R] [StarRing A] [StarModule R A] {S : St
theorem singleton_add_eq (a : A) (r : R) : {r} + σ a = σ (↑ₐ r + a) :=
ext fun x => by
- rw [singleton_add, image_add_left, mem_preimage]
- simp only
- rw [add_comm, add_mem_iff, map_neg, neg_neg]
+ rw [singleton_add, image_add_left, mem_preimage, add_comm, add_mem_iff, map_neg, neg_neg]
#align spectrum.singleton_add_eq spectrum.singleton_add_eq
theorem add_singleton_eq (a : A) (r : R) : σ a + {r} = σ (a + ↑ₐ r) :=
@@ -230,13 +230,11 @@ theorem unit_mem_mul_iff_mem_swap_mul {a b : A} {r : Rˣ} : ↑r ∈ σ (a * b)
refine' fun x y h => ⟨⟨1 - y * x, 1 + y * h.unit.inv * x, _, _⟩, rfl⟩
calc
(1 - y * x) * (1 + y * (IsUnit.unit h).inv * x) =
- 1 - y * x + y * ((1 - x * y) * h.unit.inv) * x :=
- by noncomm_ring
+ 1 - y * x + y * ((1 - x * y) * h.unit.inv) * x := by noncomm_ring
_ = 1 := by simp only [Units.inv_eq_val_inv, IsUnit.mul_val_inv, mul_one, sub_add_cancel]
calc
(1 + y * (IsUnit.unit h).inv * x) * (1 - y * x) =
- 1 - y * x + y * (h.unit.inv * (1 - x * y)) * x :=
- by noncomm_ring
+ 1 - y * x + y * (h.unit.inv * (1 - x * y)) * x := by noncomm_ring
_ = 1 := by simp only [Units.inv_eq_val_inv, IsUnit.val_inv_mul, mul_one, sub_add_cancel]
have := Iff.intro (h₁ (r⁻¹ • a) b) (h₁ b (r⁻¹ • a))
rw [mul_smul_comm r⁻¹ b a] at this
@@ -87,6 +87,8 @@ noncomputable def IsUnit.subInvSMul {r : Rˣ} {s : R} {a : A} (h : IsUnit <| r
val_inv := by rw [mul_smul_comm, ← smul_mul_assoc, smul_sub, smul_inv_smul, h.mul_val_inv]
inv_val := by rw [smul_mul_assoc, ← mul_smul_comm, smul_sub, smul_inv_smul, h.val_inv_mul]
#align is_unit.sub_inv_smul IsUnit.subInvSMul
+#align is_unit.coe_sub_inv_smul IsUnit.val_subInvSMul
+#align is_unit.coe_inv_sub_inv_smul IsUnit.val_inv_subInvSMul
end Defs
@@ -158,8 +160,8 @@ theorem units_smul_resolvent {r : Rˣ} {s : R} {a : A} :
· simp only [resolvent]
have h' : IsUnit (r • algebraMap R A (r⁻¹ • s) - a) := by
simpa [Algebra.algebraMap_eq_smul_one, smul_assoc] using not_mem_iff.mp h
- rw [← h'.subInvSMul_val, ← (not_mem_iff.mp h).unit_spec, Ring.inverse_unit, Ring.inverse_unit,
- ←h'.subInvSMul.inv_eq_val_inv, h'.subInvSMul_inv]
+ rw [← h'.val_subInvSMul, ← (not_mem_iff.mp h).unit_spec, Ring.inverse_unit, Ring.inverse_unit,
+ h'.val_inv_subInvSMul]
simp only [Algebra.algebraMap_eq_smul_one, smul_assoc, smul_inv_smul]
#align spectrum.units_smul_resolvent spectrum.units_smul_resolvent
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -388,7 +388,7 @@ namespace AlgHom
section CommSemiring
-variable {F R A B : Type _} [CommSemiring R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
+variable {F R A B : Type*} [CommSemiring R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
variable [AlgHomClass F R A B]
@@ -409,7 +409,7 @@ end CommSemiring
section CommRing
-variable {F R A B : Type _} [CommRing R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
+variable {F R A B : Type*} [CommRing R] [Ring A] [Algebra R A] [Ring B] [Algebra R B]
variable [AlgHomClass F R A R]
@@ -430,7 +430,7 @@ end CommRing
end AlgHom
@[simp]
-theorem AlgEquiv.spectrum_eq {F R A B : Type _} [CommSemiring R] [Ring A] [Ring B] [Algebra R A]
+theorem AlgEquiv.spectrum_eq {F R A B : Type*} [CommSemiring R] [Ring A] [Ring B] [Algebra R A]
[Algebra R B] [AlgEquivClass F R A B] (f : F) (a : A) :
spectrum R (f a) = spectrum R a :=
Set.Subset.antisymm (AlgHom.spectrum_apply_subset _ _) <| by
@@ -2,16 +2,13 @@
Copyright (c) 2021 Jireh Loreaux. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jireh Loreaux
-
-! This file was ported from Lean 3 source module algebra.algebra.spectrum
-! leanprover-community/mathlib commit 58a272265b5e05f258161260dd2c5d247213cbd3
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.Star.Pointwise
import Mathlib.Algebra.Star.Subalgebra
import Mathlib.Tactic.NoncommRing
+#align_import algebra.algebra.spectrum from "leanprover-community/mathlib"@"58a272265b5e05f258161260dd2c5d247213cbd3"
+
/-!
# Spectrum of an element in an algebra
This file develops the basic theory of the spectrum of an element of an algebra.
@@ -20,9 +20,9 @@ This theory will serve as the foundation for spectral theory in Banach algebras.
## Main definitions
* `resolventSet a : Set R`: the resolvent set of an element `a : A` where
- `A` is an `R`-algebra.
+ `A` is an `R`-algebra.
* `spectrum a : Set R`: the spectrum of an element `a : A` where
- `A` is an `R`-algebra.
+ `A` is an `R`-algebra.
* `resolvent : R → A`: the resolvent function is `fun r ↦ Ring.inverse (↑ₐr - a)`, and hence
when `r ∈ resolvent R A`, it is actually the inverse of the unit `(↑ₐr - a)`.
@@ -70,7 +70,7 @@ algebra `A`.
The spectrum is simply the complement of the resolvent set. -/
def spectrum (a : A) : Set R :=
- resolventSet R aᶜ
+ (resolventSet R a)ᶜ
#align spectrum spectrum
variable {R}
@@ -431,3 +431,11 @@ theorem apply_mem_spectrum [Nontrivial R] (φ : F) (a : A) : φ a ∈ σ a := by
end CommRing
end AlgHom
+
+@[simp]
+theorem AlgEquiv.spectrum_eq {F R A B : Type _} [CommSemiring R] [Ring A] [Ring B] [Algebra R A]
+ [Algebra R B] [AlgEquivClass F R A B] (f : F) (a : A) :
+ spectrum R (f a) = spectrum R a :=
+ Set.Subset.antisymm (AlgHom.spectrum_apply_subset _ _) <| by
+ simpa only [AlgEquiv.coe_algHom, AlgEquiv.coe_coe_symm_apply_coe_apply] using
+ AlgHom.spectrum_apply_subset (f : A ≃ₐ[R] B).symm (f a)
@@ -23,7 +23,7 @@ This theory will serve as the foundation for spectral theory in Banach algebras.
`A` is an `R`-algebra.
* `spectrum a : Set R`: the spectrum of an element `a : A` where
`A` is an `R`-algebra.
-* `resolvent : R → A`: the resolvent function is `λ r, Ring.inverse (↑ₐr - a)`, and hence
+* `resolvent : R → A`: the resolvent function is `fun r ↦ Ring.inverse (↑ₐr - a)`, and hence
when `r ∈ resolvent R A`, it is actually the inverse of the unit `(↑ₐr - a)`.
## Main statements
The unported dependencies are