Imports
/- Copyright (c) 2026 Gregory J. Loges. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Adam Bornemann, Gregory J. Loges -/ module public import Physlib.QuantumMechanics.Operators.SpectralTheory.Symmetric

Spectral theory for self-adjoint operators

i. Overview

In this module we develop the spectral theory for self-adjoint operators.

ii. Key results

    resolventSet_eq_regularityDomain : The resolvent set and regularity domain coincide. That is, if T - z • 1 has a continuous (equivalently, bounded) inverse then its range is all of H.

    mem_resolventSet_of_im_ne_zero : every non-real z lies in the resolvent set of a self-adjoint operator.

    sub_smul_surjective : A self-adjoint T has T - z • 1 surjective for every non-real z (in particular T ± i • 1 are onto).

    spectrum_real : The spectrum of a self-adjoint unbounded operator is real.

    unitaryConj_isSelfAdjoint : Unitary conjugation preserves self-adjointness.

iii. Table of contents

    A. Resolvent set

    B. Spectrum

    C. Unitary conjugation

iv. References

@[expose] public sectioninclude hT

A. Resolvent set

H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂhz:z ∈ T.regularityDomainh_ker:(T - z • 1).toFun.ker = ⊥h_cont:Continuous ↑(𝑅 T z)h_ker':(T - (starRingEnd ℂ) z • 1).toFun.ker = ⊥h_orthog:(Submodule.map (T - (starRingEnd ℂ) z • 1).domain.subtype ⊥)ᗮ = (T - z • 1).toFun.range⊢ (T - z • 1).toFun.range = ⊤ All goals completed! 🐙

Every non-real z lies in the resolvent set of a self-adjoint operator.

H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂhz:z.im ≠ 0⊢ z ∈ T.regularityDomain All goals completed! 🐙

A self-adjoint operator has T - z • 1 surjective for every non-real z: off the real axis a self-adjoint operator has z in its resolvent set, so T - z • 1 has full range.

lemma sub_smul_surjective {z : ℂ} (hz : z.im ≠ 0) : Function.Surjective (T - z • 1).toFun := LinearMap.range_eq_top.mp (mem_resolventSet_iff.mp (mem_resolventSet_of_im_ne_zero hT hz)).2.1

(T - z • 1).range = ⊤ is a sufficient condition for z ∈ ρ T (and it is a necessary condition by definition of ρ).

