Skip to content

feat(CommensurableLimit): modular forms over a commensurability class as a direct limit - #5214

Open
CBirkbeck wants to merge 5 commits into
mainfrom
dev/modular-commensurable
Open

feat(CommensurableLimit): modular forms over a commensurability class as a direct limit#5214
CBirkbeck wants to merge 5 commits into
mainfrom
dev/modular-commensurable

Conversation

@CBirkbeck

Copy link
Copy Markdown
Owner

Summary

Defines the space of modular forms of weight k and any level, as a direct limit over the commensurability class of a fixed group Γ₀ ≤ GL₂(ℝ).

ModularFormCommensurable Γ₀ k :=
  Module.DirectLimit (fun i : CommIndex Γ₀ => ModularForm i.carrier k) (commTransition Γ₀ k)

the colimit of ModularForm Γ k over all determinant-one subgroups Γ commensurable with Γ₀, ordered by reverse inclusion with restriction as the transition maps. Headline instance ModularFormArithmetic k := ModularFormCommensurable 𝒮ℒ k — the commensurability class of SL₂(ℤ) (mathlib's Subgroup.IsArithmetic), the natural home of the Hecke/commensurator action.

New folder projects/LeanModularForms/LeanModularForms/CommensurableLimit/:

  • CommensurabilityClass.lean — the directed index poset ModularForm.CommIndex Γ₀ (reverse-inclusion Preorder, Nonempty, IsDirected via closure of the class under ), plus two reusable foundational lemmas mathlib lacks: Subgroup.HasDetOne.of_le (antitonicity) and Subgroup.commensurable_inf.
  • DirectLimit.leanModularForm.restrictSubgroupₗ (the -linear restriction Mₖ(Γ) → Mₖ(Γ′) for Γ′ ≤ Γ), the limit with its AddCommGroup/Module ℂ structure, ofLevel (with restriction-compatibility ofLevel_restrict and injectivity ofLevel_injective), and the lift universal property.

Why det-one

ModularForm Γ k is a Module ℂ only when Γ.HasDetOne (otherwise just ); indexing over det-one subgroups keeps the limit a -vector space. Conjugation preserves det-one, so the commensurator action survives.

Verification

  • lake build green for both modules + the folder aggregator (wired into the lib root).
  • Zero sorry; #print axioms for all 9 public declarations → only propext, Classical.choice, Quot.sound (the Classical.choice is the classical DecidableEq on the subgroup index, required by Module.DirectLimit).

Scope

Space + core API only (producer → cleanup handoff). Out of scope / follow-up: the commensurator (Hecke) action of GL₂⁺(ℚ) on the limit — the project already has a HeckePair/HeckeAction layer to build on.

🤖 Generated with Claude Code

CDBirbeck and others added 5 commits June 29, 2026 16:57
… as a direct limit

Define `ModularFormCommensurable Γ₀ k` as the `Module.DirectLimit` of `ModularForm Γ k`
over the determinant-one subgroups `Γ` commensurable with `Γ₀`, ordered by reverse
inclusion (with restriction as transition maps). Headline `ModularFormArithmetic k` at
`Γ₀ = 𝒮ℒ` (the image of SL₂(ℤ)).

New folder `projects/LeanModularForms/LeanModularForms/CommensurableLimit/`:
- CommensurabilityClass.lean: index poset `ModularForm.CommIndex Γ₀` (reverse-inclusion
  Preorder, Nonempty, IsDirected via ⊓-closure), plus `Subgroup.HasDetOne.of_le` and
  `Subgroup.commensurable_inf`.
- DirectLimit.lean: `ModularForm.restrictSubgroupₗ` (ℂ-linear restriction), the space with
  its AddCommGroup/Module ℂ structure, `ofLevel` (+ restriction compat, injectivity), and
  the `lift` universal property.

Sorry-free; #print axioms only propext/Classical.choice/Quot.sound.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nvariants theorem

Add `CommensuratorAction.lean`:
- `PComm Γ₀ := commensurator Γ₀ ⊓ GL(2,ℝ)⁺` acts on `ModularFormCommensurable Γ₀ k` by the
  weight-k slash action (`translateₗ`, a ℂ-linear translate for positive determinant), bundled
  as `commRep : Representation ℂ (PComm Γ₀) (ModularFormCommensurable Γ₀ k)`.
- `toFunₗ : limit →ₗ[ℂ] (ℍ → ℂ)`, the injective underlying-function map, with
  `toFunₗ (g • x) = toFunₗ x ∣[k] g⁻¹`. The action axioms are proved through this intertwiner
  (slash_one / slash_mul), sidestepping the index transport.
- **Theorem `range_ofLevel_eq_invariants`**: for a level `Γ`, the image of `ModularForm Γ.carrier k`
  in the limit equals the `Γ.carrier`-invariants of the action. Corollary `ofLevelInvariantsEquiv`:
  `ModularForm Γ.carrier k ≃ₗ[ℂ]` those invariants.

Supporting gap lemmas: `HasDetOne.conj`, `commensurable_conj`, `commensurable_le_commensurator`.
Cusp-boundedness transfers across the class via mathlib's `Commensurable.isCusp_iff`.

Sorry-free; #print axioms only propext/Classical.choice/Quot.sound.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Style + golf pass to mathlib standards across CommensurabilityClass.lean,
DirectLimit.lean, CommensuratorAction.lean (no statement/signature changes,
no new sorries, axioms unchanged):
- `fun … =>` → `fun … ↦` throughout (project style)
- golf: `commensurable_le_commensurator` via `conjAct_pointwise_smul_eq_self`;
  `HasDetOne.conj` → `simpa`; inlined single-use `have`s; term-mode tidy-ups
- removed the staged `/-! ## Stage N` dividers; proper Main definitions/results
  module docstrings
- removed a stale `set_option linter.unusedSimpArgs false in` (no longer fires)
- line-packing + docstring tidy-ups

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…j` wrapper

Per the /mathlibable NO-composable verdict: `Subgroup.commensurable_conj` was a
3-call composition of mathlib's `Commensurable.conj` + `commensurator_mem_iff` +
`.trans`. Inline it at its sole call site (`CommIndex.conj`) and drop the wrapper.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… ℝ general version

Refactor the construction over a shared, predicate-parametrized index and add the
general ℝ-scalar version, deducing the existing ℂ det-one version as the special case.

- CommensurabilityClass.lean: `Subgroup.IsConjInfClosed P` (closure under ⊓ + conjugation)
  and the parametrized index `ModularForm.CommIndex Γ₀ P` (instances for P = ⊤ and the
  det-one predicate `DetOnePred`). `CommIndex.conj` is now generic in P.
- DirectLimit.lean / CommensuratorAction.lean: the ℂ construction is now the det-one
  instance `CommIndex Γ₀ DetOnePred`; public API unchanged (`ModularFormCommensurable`,
  `commRep`, `range_ofLevel_eq_invariants`, …).
- Real.lean (new): the genuinely-general version over the WHOLE commensurability class
  (`P = fun _ ↦ True`), with NO determinant conditions — `ModularFormCommensurableReal`
  as an ℝ-vector space, the FULL commensurator acting ℝ-linearly (`σ` fixes ℝ via
  `σ_ofReal`, so no positivity needed), `commRepℝ : Representation ℝ (commensurator Γ₀) _`,
  and `range_ofLevelℝ_eq_invariants`.

The det-one ℂ version (positive-det commensurator, ℂ-linear) is the specialization that
upgrades the scalars. Sorry-free; axioms only propext/Classical.choice/Quot.sound for both.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants