Stone's theorem, finite-dimensional form (Hermitian ⟺ unitary one-parameter groups) - #1510
Stone's theorem, finite-dimensional form (Hermitian ⟺ unitary one-parameter groups)#1510TomOleDiem wants to merge 9 commits into
Conversation
…ne-parameter groups) Physlib/Mathematics/OneParameterSubgroups/Basic.lean (new): - OneParameterSubgroup.existsUnique_generator: every continuous one-parameter subgroup of a real Banach algebra's unit group is exp(t . A) for a unique generator A. Pure Banach-algebra content, no physics, reusable well beyond quantum mechanics. Physlib/Mathematics/OneParameterSubgroups/Matrix.lean (new): - Specializes the above to complex matrices via the Frobenius norm, identifying real scalar multiplication with multiplication by real complex numbers. Physlib/QuantumMechanics/Stone.lean (new): - Matrix.UnitaryOneParameterSubgroup and the finite-dimensional Stone correspondence: a continuous one-parameter subgroup of U(n) has a unique anti-Hermitian generator A (equivalently, after multiplying by i, a unique Hermitian generator H with U(t) = exp(-itH)) -- existsUnique_antiHermitian_generator / existsUnique_hermitian_generator. - The converse direction, ofHermitian: every Hermitian H genuinely generates a continuous U(n)-valued one-parameter subgroup t -> exp(-itH), bundled as a real ContinuousMonoidHom (built via MonoidHom.codRestrict + Continuous.subtype_mk, sidestepping Mathlib's lack of a canonical matrix norm by routing the exp-additivity/continuity proofs through Matrix.exp_add_of_commute's own `open scoped Norms.Operator` pattern rather than the ambient default instance). - stoneEquiv: the finite-dimensional statement of Stone's theorem itself, as a genuine Equiv between U(n)'s continuous one-parameter subgroups and the Hermitian n x n matrices -- the algebraic reason a Hermitian Hamiltonian generates unitary time evolution, specialized to finite-level (e.g. qubit) quantum systems. All new theorems kernel-checked (#print axioms): only propext, Classical.choice, Quot.sound. Zero sorry.
…bra instance - Basic.lean: the module doc referenced a now-deleted Unitary.lean; point it at Physlib.QuantumMechanics.Stone instead. Drop private from all 8 internal lemmas (ambientValue and friends) -- physlib's module system makes private declarations brittle, and there's no reason these helper lemmas need to be hidden. Hoist the NormedAlgebra ℚ E instance (needed for NormedSpace.exp's API) to a single local instance declared once, instead of duplicating the same 'let +nondep' inline in both exists_generator_of_nontrivial and existsUnique_generator. - Stone.lean: add a reference to Stone's original 1932 theorem. Re-verified: targeted build of all 3 files, full Physlib aggregate build, #print axioms on the 6 key public theorems (only propext/Classical.choice/ Quot.sound), and empty sorry/private greps -- all clean. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Thank you for this pull-request (PR). If this is your first PR, welcome to the community! Below is what will happen next. Please read carefully if you are not familiar with the process. You may open other PRs while this one is being reviewed, and can stack PRs on top of each other, so don't let these steps slow you down.
Tip: The easiest way to get have a fast review is to submit a PR that is small and self-contained, and has clear documentation explaining why things are the way they are in your chages. If you have any problems or questions, please reach out to the community on the Zulip. |
Document the helper definitions and remove the unused Fintype assumption from Matrix.IsAntiHermitian. Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
|
Many thanks for this PR.
|
|
awaiting-author |
Use lemma declarations throughout and remove imports reported as redundant by Mathlib's import analysis. Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
|
The final result here is really great work. Though, I do have a couple of concerns that still make it a bit hard to review in its current form:
|
Use the physical exp(-itH/ℏ) normalization, connect the result to FiniteTarget time evolution, and explain its scope relative to unbounded QuantumSystem Hamiltonians. Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
Present only the physically normalized Hamiltonian statement in the module overview. Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
Fold the anti-Hermitian and natural-units existence arguments into existsUnique_hamiltonian so the public API has one generator theorem normalized by ℏ. Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
|
Thanks for your patience. I am still getting familiar with Lean and with Physlib’s file and folder structure. I have reworked It now works with bounded operators on a Hilbert space and is connected directly to I have left the two underlying one-parameter subgroup files under |
|
-awaiting-author |
There was a problem hiding this comment.
This looks much better! Two things I would do:
- Rename this file as
UnitaryTimeEvolution. We typically name things after the definitions not the theorems. - For the theorems in ./OneParameterSubgroup with are general, can they be reframed in this file as specifics-physics theorems related to objects within this file. For example, you have
valueboth in here and inMatrix. Do we actually need it in matrix or any of the results there?
| rfl | ||
|
|
||
| /-- The operator implementing the time evolution at time `t`. -/ | ||
| def value (U : UnitaryTimeEvolution H) (t : ℝ) : H →L[ℂ] H := U (.ofAdd t) |
There was a problem hiding this comment.
You could make this a CoeFun instance which would help with the notation allowing you to just write U t
| (fun t : Multiplicative ℝ => NormedSpace.exp (((Multiplicative.toAdd t : ℝ) : ℂ) • A)) | ||
| fun_prop) _ } | ||
|
|
||
| @[simp] lemma value_ofHamiltonian {hamiltonian : H →L[ℂ] H} |
There was a problem hiding this comment.
Would typically write this as
@[simp]
lemma ...
etc.
|
awaiting-author |
gloges
left a comment
There was a problem hiding this comment.
Thanks for making headway on Stone's theorem!
There is a lot that needs to be cleaned up to best utilize the existing Mathlib machinery and reduce redundancy. The fundamental issue is that these results should be phrased in terms of AddChar, not the MonoidHomClass/Multiplicative combo currently being used.
| variable {E F : Type*} [NormedRing E] [FunLike F (Multiplicative ℝ) Eˣ] | ||
| [MonoidHomClass F (Multiplicative ℝ) Eˣ] [ContinuousMapClass F (Multiplicative ℝ) Eˣ] |
There was a problem hiding this comment.
Using FunLike, Multiplicative and MonoidHomClass together like this is a hack to say that F : ℝ → Eˣ is a homomorphism which sends addition to multiplication, but this is exactly the purpose of AddChar ℝ E!
The starting point should be something like
| variable {E F : Type*} [NormedRing E] [FunLike F (Multiplicative ℝ) Eˣ] | |
| [MonoidHomClass F (Multiplicative ℝ) Eˣ] [ContinuousMapClass F (Multiplicative ℝ) Eˣ] | |
| variable {E : Type*} [NormedRing E] (U : AddChar ℝ E) |
and you can include (h : Continuous U) or (h' : Differentiable ℝ U) in lemmas that require it. This makes the ambientValue def and first few lemmas unnecessary.
| /-- The unit of `E` obtained by scaling `1` by a nonzero real number. -/ | ||
| def scalarUnit (d : ℝ) (hd : d ≠ 0) : Eˣ where | ||
| val := d • 1 | ||
| inv := d⁻¹ • 1 | ||
| val_inv := by rw [smul_mul_smul_comm, mul_inv_cancel₀ hd, one_smul, one_mul] | ||
| inv_val := by rw [smul_mul_smul_comm, inv_mul_cancel₀ hd, one_smul, one_mul] |
There was a problem hiding this comment.
This is only used in one place below and is always coerced to E, so can be removed.
| rw [Metric.eventually_nhds_iff] at hevent | ||
| obtain ⟨r, hr, hrU⟩ := hevent | ||
| let d := r / 2 | ||
| have hd : 0 < d := by dsimp [d]; positivity |
There was a problem hiding this comment.
| have hd : 0 < d := by dsimp [d]; positivity | |
| have hd : 0 < d := by positivity |
| let q : Eˣ := scalarUnit d hd.ne' | ||
| have hnear : ‖(∫ x in (0 : ℝ)..d, ambientValue U x) - (q : E)‖ < ‖(↑q⁻¹ : E)‖⁻¹ := by | ||
| have hqd : (q : E) = d • 1 := rfl |
There was a problem hiding this comment.
| let q : Eˣ := scalarUnit d hd.ne' | |
| have hnear : ‖(∫ x in (0 : ℝ)..d, ambientValue U x) - (q : E)‖ < ‖(↑q⁻¹ : E)‖⁻¹ := by | |
| have hqd : (q : E) = d • 1 := rfl | |
| have hnear : ‖(∫ x in (0 : ℝ)..d, U x) - d • 1‖ < d := by |
etc. (see above comment on scalarUnit)
| lemma exists_generator_of_nontrivial [Nontrivial E] (U : F) : | ||
| ∃ A : E, ∀ t : ℝ, (U (.ofAdd t) : E) = NormedSpace.exp (t • A) := by |
There was a problem hiding this comment.
Since A is "known" and simple to write down, I think this would be better phrased as
| lemma exists_generator_of_nontrivial [Nontrivial E] (U : F) : | |
| ∃ A : E, ∀ t : ℝ, (U (.ofAdd t) : E) = NormedSpace.exp (t • A) := by | |
| lemma apply_eq_exp_smul_deriv [Nontrivial E] (U : AddChar ℝ E) (t : ℝ) : | |
| U t = NormedSpace.exp (t • deriv U 0) := by |
| lemma existsUnique_generator (U : F) : | ||
| ∃! A : E, ∀ t : ℝ, (U (.ofAdd t) : E) = NormedSpace.exp (t • A) := by |
There was a problem hiding this comment.
Similar to the previous lemma, perhaps this?
| lemma existsUnique_generator (U : F) : | |
| ∃! A : E, ∀ t : ℝ, (U (.ofAdd t) : E) = NormedSpace.exp (t • A) := by | |
| lemma generator_unique (U : AddChar ℝ E) (A : E) (h : ∀ t : ℝ, U t = NormedSpace.exp (t • A)) : | |
| A = deriv U 0 := by |
There was a problem hiding this comment.
It looks like everything in this file is just a special case of OneParameterSubgroups/Basic.lean with E = Matrix (Fin n) (Fin n) ℂ. Why is this needed?
| /-- A continuous unitary time evolution on a complex Hilbert space. -/ | ||
| abbrev UnitaryTimeEvolution (H : Type*) [NormedAddCommGroup H] [InnerProductSpace ℂ H] | ||
| [CompleteSpace H] := | ||
| ContinuousMonoidHom (Multiplicative ℝ) (unitary (H →L[ℂ] H)) |
There was a problem hiding this comment.
Same comments here about using AddChar. This automatically gives you the CoeFun @jstoobysmith suggests below that will make everything read more clearly.
| omit [CompleteSpace H] in | ||
| lemma real_smul_operator_eq_complex_smul (t : ℝ) (A : H →L[ℂ] H) : | ||
| t • A = (t : ℂ) • A := by | ||
| ext x | ||
| rfl |
There was a problem hiding this comment.
This is a duplicate of Complex.coe_smul.
Summary
Adds the finite-dimensional form of Stone's theorem: continuous one-parameter subgroups of
U(n)correspond bijectively to Hermitian generators,U(t) = exp(-itH).Physlib/Mathematics/OneParameterSubgroups/Basic.lean(new):OneParameterSubgroup.existsUnique_generator— every continuous one-parameter subgroup of a real Banach algebra's unit group isexp(t • A)for a unique generatorA. Pure Banach-algebra content, no physics, reusable well beyond quantum mechanics.Physlib/Mathematics/OneParameterSubgroups/Matrix.lean(new): specializes the above to complex matrices via the Frobenius norm, identifying real scalar multiplication with multiplication by real complex numbers.Physlib/QuantumMechanics/Stone.lean(new):Matrix.UnitaryOneParameterSubgroupand the finite-dimensional Stone correspondence — a continuous one-parameter subgroup ofU(n)has a unique anti-Hermitian generatorA(equivalently, after multiplying byi, a unique Hermitian generatorHwithU(t) = exp(-itH)); the converse directionofHermitian(every HermitianHgenuinely generates such a subgroup); andstoneEquiv, the bijection itself — the algebraic reason a Hermitian Hamiltonian generates unitary time evolution, specialized to finite-level (e.g. qubit) quantum systems.All theorems kernel-checked via
#print axioms(onlypropext,Classical.choice,Quot.sound). Zerosorry. Fulllake buildpasses.🤖 Generated with Claude Code