@@ -55,6 +55,8 @@ variable [NormedAddCommGroup E] [NormedSpace K E]
55
55
56
56
variable (b : Basis ι K E)
57
57
58
+ theorem span_top : span K (span ℤ (Set.range b) : Set E) = ⊤ := by simp [span_span_of_tower]
59
+
58
60
/-- The fundamental domain of the ℤ-lattice spanned by `b`. See `Zspan.isAddFundamentalDomain`
59
61
for the proof that it is a fundamental domain. -/
60
62
def fundamentalDomain : Set E := {m | ∀ i, b.repr m i ∈ Set.Ico (0 : K) 1 }
@@ -310,6 +312,10 @@ instance [Finite ι] : DiscreteTopology (span ℤ (Set.range b)) := by
310
312
· exact discreteTopology_pi_basisFun
311
313
· refine Subtype.map_injective _ (Basis.equivFun b).injective
312
314
315
+ instance [Fintype ι] : DiscreteTopology (span ℤ (Set.range b)).toAddSubgroup := by
316
+ change DiscreteTopology (span ℤ (Set.range b))
317
+ infer_instance
318
+
313
319
@[measurability]
314
320
theorem fundamentalDomain_measurableSet [MeasurableSpace E] [OpensMeasurableSpace E] [Finite ι] :
315
321
MeasurableSet (fundamentalDomain b) := by
@@ -367,14 +373,26 @@ end Zspan
367
373
368
374
section Zlattice
369
375
370
- open Submodule
376
+ open Submodule FiniteDimensional
377
+
378
+ -- TODO: generalize this class to other rings than `ℤ`
379
+ /-- An `L : Addsubgroup E` where `E` is a vector space over a normed field `K` is a `ℤ`-lattice if
380
+ it is discrete and spans `E` over `K`. -/
381
+ class IsZlattice (K : Type *) [NormedField K] {E : Type *} [NormedAddCommGroup E] [NormedSpace K E]
382
+ (L : AddSubgroup E) [DiscreteTopology L] : Prop where
383
+ /-- `L` spans the full space `E` over `K`. -/
384
+ span_top : span K (L : Set E) = ⊤
385
+
386
+ theorem _root_.Zspan.isZlattice {E ι : Type *} [NormedAddCommGroup E] [NormedSpace ℝ E]
387
+ [Fintype ι] (b : Basis ι ℝ E) :
388
+ IsZlattice ℝ (span ℤ (Set.range b)).toAddSubgroup where
389
+ span_top := Zspan.span_top b
371
390
372
391
variable (K : Type *) [NormedLinearOrderedField K] [HasSolidNorm K] [FloorRing K]
373
392
variable {E : Type *} [NormedAddCommGroup E] [NormedSpace K E] [FiniteDimensional K E]
374
- variable [ProperSpace E] {L : AddSubgroup E} [DiscreteTopology L]
375
- variable (hs : span K (L : Set E) = ⊤)
393
+ variable [ProperSpace E] (L : AddSubgroup E) [DiscreteTopology L]
376
394
377
- theorem Zlattice.FG : AddSubgroup.FG L := by
395
+ theorem Zlattice.FG [hs : IsZlattice K L] : AddSubgroup.FG L := by
378
396
suffices (AddSubgroup.toIntSubmodule L).FG by exact (fg_iff_add_subgroup_fg _).mp this
379
397
obtain ⟨s, ⟨h_incl, ⟨h_span, h_lind⟩⟩⟩ := exists_linearIndependent K (L : Set E)
380
398
-- Let `s` be a maximal `K`-linear independent family of elements of `L`. We show that
@@ -386,7 +404,7 @@ theorem Zlattice.FG : AddSubgroup.FG L := by
386
404
-- so there are finitely many since `fundamentalDomain b` is bounded.
387
405
refine fg_def.mpr ⟨map (span ℤ s).mkQ (AddSubgroup.toIntSubmodule L), ?_, span_eq _⟩
388
406
let b := Basis.mk h_lind (by
389
- rw [← hs, ← h_span]
407
+ rw [← hs.span_top , ← h_span]
390
408
exact span_mono (by simp only [Subtype.range_coe_subtype, Set.setOf_mem_eq, subset_rfl]))
391
409
rw [show span ℤ s = span ℤ (Set.range b) by simp [b, Basis.coe_mk, Subtype.range_coe_subtype]]
392
410
have : Fintype s := h_lind.setFinite.fintype
@@ -409,24 +427,53 @@ theorem Zlattice.FG : AddSubgroup.FG L := by
409
427
rw [ker_mkQ, inf_of_le_right (span_le.mpr h_incl)]
410
428
exact fg_span (LinearIndependent.setFinite h_lind)
411
429
412
- theorem Zlattice.module_finite : Module.Finite ℤ L :=
413
- Module.Finite.iff_addGroup_fg.mpr ((AddGroup.fg_iff_addSubgroup_fg L).mpr (FG K hs))
414
-
415
- theorem Zlattice.module_free : Module.Free ℤ L := by
416
- have : Module.Finite ℤ L := module_finite K hs
430
+ theorem Zlattice.module_finite [IsZlattice K L] : Module.Finite ℤ L :=
431
+ Module.Finite.iff_addGroup_fg.mpr ((AddGroup.fg_iff_addSubgroup_fg L).mpr (FG K L))
432
+
433
+ instance instModuleFinite_of_discrete_addSubgroup {E : Type *} [NormedAddCommGroup E]
434
+ [NormedSpace ℝ E] [FiniteDimensional ℝ E] (L : AddSubgroup E) [DiscreteTopology L] :
435
+ Module.Finite ℤ L := by
436
+ let f := (span ℝ (L : Set E)).subtype
437
+ let L₀ := (AddSubgroup.toIntSubmodule L).comap (f.restrictScalars ℤ)
438
+ have h_img : f '' L₀ = L := by
439
+ rw [← LinearMap.coe_restrictScalars ℤ f, ← Submodule.map_coe (f.restrictScalars ℤ),
440
+ Submodule.map_comap_eq_self, AddSubgroup.coe_toIntSubmodule]
441
+ exact fun x hx ↦ LinearMap.mem_range.mpr ⟨⟨x, Submodule.subset_span hx⟩, rfl⟩
442
+ suffices Module.Finite ℤ L₀ by
443
+ have : L₀.map (f.restrictScalars ℤ) = (AddSubgroup.toIntSubmodule L) :=
444
+ SetLike.ext'_iff.mpr h_img
445
+ convert this ▸ Module.Finite.map L₀ (f.restrictScalars ℤ)
446
+ have : DiscreteTopology L₀.toAddSubgroup := by
447
+ refine DiscreteTopology.preimage_of_continuous_injective (L : Set E) ?_ (injective_subtype _)
448
+ exact LinearMap.continuous_of_finiteDimensional f
449
+ have : IsZlattice ℝ L₀.toAddSubgroup := ⟨by
450
+ rw [← (Submodule.map_injective_of_injective (injective_subtype _)).eq_iff, Submodule.map_span,
451
+ Submodule.map_top, range_subtype, coe_toAddSubgroup, h_img]⟩
452
+ exact Zlattice.module_finite ℝ L₀.toAddSubgroup
453
+
454
+ theorem Zlattice.module_free [IsZlattice K L] : Module.Free ℤ L := by
455
+ have : Module.Finite ℤ L := module_finite K L
417
456
have : Module ℚ E := Module.compHom E (algebraMap ℚ K)
418
457
have : NoZeroSMulDivisors ℤ E := RatModule.noZeroSMulDivisors
419
458
have : NoZeroSMulDivisors ℤ L := by
420
459
change NoZeroSMulDivisors ℤ (AddSubgroup.toIntSubmodule L)
421
460
exact noZeroSMulDivisors _
422
461
infer_instance
423
462
424
- open FiniteDimensional
463
+ instance instModuleFree__of_discrete_addSubgroup {E : Type *} [NormedAddCommGroup E]
464
+ [NormedSpace ℝ E] [FiniteDimensional ℝ E] (L : AddSubgroup E) [DiscreteTopology L] :
465
+ Module.Free ℤ L := by
466
+ have : Module ℚ E := Module.compHom E (algebraMap ℚ ℝ)
467
+ have : NoZeroSMulDivisors ℤ E := RatModule.noZeroSMulDivisors
468
+ have : NoZeroSMulDivisors ℤ L := by
469
+ change NoZeroSMulDivisors ℤ (AddSubgroup.toIntSubmodule L)
470
+ exact noZeroSMulDivisors _
471
+ infer_instance
425
472
426
- theorem Zlattice.rank : finrank ℤ L = finrank K E := by
473
+ theorem Zlattice.rank [hs : IsZlattice K L] : finrank ℤ L = finrank K E := by
427
474
classical
428
- have : Module.Finite ℤ L := module_finite K hs
429
- have : Module.Free ℤ L := module_free K hs
475
+ have : Module.Finite ℤ L := module_finite K L
476
+ have : Module.Free ℤ L := module_free K L
430
477
have : Module ℚ E := Module.compHom E (algebraMap ℚ K)
431
478
let b₀ := Module.Free.chooseBasis ℤ L
432
479
-- Let `b` be a `ℤ`-basis of `L` formed of vectors of `E`
@@ -439,7 +486,9 @@ theorem Zlattice.rank : finrank ℤ L = finrank K E := by
439
486
· rw [map_span, Set.range_comp]
440
487
rfl
441
488
· exact (map_subtype_top _).symm
442
- have h_spanE : span K (Set.range b) = ⊤ := by rwa [← span_span_of_tower (R := ℤ), h_spanL]
489
+ have h_spanE : span K (Set.range b) = ⊤ := by
490
+ rw [← span_span_of_tower (R := ℤ), h_spanL]
491
+ exact hs.span_top
443
492
have h_card : Fintype.card (Module.Free.ChooseBasisIndex ℤ L) =
444
493
(Set.range b).toFinset.card := by
445
494
rw [Set.toFinset_range, Finset.univ.card_image_of_injective]
0 commit comments