H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0⊢ z ∈ {z | (T - z • 1).toFun.ker = ⊥ ∧ (T - z • 1).toFun.range = ⊤} H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:(T.closure - z • 1).toFun.rangeᗮ = Submodule.map (T† - (starRingEnd ℂ) z • 1).domain.subtype (T† - (starRingEnd ℂ) z • 1).toFun.ker⊢ (T - z • 1).toFun.ker = ⊥ rwa [H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:(T.closure - z • 1).toFun.rangeᗮ = Submodule.map (T - (starRingEnd ℂ) z • 1).domain.subtype (T - (starRingEnd ℂ) z • 1).toFun.ker⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:(T - z • 1).toFun.rangeᗮ = Submodule.map (T - (starRingEnd ℂ) z • 1).domain.subtype (T - (starRingEnd ℂ) z • 1).toFun.ker⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:(T - z • 1).toFun.rangeᗮ = Submodule.map (T - z • 1).domain.subtype (T - z • 1).toFun.ker⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:⊤ᗮ = Submodule.map (T - z • 1).domain.subtype (T - z • 1).toFun.ker⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:⊥ = Submodule.map (T - z • 1).domain.subtype (T - z • 1).toFun.ker⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:Submodule.map (T - z • 1).domain.subtype (T - z • 1).toFun.ker = ⊥⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:(T - z • 1).toFun.ker ≤ (T - z • 1).domain.subtype.ker⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:(T - z • 1).toFun.ker ≤ ⊥⊢ (T - z • 1).toFun.ker = ⊥ H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:(T - z • 1).toFun.ker = ⊥⊢ (T - z • 1).toFun.ker = ⊥H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:z.im = 0h_orthog:(T - z • 1).toFun.ker = ⊥⊢ (T - z • 1).toFun.ker = ⊥ at h_orthog H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint Tz:ℂh:(T - z • 1).toFun.range = ⊤hz_im:¬z.im = 0⊢ z ∈ ρ T All goals completed! 🐙

B. Spectrum

The spectrum of a self-adjoint operator is real.

H:Type u_1inst✝²:NormedAddCommGroup Hinst✝¹:InnerProductSpace ℂ Hinst✝:CompleteSpace HT:H →ₗ.[ℂ] HhT:IsSelfAdjoint T⊢ T.regularityDomainᶜ ⊆ range ofReal All goals completed! 🐙

The residual spectrum of a self-adjoint operator is empty.

lemma residualSpectrum_eq_empty : σʳ T = ∅ := eq_empty_iff_forall_notMem.mpr fun _ hz ↦ T.residualSpectrum_subset_spectrum hz (resolventSet_eq_regularityDomain hT ▸ T.residualSpectrum_subset_regularityDomain hz)

C. Unitary conjugation

Unitary conjugation preserves self-adjointness: if A is a self-adjoint operator on H and u : H ≃ₗᵢ[ℂ] H' is unitary, then u A u⁻¹ is self-adjoint on H'. Symmetry, dense domain, and the two deficiency surjectivities of A all transfer through u.

H:Type u_1H':Type u_2inst✝⁵:NormedAddCommGroup Hinst✝⁴:InnerProductSpace ℂ Hinst✝³:CompleteSpace Hinst✝²:NormedAddCommGroup H'inst✝¹:InnerProductSpace ℂ H'inst✝:CompleteSpace H'u:H ≃ₗᵢ[ℂ] H'A:H →ₗ.[ℂ] HhA:IsSelfAdjoint Ahrange:∀ {z : ℂ}, z.im ≠ 0 → (unitaryConj u A - z • 1).toFun.range = ⊤hI:unitaryConj u A + I • 1 = unitaryConj u A - -I • 1⊢ (unitaryConj u A - -I • 1).toFun.range = ⊤ exact hrange (H:Type u_1H':Type u_2inst✝⁵:NormedAddCommGroup Hinst✝⁴:InnerProductSpace ℂ Hinst✝³:CompleteSpace Hinst✝²:NormedAddCommGroup H'inst✝¹:InnerProductSpace ℂ H'inst✝:CompleteSpace H'u:H ≃ₗᵢ[ℂ] H'A:H →ₗ.[ℂ] HhA:IsSelfAdjoint Ahrange:∀ {z : ℂ}, z.im ≠ 0 → (unitaryConj u A - z • 1).toFun.range = ⊤hI:unitaryConj u A + I • 1 = unitaryConj u A - -I • 1⊢ (-I).im ≠ 0 All goals completed! 🐙) H:Type u_1H':Type u_2inst✝⁵:NormedAddCommGroup Hinst✝⁴:InnerProductSpace ℂ Hinst✝³:CompleteSpace Hinst✝²:NormedAddCommGroup H'inst✝¹:InnerProductSpace ℂ H'inst✝:CompleteSpace H'u:H ≃ₗᵢ[ℂ] H'A:H →ₗ.[ℂ] HhA:IsSelfAdjoint Ahrange:∀ {z : ℂ}, z.im ≠ 0 → (unitaryConj u A - z • 1).toFun.range = ⊤⊢ (unitaryConj u A - I • 1).toFun.range = ⊤ exact hrange (H:Type u_1H':Type u_2inst✝⁵:NormedAddCommGroup Hinst✝⁴:InnerProductSpace ℂ Hinst✝³:CompleteSpace Hinst✝²:NormedAddCommGroup H'inst✝¹:InnerProductSpace ℂ H'inst✝:CompleteSpace H'u:H ≃ₗᵢ[ℂ] H'A:H →ₗ.[ℂ] HhA:IsSelfAdjoint Ahrange:∀ {z : ℂ}, z.im ≠ 0 → (unitaryConj u A - z • 1).toFun.range = ⊤⊢ I.im ≠ 0 All goals completed! 🐙)