Skip to content

feat(QuantumMechanics): derivative operators via Fourier-conjugated m…#1454

Open
adambornemann-glitch wants to merge 2 commits into
leanprover-community:masterfrom
adambornemann-glitch:feat/deriv-operator
Open

feat(QuantumMechanics): derivative operators via Fourier-conjugated m…#1454
adambornemann-glitch wants to merge 2 commits into
leanprover-community:masterfrom
adambornemann-glitch:feat/deriv-operator

Conversation

@adambornemann-glitch

Copy link
Copy Markdown
Contributor

…ultiplication

Define derivOperator f, the Fourier conjugate 𝓕⁻¹ ∘ 𝓜 (f ∘ 2π•) ∘ 𝓕 of the multiplication operator, for a symbol f of the wavenumber k.

  • derivOperator with domain/apply characterizations and aestronglyMeasurable_comp_two_pi_smul (rescaling is quasi-measure- preserving for the Haar measure)
  • derivOperator_hasDenseDomain for a.e.-strongly-measurable symbols
  • derivOperator_adjoint : (derivOperator f)† = derivOperator (conj ∘ f)
  • derivOperator_isSelfAdjoint for real-valued symbols
  • schwartzSubmodule_le_derivOperator_domain for temperate-growth symbols
  • supporting unitary-conjugation transfers in Unbounded.lean §B.5: unitaryConj_mono, the involution pair (simp), and unitaryConj_adjoint

…ultiplication

Define `derivOperator f`, the Fourier conjugate 𝓕⁻¹ ∘ 𝓜 (f ∘ 2π•) ∘ 𝓕 of the
multiplication operator, for a symbol `f` of the wavenumber `k`.

- `derivOperator` with domain/apply characterizations and
  `aestronglyMeasurable_comp_two_pi_smul` (rescaling is quasi-measure-
  preserving for the Haar measure)
- `derivOperator_hasDenseDomain` for a.e.-strongly-measurable symbols
- `derivOperator_adjoint` : `(derivOperator f)† = derivOperator (conj ∘ f)`
- `derivOperator_isSelfAdjoint` for real-valued symbols
- `schwartzSubmodule_le_derivOperator_domain` for temperate-growth symbols
- supporting unitary-conjugation transfers in Unbounded.lean §B.5:
  `unitaryConj_mono`, the involution pair (simp), and `unitaryConj_adjoint`

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Thank you for this PR, which will now be reviewed. If submitting to ./Physlib or ./QuantumInfo, please see our review guidelines if you are not familiar with the process. You should expect a back and forth with a reviewer before your PR is merged. See also that link for how to add appropriate labels to your PR. The PR will also go through a number of automated checks. You can learn more about these here, including how to run them locally.

If you are submitting to ./PhyslibAlpha there will be a lighter review process, though your PR must still pass the automated checks.

If you want to bring attention to this PR, please write a message on this thread of the Lean Zulip.

Important: If a reviewer adds an awaiting-author label to your PR, once you have addressed the review comments, please remove that label by adding a comment with -awaiting-author. This helps us keep track of reviews.

@github-actions github-actions Bot added the t-quantum-mechanics Quantum mechanics label Jul 21, 2026
@gloges gloges self-assigned this Jul 22, 2026

@gloges gloges left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, these look good! I've left a few minor suggestions to improve the documentation, organization and Fourier/simp lemmas. There are also two lemmas which can be generalized while (I think!) leaving the proofs essentially unchanged.

noncomputable section

open MeasureTheory ComplexConjugate
open LinearPMap

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
open LinearPMap
open LinearPMap Real

Might be convenient to have the π notation since 2 * Real.pi is common - up to you!

Comment on lines +17 to +18
Every constant-coefficient differential operator is, up to the Fourier transform, a multiplication
operator. In this module we take that as a definition: for a symbol `f : Space d → ℂ`, a function

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Every constant-coefficient differential operator is, up to the Fourier transform, a multiplication
operator. In this module we take that as a definition: for a symbol `f : Space d → ℂ`, a function
Every constant-coefficient differential operator is unitarily equivalent, via the Fourier transform, to a multiplication
operator. In this module we take that as a definition: for a symbol `f : Space d → ℂ`, a function

Something like this might be clearer.

Comment on lines +19 to +21
of the wavenumber `k`, the derivative operator `derivOperator f` is the conjugate
`𝓕⁻¹ ∘ 𝓜 (f ∘ 2π•) ∘ 𝓕` of the multiplication operator by the Fourier unitary, through
`LinearPMap.unitaryConj`.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should explain the design decision to have explicit factors of 2π here.

Comment on lines +56 to +58
/-- The derivative operator with symbol `f : Space d → ℂ`, a function of the wavenumber `k`. -/
def derivOperator (f : Space d → ℂ) : SpaceDHilbertSpace d →ₗ.[ℂ] SpaceDHilbertSpace d :=
(𝓜 volume fun ξ => f ((2 * Real.pi) • ξ)).unitaryConj (fourierUnitary d).symm

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/-- The derivative operator with symbol `f : Space d → ℂ`, a function of the wavenumber `k`. -/
def derivOperator (f : Space d → ℂ) : SpaceDHilbertSpace d →ₗ.[ℂ] SpaceDHilbertSpace d :=
(𝓜 volume fun ξ => f ((2 * Real.pi) • ξ)).unitaryConj (fourierUnitary d).symm
/-- The derivative operator with symbol `f : Space d → ℂ`, interpreted as a function of the wavenumber `k`. -/
def derivOperator (f : Space d → ℂ) : SpaceDHilbertSpace d →ₗ.[ℂ] SpaceDHilbertSpace d :=
(𝓜 volume (f ∘ fun k ↦ (2 * π) • k)).unitaryConj (fourierUnitary d).symm

