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 0z 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 = 0z {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 = 0z ρ 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 TT.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! 🐙)