Paper I · Lean source
PacketTopology.lean
Declared contract recorded Coverage and evidence
The cited release explicitly reports completion of its registered formal contract, under its exact hypotheses.
This viewer reads the retained source; it does not run Lean or assign new claim mappings.
Local imports (2)
PaperIRelease/PacketTopology.lean317 lines
Original source path
formal/current/PaperIRelease/PacketTopology.leanSkip declarations and read code
1 import PaperIRelease.PacketExactSequence
2 import KomorebiVerification.TopologicalCompletion
3
4 /-!
5 # Closed invariant subspaces and Banach packet exact sequences
6
7 The continuous maps bundle the same algebraic maps constructed in
8 `PacketDescent`, and their exactness is proved by those literal identifications.
9 The quotient carries its quotient norm; closedness supplies separation.
10 -/
11
12 noncomputable section
13 set_option autoImplicit false
14 set_option linter.style.haveILetI false
15
16 namespace Komorebi.Foundation.LinearProjectorFamily
17
18 universe u v w
19
20 variable {𝕜 : Type u} {X : Type v} {ι : Type w}
21 variable [NontriviallyNormedField 𝕜] [NormedAddCommGroup X] [NormedSpace 𝕜 X]
22 variable [Fintype ι]
23
24 /-- Bundle the original projector with its asserted continuity. -/
25 def boundedProjector (P : LinearProjectorFamily 𝕜 X ι)
26 (hP : ∀ i, Continuous (P.proj i)) (i : ι) : X →L[𝕜] X :=
27 ⟨P.proj i, hP i⟩
28
29 theorem isClosed_range_of_bounded (P : LinearProjectorFamily 𝕜 X ι)
30 (hP : ∀ i, Continuous (P.proj i)) (i : ι) :
31 IsClosed (LinearMap.range (P.proj i) : Set X) := by
32 apply ContinuousLinearMap.IsIdempotentElem.isClosed_range
33 (p := P.boundedProjector hP i)
34 apply ContinuousLinearMap.ext
35 intro x
36 exact P.idempotent i x
37
38 variable (P : LinearProjectorFamily 𝕜 X ι)
39 variable (hP : ∀ i, Continuous (P.proj i))
40 variable (K : Submodule 𝕜 X) (hK : P.Preserves K)
41
42 /-- The original restricted projector, with inherited continuity. -/
43 def restrictedProjectorCLM (i : ι) : K →L[𝕜] K where
44 toLinearMap := (P.restrictTo K hK).proj i
45 cont := ((hP i).comp continuous_subtype_val).subtype_mk _
46
47 @[simp] theorem restrictedProjectorCLM_toLinearMap (i : ι) :
48 (P.restrictedProjectorCLM hP K hK i).toLinearMap =
49 (P.restrictTo K hK).proj i := rfl
50
51 /-- The quotient projector is the continuous quotient lift of `π ∘ P_i`. -/
52 def quotientProjectorCLM (i : ι) : (X ⧸ K) →L[𝕜] (X ⧸ K) :=
53 K.liftQL (K.mkQL.comp (P.boundedProjector hP i)) (by
54 intro x hx
55 change K.mkQ (P.proj i x) = 0
56 exact (Submodule.Quotient.mk_eq_zero K).mpr (hK i x hx))
57
58 @[simp] theorem quotientProjectorCLM_toLinearMap (i : ι) :
59 (P.quotientProjectorCLM hP K hK i).toLinearMap =
60 (P.descendTo K hK).proj i := rfl
61
62 @[simp] theorem quotientProjectorCLM_mkQ (i : ι) (x : X) :
63 P.quotientProjectorCLM hP K hK i (K.mkQ x) = K.mkQ (P.proj i x) := rfl
64
65 /-- Quotient projectors satisfy the sharp inherited operator bound. -/
66 theorem quotientProjector_norm_apply_le (i : ι) (z : X ⧸ K) :
67 ‖P.quotientProjectorCLM hP K hK i z‖ ≤ ‖P.boundedProjector hP i‖ * ‖z‖ := by
68 let C := ‖P.boundedProjector hP i‖
69 have hC : 0 ≤ C := norm_nonneg _
70 apply le_of_forall_pos_le_add
71 intro ε hε
72 obtain ⟨x, hx, hnorm⟩ := Submodule.Quotient.norm_mk_lt z
73 (show 0 < ε / (C + 1) by positivity)
74 have hbase : ‖P.quotientProjectorCLM hP K hK i z‖ ≤ C * ‖x‖ := by
75 rw [← hx]
76 exact (Submodule.Quotient.norm_mk_le K (P.proj i x)).trans
77 ((P.boundedProjector hP i).le_opNorm x)
78 have hmul : C * ‖x‖ ≤ C * (‖z‖ + ε / (C + 1)) :=
79 mul_le_mul_of_nonneg_left hnorm.le hC
80 have hsmall : C * (ε / (C + 1)) ≤ ε := by
81 have hpos : 0 < C + 1 := by positivity
82 rw [← mul_div_assoc]
83 apply (div_le_iff₀ hpos).mpr
84 nlinarith
85 exact hbase.trans (hmul.trans (by nlinarith))
86
87 /-- The quotient operator norm cannot exceed that of the original projector. -/
88 theorem quotientProjector_norm_le (i : ι) :
89 ‖P.quotientProjectorCLM hP K hK i‖ ≤ ‖P.boundedProjector hP i‖ :=
90 ContinuousLinearMap.opNorm_le_bound _ (norm_nonneg _)
91 (P.quotientProjector_norm_apply_le hP K hK i)
92
93 /-- The actual packet inclusion is bounded as a composition of subtype maps. -/
94 def packetInclusionCLM (i : ι) :
95 LinearMap.range ((P.restrictTo K hK).proj i) →L[𝕜]
96 LinearMap.range (P.proj i) :=
97 (K.subtypeL.comp (LinearMap.range ((P.restrictTo K hK).proj i)).subtypeL).codRestrict
98 (LinearMap.range (P.proj i)) (fun x ↦ (P.packetInclusion K hK i x).property)
99
100 @[simp] theorem packetInclusionCLM_toLinearMap (i : ι) :
101 (P.packetInclusionCLM K hK i).toLinearMap = P.packetInclusion K hK i := rfl
102
103 /-- The actual packet quotient map is bounded as the restriction and
104 corestriction of the ambient quotient map. -/
105 def packetQuotientCLM (i : ι) :
106 LinearMap.range (P.proj i) →L[𝕜]
107 LinearMap.range ((P.descendTo K hK).proj i) :=
108 (K.mkQL.comp (LinearMap.range (P.proj i)).subtypeL).codRestrict
109 (LinearMap.range ((P.descendTo K hK).proj i))
110 (fun x ↦ (P.packetQuotientMap K hK i x).property)
111
112 @[simp] theorem packetQuotientCLM_toLinearMap (i : ι) :
113 (P.packetQuotientCLM K hK i).toLinearMap = P.packetQuotientMap K hK i := rfl
114
115 theorem packetQuotientCLM_norm_le_one (i : ι) :
116 ‖P.packetQuotientCLM K hK i‖ ≤ 1 := by
117 apply ContinuousLinearMap.opNorm_le_bound _ zero_le_one
118 intro x
119 change ‖(Submodule.Quotient.mk (x : X) : X ⧸ K)‖ ≤ 1 * ‖x‖
120 simpa using (Submodule.Quotient.norm_mk_le K (x : X))
121
122 /-- The submodule `X_i ∩ K`, expressed inside `X_i`. -/
123 abbrev packetIntersection (i : ι) : Submodule 𝕜 (LinearMap.range (P.proj i)) :=
124 K.comap (LinearMap.range (P.proj i)).subtype
125
126 /-- Factor the actual continuous packet quotient map through its kernel. -/
127 def packetQuotientLiftCLM (i : ι) :
128 (LinearMap.range (P.proj i) ⧸ P.packetIntersection K i) →L[𝕜]
129 LinearMap.range ((P.descendTo K hK).proj i) :=
130 (P.packetIntersection K i).liftQL (P.packetQuotientCLM K hK i) (by
131 rw [packetQuotientCLM_toLinearMap, P.packetQuotientMap_ker])
132
133 /-- Project and then take the quotient of the source packet. -/
134 def projectToPacketQuotient (i : ι) :
135 X →L[𝕜] (LinearMap.range (P.proj i) ⧸ P.packetIntersection K i) :=
136 (P.packetIntersection K i).mkQL.comp
137 ((P.boundedProjector hP i).codRestrict (LinearMap.range (P.proj i))
138 (fun x ↦ ⟨x, rfl⟩))
139
140 /-- This inverse is induced from the actual bounded projector, using
141 invariance to prove that the projected map vanishes on `K`. -/
142 def packetQuotientInverseAmbient (i : ι) :
143 (X ⧸ K) →L[𝕜] (LinearMap.range (P.proj i) ⧸ P.packetIntersection K i) :=
144 K.liftQL (P.projectToPacketQuotient hP K i) (by
145 intro x hx
146 change Submodule.Quotient.mk (⟨P.proj i x, ⟨x, rfl⟩⟩ : LinearMap.range (P.proj i)) = 0
147 apply (Submodule.Quotient.mk_eq_zero (P.packetIntersection K i)).mpr
148 exact hK i x hx)
149
150 def packetQuotientInverseCLM (i : ι) :
151 LinearMap.range ((P.descendTo K hK).proj i) →L[𝕜]
152 (LinearMap.range (P.proj i) ⧸ P.packetIntersection K i) :=
153 (P.packetQuotientInverseAmbient hP K hK i).comp
154 (LinearMap.range ((P.descendTo K hK).proj i)).subtypeL
155
156 /-- The quotient identification is a bounded linear equivalence. Its inverse
157 is constructed from `P_i`, so no open-mapping hypothesis or supplied inverse
158 is being smuggled into the statement. -/
159 def packetQuotientEquivL (i : ι) :
160 (LinearMap.range (P.proj i) ⧸ P.packetIntersection K i) ≃L[𝕜]
161 LinearMap.range ((P.descendTo K hK).proj i) :=
162 ContinuousLinearEquiv.equivOfInverse
163 (P.packetQuotientLiftCLM K hK i) (P.packetQuotientInverseCLM hP K hK i)
164 (by
165 intro z
166 obtain ⟨x, rfl⟩ := (P.packetIntersection K i).mkQ_surjective z
167 change Submodule.Quotient.mk
168 (⟨P.proj i (x : X), ⟨(x : X), rfl⟩⟩ : LinearMap.range (P.proj i)) =
169 Submodule.Quotient.mk x
170 congr 1
171 exact Subtype.ext (P.proj_eq_self_of_mem_range i x.property))
172 (by
173 intro z
174 apply Subtype.ext
175 obtain ⟨x, hx⟩ := K.mkQ_surjective (z : X ⧸ K)
176 have hz := (P.descendTo K hK).proj_eq_self_of_mem_range i z.property
177 rw [← hx] at hz
178 change K.mkQ (P.proj i x) = K.mkQ x at hz
179 change (P.packetQuotientLiftCLM K hK i
180 (P.packetQuotientInverseAmbient hP K hK i (z : X ⧸ K)) : X ⧸ K) = _
181 rw [← hx]
182 exact hz)
183
184 @[simp] theorem packetQuotientEquivL_mk (i : ι)
185 (x : LinearMap.range (P.proj i)) :
186 (P.packetQuotientEquivL hP K hK i (Submodule.Quotient.mk x) : X ⧸ K) =
187 K.mkQ (x : X) := rfl
188
189 include hK in
190 /-- The projector is the identity modulo `K` on the sum `X_i + K`. -/
191 theorem packetSum_proj_modK (i : ι) (x : ↥(LinearMap.range (P.proj i) ⊔ K)) :
192 K.mkQ (P.proj i (x : X)) = K.mkQ (x : X) := by
193 obtain ⟨a, ha, b, hb, hab⟩ := Submodule.mem_sup.mp x.property
194 have hb0 : K.mkQ b = 0 := (Submodule.Quotient.mk_eq_zero K).mpr hb
195 have hPb0 : K.mkQ (P.proj i b) = 0 :=
196 (Submodule.Quotient.mk_eq_zero K).mpr (hK i b hb)
197 rw [← hab, map_add, P.proj_eq_self_of_mem_range i ha, map_add, map_add, hb0, hPb0]
198
199 /-- Restrict the quotient map to `X_i + K` and corestrict to the quotient packet. -/
200 def packetSumQuotientMapCLM (i : ι) :
201 ↥(LinearMap.range (P.proj i) ⊔ K) →L[𝕜]
202 LinearMap.range ((P.descendTo K hK).proj i) :=
203 (K.mkQL.comp (LinearMap.range (P.proj i) ⊔ K).subtypeL).codRestrict
204 (LinearMap.range ((P.descendTo K hK).proj i))
205 (fun x ↦ ⟨K.mkQ (x : X), P.packetSum_proj_modK K hK i x⟩)
206
207 def packetSumQuotientLiftCLM (i : ι) :
208 (↥(LinearMap.range (P.proj i) ⊔ K) ⧸
209 K.comap (LinearMap.range (P.proj i) ⊔ K).subtype) →L[𝕜]
210 LinearMap.range ((P.descendTo K hK).proj i) :=
211 (K.comap (LinearMap.range (P.proj i) ⊔ K).subtype).liftQL
212 (P.packetSumQuotientMapCLM K hK i) (by
213 intro x hx
214 apply Subtype.ext
215 exact (Submodule.Quotient.mk_eq_zero K).mpr hx)
216
217 /-- Project from the ambient quotient into the sum quotient. -/
218 def packetSumQuotientInverseAmbient (i : ι) :
219 (X ⧸ K) →L[𝕜]
220 (↥(LinearMap.range (P.proj i) ⊔ K) ⧸
221 K.comap (LinearMap.range (P.proj i) ⊔ K).subtype) :=
222 K.liftQL
223 ((K.comap (LinearMap.range (P.proj i) ⊔ K).subtype).mkQL.comp
224 ((P.boundedProjector hP i).codRestrict (LinearMap.range (P.proj i) ⊔ K)
225 (fun x ↦ Submodule.mem_sup.mpr ⟨P.proj i x, ⟨x, rfl⟩, 0, K.zero_mem, add_zero _⟩)))
226 (by
227 intro x hx
228 apply (Submodule.Quotient.mk_eq_zero
229 (K.comap (LinearMap.range (P.proj i) ⊔ K).subtype)).mpr
230 exact hK i x hx)
231
232 /-- The quotient packet is also boundedly isomorphic to `(X_i + K)/K`. -/
233 def packetSumQuotientEquivL (i : ι) :
234 (↥(LinearMap.range (P.proj i) ⊔ K) ⧸
235 K.comap (LinearMap.range (P.proj i) ⊔ K).subtype) ≃L[𝕜]
236 LinearMap.range ((P.descendTo K hK).proj i) :=
237 ContinuousLinearEquiv.equivOfInverse
238 (P.packetSumQuotientLiftCLM K hK i)
239 ((P.packetSumQuotientInverseAmbient hP K hK i).comp
240 (LinearMap.range ((P.descendTo K hK).proj i)).subtypeL)
241 (by
242 intro z
243 obtain ⟨x, rfl⟩ :=
244 (K.comap (LinearMap.range (P.proj i) ⊔ K).subtype).mkQ_surjective z
245 apply (Submodule.Quotient.eq
246 (K.comap (LinearMap.range (P.proj i) ⊔ K).subtype)).mpr
247 exact (Submodule.Quotient.eq K).mp (P.packetSum_proj_modK K hK i x))
248 (by
249 intro z
250 apply Subtype.ext
251 obtain ⟨x, hx⟩ := K.mkQ_surjective (z : X ⧸ K)
252 have hz := (P.descendTo K hK).proj_eq_self_of_mem_range i z.property
253 rw [← hx] at hz
254 change K.mkQ (P.proj i x) = K.mkQ x at hz
255 change (P.packetSumQuotientLiftCLM K hK i
256 (P.packetSumQuotientInverseAmbient hP K hK i (z : X ⧸ K)) : X ⧸ K) = _
257 rw [← hx]
258 exact hz)
259
260 include hP
261
262 theorem isClosed_restricted_packet (i : ι) :
263 IsClosed (LinearMap.range ((P.restrictTo K hK).proj i) : Set K) :=
264 (P.restrictTo K hK).isClosed_range_of_bounded
265 (fun j ↦ (P.restrictedProjectorCLM hP K hK j).continuous) i
266
267 variable [hclosed : IsClosed (K : Set X)]
268
269 theorem isClosed_quotient_packet (i : ι) :
270 IsClosed (LinearMap.range ((P.descendTo K hK).proj i) : Set (X ⧸ K)) :=
271 (P.descendTo K hK).isClosed_range_of_bounded
272 (fun j ↦ (P.quotientProjectorCLM hP K hK j).continuous) i
273
274 include hK in
275 /-- Invariance makes `X_i + K` closed: it is the inverse image of the closed
276 quotient packet. This is stronger than closedness of two arbitrary summands. -/
277 theorem isClosed_packet_sum (i : ι) :
278 IsClosed ((LinearMap.range (P.proj i) ⊔ K : Submodule 𝕜 X) : Set X) := by
279 have h := (P.isClosed_quotient_packet hP K hK i).preimage K.mkQL.continuous
280 change IsClosed ((LinearMap.range ((P.descendTo K hK).proj i)).comap K.mkQ : Set X) at h
281 rwa [P.descendTo_range_preimage] at h
282
283 /-- Every term of the packet sequence is complete under the inherited norm. -/
284 theorem packet_sequence_complete [CompleteSpace X] (i : ι) :
285 CompleteSpace (LinearMap.range ((P.restrictTo K hK).proj i)) ∧
286 CompleteSpace (LinearMap.range (P.proj i)) ∧
287 CompleteSpace (LinearMap.range ((P.descendTo K hK).proj i)) := by
288 letI : IsClosed (LinearMap.range ((P.restrictTo K hK).proj i) : Set K) :=
289 P.isClosed_restricted_packet hP K hK i
290 letI : IsClosed (LinearMap.range (P.proj i) : Set X) :=
291 P.isClosed_range_of_bounded hP i
292 letI : IsClosed (LinearMap.range ((P.descendTo K hK).proj i) : Set (X ⧸ K)) :=
293 P.isClosed_quotient_packet hP K hK i
294 exact ⟨inferInstance, inferInstance, inferInstance⟩
295
296 /-- Paper I's topological packet exact sequence: the actual packet maps are
297 bounded, injective/exact/surjective, their three spaces are Banach, and the
298 constructed quotient projector has norm at most the original projector. -/
299 theorem banach_packet_shortExact [CompleteSpace X] (i : ι) :
300 CompleteSpace (LinearMap.range ((P.restrictTo K hK).proj i)) ∧
301 CompleteSpace (LinearMap.range (P.proj i)) ∧
302 CompleteSpace (LinearMap.range ((P.descendTo K hK).proj i)) ∧
303 Function.Injective (P.packetInclusionCLM K hK i) ∧
304 LinearMap.range (P.packetInclusionCLM K hK i).toLinearMap =
305 LinearMap.ker (P.packetQuotientCLM K hK i).toLinearMap ∧
306 Function.Surjective (P.packetQuotientCLM K hK i) ∧
307 ‖P.quotientProjectorCLM hP K hK i‖ ≤ ‖P.boundedProjector hP i‖ := by
308 obtain ⟨h1, h2, h3⟩ := P.packet_sequence_complete hP K hK i
309 obtain ⟨hinj, hexact, hsurj⟩ := P.packet_shortExact K hK i
310 exact ⟨h1, h2, h3, hinj, hexact, hsurj, P.quotientProjector_norm_le hP K hK i⟩
311
312 end Komorebi.Foundation.LinearProjectorFamily
313
314 #print axioms Komorebi.Foundation.LinearProjectorFamily.banach_packet_shortExact
315 #print axioms Komorebi.Foundation.LinearProjectorFamily.quotientProjector_norm_le
316 #print axioms Komorebi.Foundation.LinearProjectorFamily.packetQuotientEquivL
317 #print axioms Komorebi.Foundation.LinearProjectorFamily.packetSumQuotientEquivL
Original file and source record
This copy matches the recorded source file. Its publication here does not change the work’s review status.
SHA-256: 9d563f98fecf9b6d0c961b140cc3a6dbda4fbfbb804bcce5c520a0b1fc6ca30a
Back to Paper I: Typed Operator Systems, Seed Rank, and Exact Packet Coordinates