Paper I · Lean source
SeedRankOperations.lean
21 claims linked to this Lean module
- Realized operator algebra · Read statement beside this module
- Action factorization and hull invariance · Read statement beside this module
- Linear seed system · Read statement beside this module
- Generated hull · Read statement beside this module
- Seed evaluation map · Read statement beside this module
- Finite free presentation · Read statement beside this module
- Minimal free-cover characterization · Read statement beside this module
- Seed rank · Read statement beside this module
- Cyclic characterization · Read statement beside this module
- Monotonicity under enlargement of the acting algebra · Read statement beside this module
- Quotient monotonicity · Read statement beside this module
- Isomorphism invariance · Read statement beside this module
- Short exact sequence bounds · Read statement beside this module
- Shared direct-sum bounds · Read statement beside this module
- Independent direct-sum formula · Read statement beside this module
- Tensor-product bound · Read statement beside this module
- Tensor rank is not generally multiplicative · Read statement beside this module
- Scalar-extension monotonicity · Read statement beside this module
- Seed-rank witness · Read statement beside this module
- Scalar quotient witness · Read statement beside this module
- Mixed-support seeds can merge source requirements · Read statement beside this module
These links follow the claim index. They do not extend the recorded proof or Lean coverage.
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 (1)
KomorebiVerification/SeedRankOperations.lean643 lines
Original source path
formal/current/KomorebiVerification/SeedRankOperations.leanSkip declarations and read code
1 import KomorebiVerification.SeedRankBasics
2
3 /-!
4 # Seed-rank operations for Paper I
5
6 This file completes the finite algebraic seed-rank operations used in Paper I:
7 the finite free-presentation minimum, unrestricted cyclicity, semilinear
8 quotient monotonicity and image-algebra invariance, shared and independent
9 direct sums, the tensor-product bound for the natural operator action, and the
10 scalar-quotient obstruction.
11 -/
12
13 set_option autoImplicit false
14
15 -- Keep theorem bodies stable in this audit release while making the build warning-fatal.
16 set_option linter.unnecessarySimpa false
17 set_option linter.style.haveILetI false
18 set_option linter.unusedSectionVars false
19
20 namespace Komorebi.SeedRankOperations
21
22 open Cardinal Set
23 open Komorebi.SeedRankBasics
24 open scoped TensorProduct
25
26 universe u
27
28 section FiniteFreePresentation
29
30 variable (A M : Type u)
31 variable [Semiring A] [AddCommMonoid M] [Module A M]
32
33 /-- A finite module admits a generating family indexed by its seed finrank. -/
34 theorem exists_minimal_fin_family [Module.Finite A M] :
35 ∃ v : Fin (seedFinrank A M) → M, FamilyGenerates A M v := by
36 classical
37 obtain ⟨s, hsCard, hsSpan⟩ :=
38 Submodule.FG.exists_span_finset_card_eq_spanFinrank
39 (R := A) (M := M) Module.Finite.fg_top
40 have hcard : seedFinrank A M = s.card := by
41 simpa [seedFinrank] using hsCard.symm
42 let e : Fin (seedFinrank A M) ≃ s :=
43 (Equiv.cast (congrArg Fin hcard)).trans s.equivFin.symm
44 refine ⟨fun i ↦ (e i : M), ?_⟩
45 rw [FamilyGenerates, Generates]
46 have hrange : Set.range (fun i ↦ (e i : M)) = (s : Set M) := by
47 ext x
48 constructor
49 · rintro ⟨i, rfl⟩
50 exact (e i).property
51 · intro hx
52 have hx' : x ∈ s := by simpa using hx
53 let sx : s := ⟨x, hx'⟩
54 exact ⟨e.symm sx, by simp [sx]⟩
55 rw [hrange]
56 simpa using hsSpan
57
58 /--
59 The seed finrank is the least finite rank of a free module admitting a
60 surjective presentation map onto a finite module.
61 -/
62 theorem seedFinrank_isLeast_free_surjection [Module.Finite A M] :
63 IsLeast
64 {n : ℕ | ∃ f : (Fin n →₀ A) →ₗ[A] M, Function.Surjective f}
65 (seedFinrank A M) := by
66 constructor
67 · obtain ⟨v, hv⟩ := exists_minimal_fin_family A M
68 exact ⟨multiSeedMap A M v, (familyGenerates_iff_surjective A M v).mp hv⟩
69 · intro n hn
70 obtain ⟨f, hf⟩ := hn
71 have hrank : seedRank A M ≤ seedRank A (Fin n →₀ A) :=
72 seedRank_le_of_surjective f hf
73 have hfree : seedRank A (Fin n →₀ A) ≤ n := by
74 let v : Fin n → (Fin n →₀ A) :=
75 (Finsupp.basisSingleOne : Module.Basis (Fin n) A (Fin n →₀ A))
76 have hv : FamilyGenerates A (Fin n →₀ A) v := by
77 rw [FamilyGenerates, Generates]
78 simpa [v] using
79 (Finsupp.basisSingleOne : Module.Basis (Fin n) A (Fin n →₀ A)).span_eq
80 simpa using seedRank_le_mk_of_familyGenerates A (Fin n →₀ A) hv
81 have hcard : (seedFinrank A M : Cardinal) ≤ n := by
82 rw [← seedRank_eq_seedFinrank A M]
83 exact hrank.trans hfree
84 exact_mod_cast hcard
85
86 end FiniteFreePresentation
87
88 section Cyclicity
89
90 variable (A M : Type u)
91 variable [Semiring A] [AddCommMonoid M] [Module A M] [Nontrivial M]
92
93 /-- For every nonzero module, cardinal seed rank one is exactly cyclicity. -/
94 theorem cyclic_iff_seedRank_eq_one :
95 Cyclic A M ↔ seedRank A M = 1 := by
96 constructor
97 · intro hcyc
98 have hle : seedRank A M ≤ 1 := by
99 obtain ⟨x, hx⟩ := hcyc
100 simpa using seedRank_le_mk_of_generates A M hx
101 have hne : seedRank A M ≠ 0 := by
102 intro hzero
103 have hs : Subsingleton M := (seedRank_eq_zero_iff A M).mp hzero
104 exact not_subsingleton M hs
105 exact hle.antisymm (Cardinal.one_le_iff_ne_zero.mpr hne)
106 · intro hrank
107 have hfinite : Module.Finite A M :=
108 (seedRank_lt_aleph0_iff A M).mp (by simpa [hrank])
109 letI : Module.Finite A M := hfinite
110 exact (seedRank_eq_one_iff_cyclic A M).mp hrank
111
112 end Cyclicity
113
114 section SemilinearFunctoriality
115
116 variable {A B M N : Type u}
117 variable [Semiring A] [Semiring B]
118 variable [AddCommMonoid M] [Module A M]
119 variable [AddCommMonoid N] [Module B N]
120 variable {σ : A →+* B}
121
122 /--
123 Seed rank cannot increase under a surjective semilinear map, with no
124 surjectivity hypothesis on the scalar homomorphism. The image of a minimal
125 generating set already spans the target over `B` because its `B`-span contains
126 all finite combinations whose coefficients lie in the image of `σ`.
127 -/
128 theorem seedRank_le_of_surjective_semilinear (f : M →ₛₗ[σ] N)
129 (hf : Function.Surjective f) :
130 seedRank B N ≤ seedRank A M := by
131 classical
132 obtain ⟨s, hs, hsCard⟩ := exists_generating_set_card_eq_seedRank A M
133 have himage : Generates B N (f '' s) := by
134 rw [Generates]
135 apply top_unique
136 intro y _
137 obtain ⟨x, rfl⟩ := hf y
138 have hx : x ∈ Submodule.span A s := by
139 rw [hs]
140 trivial
141 refine Submodule.span_induction
142 (p := fun x _ ↦ f x ∈ Submodule.span B (f '' s)) ?_ ?_ ?_ ?_ hx
143 · intro x hxs
144 exact Submodule.subset_span ⟨x, hxs, rfl⟩
145 · simpa using (Submodule.zero_mem (Submodule.span B (f '' s)))
146 · intro x y _ _ hx' hy'
147 simpa using (Submodule.add_mem (Submodule.span B (f '' s)) hx' hy')
148 · intro a x _ hx'
149 simpa using (Submodule.smul_mem (Submodule.span B (f '' s)) (σ a) hx')
150 calc
151 seedRank B N ≤ Cardinal.mk (f '' s) :=
152 seedRank_le_mk_of_generates B N himage
153 _ ≤ Cardinal.mk s := Cardinal.mk_image_le
154 _ = seedRank A M := hsCard
155
156 /--
157 If the scalar map is onto and the semilinear intertwiner is bijective, seed
158 rank is invariant. Taking `B` to be the image of an algebra map is the
159 image-algebra form of Paper I's invariance statement.
160 -/
161 theorem seedRank_eq_of_bijective_semilinear (f : M →ₛₗ[σ] N)
162 [RingHomSurjective σ]
163 (hf : Function.Bijective f) :
164 seedRank A M = seedRank B N := by
165 rw [seedRank, seedRank]
166 calc
167 (⊤ : Submodule A M).spanRank = (Submodule.map f ⊤).spanRank :=
168 (Submodule.spanRank_map_eq_of_injective f hf.injective ⊤).symm
169 _ = (⊤ : Submodule B N).spanRank := by
170 rw [Submodule.map_top, LinearMap.range_eq_top.mpr hf.surjective]
171
172 end SemilinearFunctoriality
173
174 section ImageAlgebraInvariance
175
176 variable {k A B M N : Type u}
177 variable [CommSemiring k]
178 variable [Semiring A] [Algebra k A]
179 variable [Semiring B] [Algebra k B]
180 variable [AddCommMonoid M] [Module A M]
181 variable [AddCommMonoid N] [Module B N]
182
183 /--
184 Literal image-algebra invariance from Paper I. The target is restricted from
185 `B` to the subalgebra `φ.range`; a bijective `φ`-semilinear intertwiner then
186 preserves seed rank exactly. No surjectivity of `φ : A →ₐ[k] B` is assumed.
187 -/
188 theorem seedRank_imageAlgebra_eq
189 (φ : A →ₐ[k] B) (f : M →ₛₗ[φ.toRingHom] N)
190 (hf : Function.Bijective f) :
191 letI : Module φ.range N := Module.compHom N φ.range.val.toRingHom
192 seedRank A M = seedRank φ.range N := by
193 letI : Module φ.range N := Module.compHom N φ.range.val.toRingHom
194 let fRange : M →ₛₗ[φ.rangeRestrict.toRingHom] N :=
195 { toFun := f
196 map_add' := f.map_add
197 map_smul' := fun a x ↦ by
198 change f (a • x) = (↑(φ.rangeRestrict a) : B) • f x
199 simpa using f.map_smulₛₗ a x }
200 letI : RingHomSurjective φ.rangeRestrict.toRingHom :=
201 ⟨φ.rangeRestrict_surjective⟩
202 exact seedRank_eq_of_bijective_semilinear fRange hf
203
204 end ImageAlgebraInvariance
205
206 section SharedDirectSum
207
208 variable (A M N : Type u)
209 variable [Semiring A]
210 variable [AddCommMonoid M] [Module A M]
211 variable [AddCommMonoid N] [Module A N]
212
213 private theorem sharedSum_familyGenerates
214 {ι κ : Type u} {v : ι → M} {w : κ → N}
215 (hv : FamilyGenerates A M v) (hw : FamilyGenerates A N w) :
216 FamilyGenerates A (M × N)
217 (Sum.elim (fun i ↦ (v i, 0)) (fun j ↦ (0, w j))) := by
218 rw [FamilyGenerates, Generates] at hv hw
219 let z : ι ⊕ κ → M × N :=
220 Sum.elim (fun i ↦ (v i, 0)) (fun j ↦ (0, w j))
221 let p : Submodule A (M × N) := Submodule.span A (Set.range z)
222 change p = ⊤
223 have hleft : ∀ x : M, (x, 0) ∈ p := by
224 intro x
225 have hx : x ∈ Submodule.span A (Set.range v) := by simpa [hv]
226 refine Submodule.span_induction (p := fun x _ ↦ (x, 0) ∈ p) ?_ ?_ ?_ ?_ hx
227 · intro x hxv
228 obtain ⟨i, rfl⟩ := hxv
229 exact Submodule.subset_span ⟨Sum.inl i, rfl⟩
230 · exact p.zero_mem
231 · intro x y _ _ hx' hy'
232 simpa using p.add_mem hx' hy'
233 · intro a x _ hx'
234 simpa using p.smul_mem a hx'
235 have hright : ∀ y : N, (0, y) ∈ p := by
236 intro y
237 have hy : y ∈ Submodule.span A (Set.range w) := by simpa [hw]
238 refine Submodule.span_induction (p := fun y _ ↦ (0, y) ∈ p) ?_ ?_ ?_ ?_ hy
239 · intro y hyw
240 obtain ⟨j, rfl⟩ := hyw
241 exact Submodule.subset_span ⟨Sum.inr j, rfl⟩
242 · exact p.zero_mem
243 · intro x y _ _ hx' hy'
244 simpa using p.add_mem hx' hy'
245 · intro a y _ hy'
246 simpa using p.smul_mem a hy'
247 apply top_unique
248 rintro ⟨x, y⟩ _
249 simpa using p.add_mem (hleft x) (hright y)
250
251 /-- One diagonally acting algebra gives the shared direct-sum upper bound. -/
252 theorem seedRank_prod_le_add :
253 seedRank A (M × N) ≤ seedRank A M + seedRank A N := by
254 classical
255 obtain ⟨s, hs, hsCard⟩ := exists_generating_set_card_eq_seedRank A M
256 obtain ⟨t, ht, htCard⟩ := exists_generating_set_card_eq_seedRank A N
257 let v : s → M := Subtype.val
258 let w : t → N := Subtype.val
259 have hv : FamilyGenerates A M v := by
260 simpa [FamilyGenerates, Generates, v] using hs
261 have hw : FamilyGenerates A N w := by
262 simpa [FamilyGenerates, Generates, w] using ht
263 have hgen := sharedSum_familyGenerates A M N hv hw
264 have hbound := seedRank_le_mk_of_familyGenerates A (M × N) hgen
265 simpa [Cardinal.mk_sum, hsCard, htCard] using hbound
266
267 end SharedDirectSum
268
269 section IndependentDirectSum
270
271 variable (A B M N : Type u)
272 variable [Semiring A] [Semiring B]
273 variable [AddCommMonoid M] [Module A M]
274 variable [AddCommMonoid N] [Module B N]
275
276 /-- The coordinatewise action of `A × B` on `M × N`. -/
277 local instance productModule : Module (A × B) (M × N) where
278 smul r x := (r.1 • x.1, r.2 • x.2)
279 one_smul x := by
280 change ((1 : A) • x.1, (1 : B) • x.2) = x
281 ext <;> simp
282 mul_smul r s x := by
283 change ((r.1 * s.1) • x.1, (r.2 * s.2) • x.2) =
284 (r.1 • s.1 • x.1, r.2 • s.2 • x.2)
285 ext <;> simp [mul_smul]
286 smul_add r x y := by
287 change (r.1 • (x.1 + y.1), r.2 • (x.2 + y.2)) =
288 (r.1 • x.1 + r.1 • y.1, r.2 • x.2 + r.2 • y.2)
289 ext <;> simp [smul_add]
290 add_smul r s x := by
291 change ((r.1 + s.1) • x.1, (r.2 + s.2) • x.2) =
292 (r.1 • x.1 + s.1 • x.1, r.2 • x.2 + s.2 • x.2)
293 ext <;> simp [add_smul]
294 zero_smul x := by
295 change ((0 : A) • x.1, (0 : B) • x.2) = 0
296 ext <;> simp
297 smul_zero r := by
298 change (r.1 • (0 : M), r.2 • (0 : N)) = 0
299 ext <;> simp
300
301 @[simp] private theorem product_smul_mk (a : A) (b : B) (x : M) (y : N) :
302 (a, b) • (x, y) = (a • x, b • y) := rfl
303
304 /-- First projection as a semilinear map along `(A × B) → A`. -/
305 def prodFstSemilinear :
306 (M × N) →ₛₗ[RingHom.fst A B] M where
307 toFun := Prod.fst
308 map_add' _ _ := rfl
309 map_smul' _ _ := rfl
310
311 /-- Second projection as a semilinear map along `(A × B) → B`. -/
312 def prodSndSemilinear :
313 (M × N) →ₛₗ[RingHom.snd A B] N where
314 toFun := Prod.snd
315 map_add' _ _ := rfl
316 map_smul' _ _ := rfl
317
318 private theorem product_familyGenerates
319 {ι : Type u} {v : ι → M} {w : ι → N}
320 (hv : FamilyGenerates A M v) (hw : FamilyGenerates B N w) :
321 FamilyGenerates (A × B) (M × N) (fun i ↦ (v i, w i)) := by
322 rw [FamilyGenerates, Generates] at hv hw
323 let z : ι → M × N := fun i ↦ (v i, w i)
324 let p : Submodule (A × B) (M × N) := Submodule.span (A × B) (Set.range z)
325 change p = ⊤
326 have hleft : ∀ x : M, (x, 0) ∈ p := by
327 intro x
328 have hx : x ∈ Submodule.span A (Set.range v) := by simpa [hv]
329 refine Submodule.span_induction (p := fun x _ ↦ (x, 0) ∈ p) ?_ ?_ ?_ ?_ hx
330 · intro x hxv
331 obtain ⟨i, rfl⟩ := hxv
332 have hz : z i ∈ p := Submodule.subset_span (Set.mem_range_self i)
333 have hmem := p.smul_mem (1, 0) hz
334 simpa [z] using hmem
335 · exact p.zero_mem
336 · intro x y _ _ hx' hy'
337 simpa using p.add_mem hx' hy'
338 · intro a x _ hx'
339 have hmem := p.smul_mem (a, 0) hx'
340 simpa using hmem
341 have hright : ∀ y : N, (0, y) ∈ p := by
342 intro y
343 have hy : y ∈ Submodule.span B (Set.range w) := by simpa [hw]
344 refine Submodule.span_induction (p := fun y _ ↦ (0, y) ∈ p) ?_ ?_ ?_ ?_ hy
345 · intro y hyw
346 obtain ⟨i, rfl⟩ := hyw
347 have hz : z i ∈ p := Submodule.subset_span (Set.mem_range_self i)
348 have hmem := p.smul_mem (0, 1) hz
349 simpa [z] using hmem
350 · exact p.zero_mem
351 · intro x y _ _ hx' hy'
352 simpa using p.add_mem hx' hy'
353 · intro b y _ hy'
354 have hmem := p.smul_mem (0, b) hy'
355 simpa using hmem
356 apply top_unique
357 rintro ⟨x, y⟩ _
358 simpa using p.add_mem (hleft x) (hright y)
359
360 private theorem seedRank_prod_le_right_of_le
361 (hMN : seedRank A M ≤ seedRank B N) :
362 seedRank (A × B) (M × N) ≤ seedRank B N := by
363 classical
364 obtain ⟨s, hs, hsCard⟩ := exists_generating_set_card_eq_seedRank A M
365 obtain ⟨t, ht, htCard⟩ := exists_generating_set_card_eq_seedRank B N
366 have hst : Cardinal.mk s ≤ Cardinal.mk t := by simpa [hsCard, htCard] using hMN
367 let e : s ↪ t := Classical.choice (Cardinal.lift_mk_le'.mp (by simpa using hst))
368 let v : t → M := Function.extend e (fun i : s ↦ (i : M)) (fun _ ↦ 0)
369 let w : t → N := fun j ↦ (j : N)
370 have hv : FamilyGenerates A M v := by
371 rw [FamilyGenerates, Generates]
372 apply top_unique
373 rw [← hs]
374 apply Submodule.span_mono
375 intro x hx
376 let i : s := ⟨x, hx⟩
377 refine ⟨e i, ?_⟩
378 simpa [v, i] using
379 e.injective.extend_apply (fun i : s ↦ (i : M)) (fun _ : t ↦ 0) i
380 have hw : FamilyGenerates B N w := by
381 simpa [FamilyGenerates, Generates, w] using ht
382 have hgen := product_familyGenerates A B M N hv hw
383 have hbound := seedRank_le_mk_of_familyGenerates (A × B) (M × N) hgen
384 simpa [htCard] using hbound
385
386 private theorem seedRank_prod_le_left_of_le
387 (hNM : seedRank B N ≤ seedRank A M) :
388 seedRank (A × B) (M × N) ≤ seedRank A M := by
389 classical
390 obtain ⟨s, hs, hsCard⟩ := exists_generating_set_card_eq_seedRank A M
391 obtain ⟨t, ht, htCard⟩ := exists_generating_set_card_eq_seedRank B N
392 have hts : Cardinal.mk t ≤ Cardinal.mk s := by simpa [hsCard, htCard] using hNM
393 let e : t ↪ s := Classical.choice (Cardinal.lift_mk_le'.mp (by simpa using hts))
394 let v : s → M := fun i ↦ (i : M)
395 let w : s → N := Function.extend e (fun j : t ↦ (j : N)) (fun _ ↦ 0)
396 have hv : FamilyGenerates A M v := by
397 simpa [FamilyGenerates, Generates, v] using hs
398 have hw : FamilyGenerates B N w := by
399 rw [FamilyGenerates, Generates]
400 apply top_unique
401 rw [← ht]
402 apply Submodule.span_mono
403 intro y hy
404 let j : t := ⟨y, hy⟩
405 refine ⟨e j, ?_⟩
406 simpa [w, j] using
407 e.injective.extend_apply (fun j : t ↦ (j : N)) (fun _ : s ↦ 0) j
408 have hgen := product_familyGenerates A B M N hv hw
409 have hbound := seedRank_le_mk_of_familyGenerates (A × B) (M × N) hgen
410 simpa [hsCard] using hbound
411
412 /-- Under the independent product action, seed rank is the maximum. -/
413 theorem seedRank_prod_productAlgebra :
414 seedRank (A × B) (M × N) = max (seedRank A M) (seedRank B N) := by
415 apply le_antisymm
416 · rcases le_total (seedRank A M) (seedRank B N) with hMN | hNM
417 · simpa [max_eq_right hMN] using
418 seedRank_prod_le_right_of_le A B M N hMN
419 · simpa [max_eq_left hNM] using
420 seedRank_prod_le_left_of_le A B M N hNM
421 · apply max_le
422 · exact seedRank_le_of_surjective_semilinear
423 (prodFstSemilinear A B M N) (fun x ↦ ⟨(x, 0), rfl⟩)
424 · exact seedRank_le_of_surjective_semilinear
425 (prodSndSemilinear A B M N) (fun y ↦ ⟨(0, y), rfl⟩)
426
427 end IndependentDirectSum
428
429 section TensorProduct
430
431 variable (k A B X Y : Type u)
432 variable [CommSemiring k]
433 variable [Semiring A] [Algebra k A]
434 variable [Semiring B] [Algebra k B]
435 variable [AddCommMonoid X] [Module k X] [Module A X]
436 variable [IsScalarTower k A X] [SMulCommClass k A X]
437 variable [AddCommMonoid Y] [Module k Y] [Module B Y]
438 variable [IsScalarTower k B Y] [SMulCommClass k B Y]
439
440 /-- The action of `B` on the right tensor factor. -/
441 @[instance_reducible] private def tensorRightModule :
442 Module B (TensorProduct k X Y) := by
443 let e : TensorProduct k X Y ≃ₗ[k] TensorProduct k Y X :=
444 TensorProduct.comm k X Y
445 letI : Module B (TensorProduct k Y X) := TensorProduct.leftModule
446 exact
447 { smul := fun b z ↦ e.symm (b • e z)
448 one_smul := fun z ↦ by
449 change e.symm ((1 : B) • e z) = z
450 rw [one_smul, e.symm_apply_apply]
451 mul_smul := fun b c z ↦ by
452 change e.symm ((b * c) • e z) =
453 e.symm (b • e (e.symm (c • e z)))
454 rw [mul_smul, e.apply_symm_apply]
455 smul_add := fun b z w ↦ by
456 change e.symm (b • e (z + w)) =
457 e.symm (b • e z) + e.symm (b • e w)
458 rw [e.map_add, smul_add, e.symm.map_add]
459 add_smul := fun b c z ↦ by
460 change e.symm ((b + c) • e z) =
461 e.symm (b • e z) + e.symm (c • e z)
462 rw [add_smul, e.symm.map_add]
463 zero_smul := fun z ↦ by
464 change e.symm ((0 : B) • e z) = 0
465 rw [zero_smul, map_zero]
466 smul_zero := fun b ↦ by
467 change e.symm (b • e 0) = 0
468 rw [map_zero, smul_zero, map_zero] }
469
470 local instance (priority := 50) tensorRightModuleInstance :
471 Module B (TensorProduct k X Y) :=
472 tensorRightModule k B X Y
473
474 @[simp] private theorem tensorRight_smul_tmul (b : B) (x : X) (y : Y) :
475 b • (x ⊗ₜ[k] y) = x ⊗ₜ[k] (b • y) := by
476 change (TensorProduct.comm k X Y).symm
477 (b • (TensorProduct.comm k X Y) (x ⊗ₜ[k] y)) = _
478 rw [TensorProduct.comm_tmul, TensorProduct.smul_tmul',
479 TensorProduct.comm_symm_tmul]
480
481 local instance tensorRightTower :
482 IsScalarTower k B (TensorProduct k X Y) where
483 smul_assoc r b z := by
484 induction z using TensorProduct.induction_on with
485 | zero => simp
486 | tmul x y => simp [smul_assoc]
487 | add z w hz hw => simp [smul_add, hz, hw]
488
489 local instance tensorLeftTower :
490 IsScalarTower k A (TensorProduct k X Y) where
491 smul_assoc r a z := by
492 induction z using TensorProduct.induction_on with
493 | zero => simp
494 | tmul x y => simp [TensorProduct.smul_tmul', smul_assoc]
495 | add z w hz hw => simp [smul_add, hz, hw]
496
497 local instance tensorActionsCommute :
498 SMulCommClass A B (TensorProduct k X Y) where
499 smul_comm a b z := by
500 induction z using TensorProduct.induction_on with
501 | zero => simp
502 | tmul x y => simp [TensorProduct.smul_tmul']
503 | add z w hz hw => simp [smul_add, hz, hw]
504
505 attribute [local instance 2000] tensorLeftTower tensorRightTower tensorActionsCommute
506
507 local instance tensorLeftTowerInstalled :
508 IsScalarTower k A (TensorProduct k X Y) :=
509 tensorLeftTower k A X Y
510
511 local instance tensorRightTowerInstalled :
512 IsScalarTower k B (TensorProduct k X Y) :=
513 tensorRightTower k B X Y
514
515 local instance tensorActionsCommuteInstalled :
516 SMulCommClass A B (TensorProduct k X Y) :=
517 tensorActionsCommute k A B X Y
518
519 /-- The natural `(A ⊗[k] B)` action on `X ⊗[k] Y`. -/
520 local instance tensorOperatorModule :
521 Module (A ⊗[k] B) (TensorProduct k X Y) :=
522 TensorProduct.Algebra.module
523
524 /-- Pure operator tensors act componentwise on pure vector tensors. -/
525 @[simp] theorem tensorOperator_smul_tmul
526 (a : A) (b : B) (x : X) (y : Y) :
527 (a ⊗ₜ[k] b : A ⊗[k] B) • (x ⊗ₜ[k] y) =
528 (a • x) ⊗ₜ[k] (b • y) := by
529 change TensorProduct.Algebra.moduleAux (a ⊗ₜ[k] b) (x ⊗ₜ[k] y) = _
530 rw [TensorProduct.Algebra.moduleAux_apply]
531 simp [TensorProduct.smul_tmul']
532
533 private theorem tensor_familyGenerates
534 {ι κ : Type u} {v : ι → X} {w : κ → Y}
535 (hv : FamilyGenerates A X v) (hw : FamilyGenerates B Y w) :
536 FamilyGenerates (A ⊗[k] B) (TensorProduct k X Y)
537 (fun p : ι × κ ↦ v p.1 ⊗ₜ[k] w p.2) := by
538 rw [FamilyGenerates, Generates] at hv hw
539 let z : ι × κ → TensorProduct k X Y :=
540 fun p ↦ v p.1 ⊗ₜ[k] w p.2
541 let p : Submodule (A ⊗[k] B) (TensorProduct k X Y) :=
542 Submodule.span (A ⊗[k] B) (Set.range z)
543 change p = ⊤
544 have hpure : ∀ x : X, ∀ y : Y, x ⊗ₜ[k] y ∈ p := by
545 intro x
546 have hx : x ∈ Submodule.span A (Set.range v) := by simpa [hv]
547 refine Submodule.span_induction
548 (p := fun x _ ↦ ∀ y : Y, x ⊗ₜ[k] y ∈ p) ?_ ?_ ?_ ?_ hx
549 · intro x hxv y
550 obtain ⟨i, rfl⟩ := hxv
551 have hy : y ∈ Submodule.span B (Set.range w) := by simpa [hw]
552 refine Submodule.span_induction
553 (p := fun y _ ↦ v i ⊗ₜ[k] y ∈ p) ?_ ?_ ?_ ?_ hy
554 · intro y hyw
555 obtain ⟨j, rfl⟩ := hyw
556 exact Submodule.subset_span ⟨(i, j), rfl⟩
557 · simpa using p.zero_mem
558 · intro y₁ y₂ _ _ h₁ h₂
559 simpa [TensorProduct.tmul_add] using p.add_mem h₁ h₂
560 · intro b y _ hy'
561 have hmem := p.smul_mem (1 ⊗ₜ[k] b : A ⊗[k] B) hy'
562 simpa using hmem
563 · intro y
564 simpa using p.zero_mem
565 · intro x₁ x₂ _ _ h₁ h₂ y
566 simpa [TensorProduct.add_tmul] using p.add_mem (h₁ y) (h₂ y)
567 · intro a x _ hx' y
568 have hmem := p.smul_mem (a ⊗ₜ[k] 1 : A ⊗[k] B) (hx' y)
569 simpa using hmem
570 apply top_unique
571 intro q _
572 exact TensorProduct.induction_on q p.zero_mem hpure
573 (fun _ _ hq hr ↦ p.add_mem hq hr)
574
575 /--
576 For the natural operator-tensor action, tensor-product seed rank is bounded by
577 the product of the two seed ranks.
578 -/
579 theorem seedRank_tensorProduct_le_mul :
580 seedRank (A ⊗[k] B) (TensorProduct k X Y) ≤
581 seedRank A X * seedRank B Y := by
582 classical
583 obtain ⟨s, hs, hsCard⟩ := exists_generating_set_card_eq_seedRank A X
584 obtain ⟨t, ht, htCard⟩ := exists_generating_set_card_eq_seedRank B Y
585 let v : s → X := Subtype.val
586 let w : t → Y := Subtype.val
587 have hv : FamilyGenerates A X v := by
588 simpa [FamilyGenerates, Generates, v] using hs
589 have hw : FamilyGenerates B Y w := by
590 simpa [FamilyGenerates, Generates, w] using ht
591 have hgen := tensor_familyGenerates k A B X Y hv hw
592 have hbound := seedRank_le_mk_of_familyGenerates
593 (A ⊗[k] B) (TensorProduct k X Y) hgen
594 simpa [Cardinal.mk_prod, hsCard, htCard] using hbound
595
596 end TensorProduct
597
598 section ScalarQuotient
599
600 variable (k A X Y : Type u)
601 variable [Field k] [Semiring A] [Algebra k A]
602 variable [AddCommMonoid X] [Module A X]
603 variable [AddCommGroup Y] [Module k Y] [Module.Finite k Y]
604
605 /-- Every algebra character onto its base field is surjective. -/
606 private theorem character_surjective (χ : A →ₐ[k] k) :
607 Function.Surjective χ := by
608 intro y
609 refine ⟨algebraMap k A y, ?_⟩
610 exact χ.commutes y
611
612 /--
613 Scalar quotient obstruction. A character `χ : A →ₐ[k] k` records that every
614 operator acts on the quotient through a scalar. Any surjective intertwiner
615 onto a finite-dimensional scalar module forces its dimension to be a lower
616 bound for the seed rank upstairs.
617 -/
618 theorem finrank_le_seedRank_of_scalar_quotient
619 (χ : A →ₐ[k] k) (f : X →ₛₗ[χ.toRingHom] Y)
620 (hf : Function.Surjective f) :
621 (Module.finrank k Y : Cardinal) ≤ seedRank A X := by
622 letI : RingHomSurjective χ.toRingHom :=
623 ⟨character_surjective k A χ⟩
624 have hquot : seedRank k Y ≤ seedRank A X :=
625 seedRank_le_of_surjective_semilinear f hf
626 have hrank : seedRank k Y = Module.finrank k Y := by
627 rw [seedRank_eq_seedFinrank k Y, seedFinrank,
628 ← Module.finrank_eq_spanFinrank_of_free]
629 simpa [hrank] using hquot
630
631 end ScalarQuotient
632
633 end Komorebi.SeedRankOperations
634
635 #print axioms Komorebi.SeedRankOperations.seedFinrank_isLeast_free_surjection
636 #print axioms Komorebi.SeedRankOperations.cyclic_iff_seedRank_eq_one
637 #print axioms Komorebi.SeedRankOperations.seedRank_le_of_surjective_semilinear
638 #print axioms Komorebi.SeedRankOperations.seedRank_eq_of_bijective_semilinear
639 #print axioms Komorebi.SeedRankOperations.seedRank_imageAlgebra_eq
640 #print axioms Komorebi.SeedRankOperations.seedRank_prod_le_add
641 #print axioms Komorebi.SeedRankOperations.seedRank_prod_productAlgebra
642 #print axioms Komorebi.SeedRankOperations.seedRank_tensorProduct_le_mul
643 #print axioms Komorebi.SeedRankOperations.finrank_le_seedRank_of_scalar_quotient
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: 4576e26fbc1dc4c9c03a72c3c6e13aca95022950d5592bfa8bd415bb898e917b
Back to Paper I: Typed Operator Systems, Seed Rank, and Exact Packet Coordinates