Comment on lines +56 to +59
/-- The derivative operator with symbol `f : Space d → ℂ`, a function of the wavenumber `k`. -/
def derivOperator (f : Space d → ℂ) : SpaceDHilbertSpace d →ₗ.[ℂ] SpaceDHilbertSpace d :=
(𝓜 volume fun ξ => f ((2 * Real.pi) • ξ)).unitaryConj (fourierUnitary d).symm

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Let's add a derivOperator_eq lemma expressing the definition of derivOperator f.
  2. It might be nice to have a \MCD notation for derivOperator analogous to that for mulOperator.

Comment on lines +71 to +73
lemma mem_derivOperator_domain_iff {ψ : SpaceDHilbertSpace d} :
ψ ∈ (derivOperator f).domain
↔ fourierUnitary d ψ ∈ (𝓜 volume fun ξ => f ((2 * Real.pi) • ξ)).domain := Iff.rfl

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
lemma mem_derivOperator_domain_iff {ψ : SpaceDHilbertSpace d} :
ψ ∈ (derivOperator f).domain
↔ fourierUnitary d ψ ∈ (𝓜 volume fun ξ => f ((2 * Real.pi) • ξ)).domain := Iff.rfl
lemma mem_derivOperator_domain_iff {ψ : SpaceDHilbertSpace d} :
ψ ∈ (derivOperator f).domain ↔ 𝓕 ψ ∈ (𝓜 volume (f ∘ fun k ↦ (2 * π) • k)).domain := Iff.rfl

Remember from #1426 that 𝓕 ψ is the simp normal form of fourierUnitary d ψ.

Comment on lines +76 to +79
lemma derivOperator_apply (ψ : (derivOperator f).domain) :
derivOperator f ψ = (fourierUnitary d).symm
((𝓜 volume fun ξ => f ((2 * Real.pi) • ξ))
⟨fourierUnitary d ↑ψ, mem_derivOperator_domain_iff.mp ψ.2⟩) := rfl

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
lemma derivOperator_apply (ψ : (derivOperator f).domain) :
derivOperator f ψ = (fourierUnitary d).symm
((𝓜 volume fun ξ => f ((2 * Real.pi) • ξ))
⟨fourierUnitary d ↑ψ, mem_derivOperator_domain_iff.mp ψ.2⟩) := rfl
lemma derivOperator_apply (ψ : (derivOperator f).domain) :
derivOperator f ψ =
𝓕⁻ ((𝓜 volume (f ∘ fun k ↦ (2 * π) • k)) ⟨𝓕 ψ.1, mem_derivOperator_domain_iff.mp ψ.2⟩) :=
rfl

Same here.

Comment on lines +90 to +93
rw [derivOperator, unitaryConj_adjoint _
(mulOperator_hasDenseDomain (aestronglyMeasurable_comp_two_pi_smul hf)),
mulOperator_adjoint_eq_conj (aestronglyMeasurable_comp_two_pi_smul hf)]
rfl

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
rw [derivOperator, unitaryConj_adjoint _
(mulOperator_hasDenseDomain (aestronglyMeasurable_comp_two_pi_smul hf)),
mulOperator_adjoint_eq_conj (aestronglyMeasurable_comp_two_pi_smul hf)]
rfl
simp only [derivOperator_eq, aestronglyMeasurable_comp_const_smul hf, mulOperator_hasDenseDomain,
unitaryConj_adjoint, mulOperator_adjoint_eq_conj, Function.comp_assoc]

derivOperator_eq to unpack the definition of the derivative operators and can use simp to avoid repetition of the aestronglyMeasurable_comp lemma.

Comment on lines +664 to +666
lemma unitaryConj_adjoint
[CompleteSpace H] [CompleteSpace H'] (u : H ≃ₗᵢ[ℂ] H') (hdense : A.HasDenseDomain) :
(unitaryConj u A)† = unitaryConj u A† := by

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should be a simp lemma.
Also, I'm pretty sure the hdense hypothesis can be removed: if A is not densely defined then both sides are zero operators (c.f. adjoint_apply_of_not_dense) so just need to check domains match.

Comment on lines +34 to +35
- A. The derivative operator
- B. The Schwartz submodule in the domain

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's organize by (def + defining properties), (domain), (adjoints). We'll definitely have more domain-type lemmas in the future so best to keep them together from the beginning.

@gloges gloges added the awaiting-author A reviewer has asked the author a question or requested changes label Jul 22, 2026
When A is not densely defined, both adjoints are the zero map and the
adjoint domains are identified through the unitary, so the equality
holds unconditionally. Adds @[simp] unitaryConj_hasDenseDomain_iff and
drops a now-unused simp argument in derivOperator_adjoint.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-author A reviewer has asked the author a question or requested changes t-quantum-mechanics Quantum mechanics

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants