Skip to content

Commit 289b95f

Browse files
committed
refactor(RepresentationTheory/GroupCohomology/LowDegree): make nCoboundaries a submodule of the n-cochains rather than the nCocycles for n = 0, 1, 2 (#22047)
1 parent bae5c53 commit 289b95f

File tree

2 files changed

+111
-87
lines changed

2 files changed

+111
-87
lines changed

Mathlib/RepresentationTheory/GroupCohomology/Hilbert90.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ noncomputable instance H1ofAutOnUnitsUnique : Unique (H1 (Rep.ofAlgebraAutOnUnit
105105
uniq := fun a => Quotient.inductionOn' a fun x => (H1π_eq_zero_iff _).2 <| by
106106
refine (oneCoboundariesOfIsMulOneCoboundary ?_).2
107107
rcases isMulOneCoboundary_of_isMulOneCocycle_of_aut_to_units x.1
108-
(isMulOneCocycle_of_oneCocycles x) with ⟨β, hβ⟩
108+
(isMulOneCocycle_of_mem_oneCocycles _ x.2) with ⟨β, hβ⟩
109109
use β
110110

111111
end groupCohomology

Mathlib/RepresentationTheory/GroupCohomology/LowDegree.lean

Lines changed: 110 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,10 @@ theorem mem_oneCocycles_iff (f : G → A) :
276276
rw [← add_eq_zero_iff_eq_neg, ← oneCocycles_map_one f, ← mul_inv_cancel g,
277277
(mem_oneCocycles_iff f).1 f.2 g g⁻¹]
278278

279+
theorem dZero_apply_mem_oneCocycles (x : A) :
280+
dZero A x ∈ oneCocycles A :=
281+
congr($(dOne_comp_dZero A) x)
282+
279283
theorem oneCocycles_map_mul_of_isTrivial [A.IsTrivial] (f : oneCocycles A) (g h : G) :
280284
f (g * h) = f g + f h := by
281285
rw [(mem_oneCocycles_iff f).1 f.2, apply_eq_self A.ρ g (f h), add_comm]
@@ -351,84 +355,85 @@ lemma twoCocycles_ρ_map_inv_sub_map_inv (f : twoCocycles A) (g : G) :
351355
at this
352356
exact sub_eq_sub_iff_add_eq_add.2 this.symm
353357

358+
theorem dOne_apply_mem_twoCocycles (x : G → A) :
359+
dOne A x ∈ twoCocycles A :=
360+
congr($(dTwo_comp_dOne A) x)
361+
354362
end Cocycles
355363

356364
section Coboundaries
357365

358366
/-- The 1-coboundaries `B¹(G, A)` of `A : Rep k G`, defined as the image of the map
359367
`A → Fun(G, A)` sending `(a, g) ↦ ρ_A(g)(a) - a.` -/
360-
def oneCoboundaries : Submodule k (oneCocycles A) :=
361-
LinearMap.range ((dZero A).codRestrict (oneCocycles A) fun c =>
362-
LinearMap.ext_iff.1 (dOne_comp_dZero A) c)
368+
def oneCoboundaries : Submodule k (G → A) :=
369+
LinearMap.range (dZero A)
363370

364371
/-- The 2-coboundaries `B²(G, A)` of `A : Rep k G`, defined as the image of the map
365372
`Fun(G, A) → Fun(G × G, A)` sending `(f, (g₁, g₂)) ↦ ρ_A(g₁)(f(g₂)) - f(g₁g₂) + f(g₁).` -/
366-
def twoCoboundaries : Submodule k (twoCocycles A) :=
367-
LinearMap.range ((dOne A).codRestrict (twoCocycles A) fun c =>
368-
LinearMap.ext_iff.1 (dTwo_comp_dOne.{u} A) c)
373+
def twoCoboundaries : Submodule k (G × G → A) :=
374+
LinearMap.range (dOne A)
369375

370376
variable {A}
371377

372-
/-- Makes a 1-coboundary out of `f ∈ Im(d⁰)`. -/
373-
def oneCoboundariesOfMemRange {f : G → A} (h : f ∈ LinearMap.range (dZero A)) :
374-
oneCoboundaries A :=
375-
⟨⟨f, LinearMap.range_le_ker_iff.2 (dOne_comp_dZero A) h⟩,
376-
by rcases h with ⟨x, rfl⟩; exact ⟨x, rfl⟩⟩
378+
instance : FunLike (oneCoboundaries A) G A := ⟨Subtype.val, Subtype.val_injective⟩
377379

378-
theorem oneCoboundaries_of_mem_range_apply {f : G → A} (h : f ∈ LinearMap.range (dZero A)) :
379-
(oneCoboundariesOfMemRange h).1.1 = f := rfl
380+
@[simp]
381+
theorem oneCoboundaries.coe_mk (f : G → A) (hf) :
382+
((⟨f, hf⟩ : oneCoboundaries A) : G → A) = f := rfl
380383

381-
/-- Makes a 1-coboundary out of `f : G → A` and `x` such that
382-
`ρ(g)(x) - x = f(g)` for all `g : G`. -/
383-
def oneCoboundariesOfEq {f : G → A} {x : A} (hf : ∀ g, A.ρ g x - x = f g) :
384-
oneCoboundaries A :=
385-
oneCoboundariesOfMemRange ⟨x, funext hf⟩
384+
@[simp]
385+
theorem oneCoboundaries.val_eq_coe (f : oneCoboundaries A) : f.1 = f := rfl
386386

387-
theorem oneCoboundariesOfEq_apply {f : G → A} {x : A} (hf : ∀ g, A.ρ g x - x = f g) :
388-
(oneCoboundariesOfEq hf).1.1 = f := rfl
387+
@[ext]
388+
theorem oneCoboundaries_ext {f₁ f₂ : oneCoboundaries A} (h : ∀ g : G, f₁ g = f₂ g) : f₁ = f₂ :=
389+
DFunLike.ext f₁ f₂ h
389390

390-
theorem mem_range_of_mem_oneCoboundaries {f : oneCocycles A} (h : f ∈ oneCoboundaries A) :
391-
f.1 ∈ LinearMap.range (dZero A) := by
392-
rcases h with ⟨x, rfl⟩; exact ⟨x, rfl⟩
391+
variable (A) in
392+
lemma oneCoboundaries_le_oneCocycles : oneCoboundaries A ≤ oneCocycles A := by
393+
rintro _ ⟨x, rfl⟩
394+
exact dZero_apply_mem_oneCocycles x
395+
396+
variable (A) in
397+
/-- Natural inclusion `B¹(G, A) →ₗ[k] Z¹(G, A)`. -/
398+
abbrev oneCoboundariesToOneCocycles : oneCoboundaries A →ₗ[k] oneCocycles A :=
399+
Submodule.inclusion (oneCoboundaries_le_oneCocycles A)
400+
401+
@[simp]
402+
lemma oneCoboundariesToOneCocycles_apply (x : oneCoboundaries A) :
403+
oneCoboundariesToOneCocycles A x = x.1 := rfl
393404

394405
theorem oneCoboundaries_eq_bot_of_isTrivial (A : Rep k G) [A.IsTrivial] :
395406
oneCoboundaries A = ⊥ := by
396407
simp_rw [oneCoboundaries, dZero_eq_zero]
397408
exact LinearMap.range_eq_bot.2 rfl
398409

399-
theorem mem_oneCoboundaries_iff (f : oneCocycles A) : f ∈ oneCoboundaries A ↔
400-
∃ x : A, ∀ g : G, A.ρ g x - x = f g := exists_congr fun x ↦ by
401-
simpa only [LinearMap.codRestrict, dZero, LinearMap.coe_mk, AddHom.coe_mk] using
402-
groupCohomology.oneCocycles_ext_iff
410+
instance : FunLike (twoCoboundaries A) (G × G) A := ⟨Subtype.val, Subtype.val_injective⟩
403411

404-
/-- Makes a 2-coboundary out of `f ∈ Im(d¹)`. -/
405-
def twoCoboundariesOfMemRange {f : G × G → A} (h : f ∈ LinearMap.range (dOne A)) :
406-
twoCoboundaries A :=
407-
⟨⟨f, LinearMap.range_le_ker_iff.2 (dTwo_comp_dOne A) h⟩,
408-
by rcases h with ⟨x, rfl⟩; exact ⟨x, rfl⟩⟩
412+
@[simp]
413+
theorem twoCoboundaries.coe_mk (f : G × G → A) (hf) :
414+
((⟨f, hf⟩ : twoCoboundaries A) : G × G → A) = f := rfl
409415

410-
theorem twoCoboundariesOfMemRange_apply {f : G × G → A} (h : f ∈ LinearMap.range (dOne A)) :
411-
(twoCoboundariesOfMemRange h).1.1 = f := rfl
416+
@[simp]
417+
theorem twoCoboundaries.val_eq_coe (f : twoCoboundaries A) : f.1 = f := rfl
412418

413-
/-- Makes a 2-coboundary out of `f : G × G → A` and `x : G → A` such that
414-
`ρ(g)(x(h)) - x(gh) + x(g) = f(g, h)` for all `g, h : G`. -/
415-
def twoCoboundariesOfEq {f : G × G → A} {x : G → A}
416-
(hf : ∀ g h, A.ρ g (x h) - x (g * h) + x g = f (g, h)) :
417-
twoCoboundaries A :=
418-
twoCoboundariesOfMemRange ⟨x, funext fun g ↦ hf g.1 g.2
419+
@[ext]
420+
theorem twoCoboundaries_ext {f₁ f₂ : twoCoboundaries A} (h : ∀ g h : G, f₁ (g, h) = f₂ (g, h)) :
421+
f₁ = f₂ :=
422+
DFunLike.ext f₁ f₂ (Prod.forall.mpr h)
419423

420-
theorem twoCoboundariesOfEq_apply {f : G × G → A} {x : G → A}
421-
(hf : ∀ g h, A.ρ g (x h) - x (g * h) + x g = f (g, h)) :
422-
(twoCoboundariesOfEq hf).1.1 = f := rfl
424+
variable (A) in
425+
lemma twoCoboundaries_le_twoCocycles : twoCoboundaries A ≤ twoCocycles A := by
426+
rintro _ ⟨x, rfl⟩
427+
exact dOne_apply_mem_twoCocycles x
423428

424-
theorem mem_range_of_mem_twoCoboundaries {f : twoCocycles A} (h : f ∈ twoCoboundaries A) :
425-
(twoCocycles A).subtype f ∈ LinearMap.range (dOne A) := by
426-
rcases h with ⟨x, rfl⟩; exact ⟨x, rfl⟩
429+
variable (A) in
430+
/-- Natural inclusion `B²(G, A) →ₗ[k] Z²(G, A)`. -/
431+
abbrev twoCoboundariesToTwoCocycles : twoCoboundaries A →ₗ[k] twoCocycles A :=
432+
Submodule.inclusion (twoCoboundaries_le_twoCocycles A)
427433

428-
theorem mem_twoCoboundaries_iff (f : twoCocycles A) : f ∈ twoCoboundaries A ↔
429-
∃ x : G → A, ∀ g h : G, A.ρ g (x h) - x (g * h) + x g = f (g, h) := exists_congr fun x ↦ by
430-
simpa only [LinearMap.codRestrict, dOne, LinearMap.coe_mk, AddHom.coe_mk] using
431-
groupCohomology.twoCocycles_ext_iff
434+
@[simp]
435+
lemma twoCoboundariesToTwoCocycles_apply (x : twoCoboundaries A) :
436+
twoCoboundariesToTwoCocycles A x = x.1 := rfl
432437

433438
end Coboundaries
434439

@@ -508,46 +513,55 @@ variable {k G A : Type u} [CommRing k] [Group G] [AddCommGroup A] [Module k A]
508513
/-- Given a `k`-module `A` with a compatible `DistribMulAction` of `G`, and a function
509514
`f : G → A` satisfying the 1-cocycle condition, produces a 1-cocycle for the representation on
510515
`A` induced by the `DistribMulAction`. -/
516+
@[simps]
511517
def oneCocyclesOfIsOneCocycle {f : G → A} (hf : IsOneCocycle f) :
512518
oneCocycles (Rep.ofDistribMulAction k G A) :=
513519
⟨f, (mem_oneCocycles_iff (A := Rep.ofDistribMulAction k G A) f).2 hf⟩
514520

515-
theorem isOneCocycle_of_oneCocycles (f : oneCocycles (Rep.ofDistribMulAction k G A)) :
516-
IsOneCocycle (A := A) f := (mem_oneCocycles_iff f).1 f.2
521+
theorem isOneCocycle_of_mem_oneCocycles
522+
(f : G → A) (hf : f ∈ oneCocycles (Rep.ofDistribMulAction k G A)) :
523+
IsOneCocycle f :=
524+
fun _ _ => (mem_oneCocycles_iff (A := Rep.ofDistribMulAction k G A) f).1 hf _ _
517525

518526
/-- Given a `k`-module `A` with a compatible `DistribMulAction` of `G`, and a function
519527
`f : G → A` satisfying the 1-coboundary condition, produces a 1-coboundary for the representation
520528
on `A` induced by the `DistribMulAction`. -/
529+
@[simps]
521530
def oneCoboundariesOfIsOneCoboundary {f : G → A} (hf : IsOneCoboundary f) :
522531
oneCoboundaries (Rep.ofDistribMulAction k G A) :=
523-
oneCoboundariesOfMemRange ⟨hf.choose, funext hf.choose_spec⟩
532+
⟨f, hf.choose, funext hf.choose_spec⟩
524533

525-
theorem isOneCoboundary_of_oneCoboundaries (f : oneCoboundaries (Rep.ofDistribMulAction k G A)) :
526-
IsOneCoboundary (A := A) f.1.1 := by
527-
rcases mem_range_of_mem_oneCoboundaries f.2 with ⟨x, hx⟩
528-
exact ⟨x, by rw [← hx]; intro g; rfl⟩
534+
theorem isOneCoboundary_of_mem_oneCoboundaries
535+
(f : G → A) (hf : f ∈ oneCoboundaries (Rep.ofDistribMulAction k G A)) :
536+
IsOneCoboundary f := by
537+
rcases hf with ⟨a, rfl⟩
538+
exact ⟨a, fun _ => rfl⟩
529539

530540
/-- Given a `k`-module `A` with a compatible `DistribMulAction` of `G`, and a function
531541
`f : G × G → A` satisfying the 2-cocycle condition, produces a 2-cocycle for the representation on
532542
`A` induced by the `DistribMulAction`. -/
543+
@[simps]
533544
def twoCocyclesOfIsTwoCocycle {f : G × G → A} (hf : IsTwoCocycle f) :
534545
twoCocycles (Rep.ofDistribMulAction k G A) :=
535546
⟨f, (mem_twoCocycles_iff (A := Rep.ofDistribMulAction k G A) f).2 hf⟩
536547

537-
theorem isTwoCocycle_of_twoCocycles (f : twoCocycles (Rep.ofDistribMulAction k G A)) :
538-
IsTwoCocycle (A := A) f := (mem_twoCocycles_iff f).1 f.2
548+
theorem isTwoCocycle_of_mem_twoCocycles
549+
(f : G × G → A) (hf : f ∈ twoCocycles (Rep.ofDistribMulAction k G A)) :
550+
IsTwoCocycle f := (mem_twoCocycles_iff (A := Rep.ofDistribMulAction k G A) f).1 hf
539551

540552
/-- Given a `k`-module `A` with a compatible `DistribMulAction` of `G`, and a function
541553
`f : G × G → A` satisfying the 2-coboundary condition, produces a 2-coboundary for the
542554
representation on `A` induced by the `DistribMulAction`. -/
555+
@[simps]
543556
def twoCoboundariesOfIsTwoCoboundary {f : G × G → A} (hf : IsTwoCoboundary f) :
544557
twoCoboundaries (Rep.ofDistribMulAction k G A) :=
545-
twoCoboundariesOfMemRange (⟨hf.choose,funext fun g ↦ hf.choose_spec g.1 g.2)
558+
⟨f, hf.choose,funext fun g ↦ hf.choose_spec g.1 g.2
546559

547-
theorem isTwoCoboundary_of_twoCoboundaries (f : twoCoboundaries (Rep.ofDistribMulAction k G A)) :
548-
IsTwoCoboundary (A := A) f.1.1 := by
549-
rcases mem_range_of_mem_twoCoboundaries f.2 with ⟨x, hx⟩
550-
exact ⟨x, fun g h => funext_iff.1 hx (g, h)⟩
560+
theorem isTwoCoboundary_of_mem_twoCoboundaries
561+
(f : G × G → A) (hf : f ∈ twoCoboundaries (Rep.ofDistribMulAction k G A)) :
562+
IsTwoCoboundary f := by
563+
rcases hf with ⟨a, rfl⟩
564+
exact ⟨a, fun _ _ => rfl⟩
551565

552566
end ofDistribMulAction
553567

@@ -631,48 +645,55 @@ variable {G M : Type} [Group G] [CommGroup M] [MulDistribMulAction G M]
631645
/-- Given an abelian group `M` with a `MulDistribMulAction` of `G`, and a function
632646
`f : G → M` satisfying the multiplicative 1-cocycle condition, produces a 1-cocycle for the
633647
representation on `Additive M` induced by the `MulDistribMulAction`. -/
648+
@[simps]
634649
def oneCocyclesOfIsMulOneCocycle {f : G → M} (hf : IsMulOneCocycle f) :
635650
oneCocycles (Rep.ofMulDistribMulAction G M) :=
636651
⟨Additive.ofMul ∘ f, (mem_oneCocycles_iff (A := Rep.ofMulDistribMulAction G M) f).2 hf⟩
637652

638-
theorem isMulOneCocycle_of_oneCocycles (f : oneCocycles (Rep.ofMulDistribMulAction G M)) :
639-
IsMulOneCocycle (M := M) (Additive.toMul ∘ f) := (mem_oneCocycles_iff f).1 f.2
653+
theorem isMulOneCocycle_of_mem_oneCocycles
654+
(f : G → M) (hf : f ∈ oneCocycles (Rep.ofMulDistribMulAction G M)) :
655+
IsMulOneCocycle (Additive.toMul ∘ f) :=
656+
(mem_oneCocycles_iff (A := Rep.ofMulDistribMulAction G M) f).1 hf
640657

641658
/-- Given an abelian group `M` with a `MulDistribMulAction` of `G`, and a function
642659
`f : G → M` satisfying the multiplicative 1-coboundary condition, produces a
643660
1-coboundary for the representation on `Additive M` induced by the `MulDistribMulAction`. -/
661+
@[simps]
644662
def oneCoboundariesOfIsMulOneCoboundary {f : G → M} (hf : IsMulOneCoboundary f) :
645663
oneCoboundaries (Rep.ofMulDistribMulAction G M) :=
646-
oneCoboundariesOfMemRange (f := Additive.ofMul ∘ f) ⟨hf.choose, funext hf.choose_spec⟩
664+
⟨f, hf.choose, funext hf.choose_spec⟩
647665

648-
theorem isMulOneCoboundary_of_oneCoboundaries
649-
(f : oneCoboundaries (Rep.ofMulDistribMulAction G M)) :
650-
IsMulOneCoboundary (M := M) (Additive.ofMul ∘ f.1.1) := by
651-
rcases mem_range_of_mem_oneCoboundaries f.2 with ⟨x, hx
652-
exact ⟨x, by rw [← hx]; intro g; rfl⟩
666+
theorem isMulOneCoboundary_of_mem_oneCoboundaries
667+
(f : G → M) (hf : f ∈ oneCoboundaries (Rep.ofMulDistribMulAction G M)) :
668+
IsMulOneCoboundary (M := M) (Additive.ofMul ∘ f) := by
669+
rcases hf with ⟨x, rfl
670+
exact ⟨x, fun _ => rfl⟩
653671

654672
/-- Given an abelian group `M` with a `MulDistribMulAction` of `G`, and a function
655673
`f : G × G → M` satisfying the multiplicative 2-cocycle condition, produces a 2-cocycle for the
656674
representation on `Additive M` induced by the `MulDistribMulAction`. -/
675+
@[simps]
657676
def twoCocyclesOfIsMulTwoCocycle {f : G × G → M} (hf : IsMulTwoCocycle f) :
658677
twoCocycles (Rep.ofMulDistribMulAction G M) :=
659678
⟨Additive.ofMul ∘ f, (mem_twoCocycles_iff (A := Rep.ofMulDistribMulAction G M) f).2 hf⟩
660679

661-
theorem isMulTwoCocycle_of_twoCocycles (f : twoCocycles (Rep.ofMulDistribMulAction G M)) :
662-
IsMulTwoCocycle (M := M) (Additive.toMul ∘ f) := (mem_twoCocycles_iff f).1 f.2
680+
theorem isMulTwoCocycle_of_mem_twoCocycles
681+
(f : G × G → M) (hf : f ∈ twoCocycles (Rep.ofMulDistribMulAction G M)) :
682+
IsMulTwoCocycle (Additive.toMul ∘ f) :=
683+
(mem_twoCocycles_iff (A := Rep.ofMulDistribMulAction G M) f).1 hf
663684

664685
/-- Given an abelian group `M` with a `MulDistribMulAction` of `G`, and a function
665686
`f : G × G → M` satisfying the multiplicative 2-coboundary condition, produces a
666687
2-coboundary for the representation on `M` induced by the `MulDistribMulAction`. -/
667688
def twoCoboundariesOfIsMulTwoCoboundary {f : G × G → M} (hf : IsMulTwoCoboundary f) :
668689
twoCoboundaries (Rep.ofMulDistribMulAction G M) :=
669-
twoCoboundariesOfMemRange ⟨hf.choose, funext fun g ↦ hf.choose_spec g.1 g.2
690+
⟨f, hf.choose, funext fun g ↦ hf.choose_spec g.1 g.2
670691

671-
theorem isMulTwoCoboundary_of_twoCoboundaries
672-
(f : twoCoboundaries (Rep.ofMulDistribMulAction G M)) :
673-
IsMulTwoCoboundary (M := M) (Additive.toMul ∘ f.1.1) := by
674-
rcases mem_range_of_mem_twoCoboundaries f.2 with ⟨x, hx
675-
exact ⟨x, fun g h => funext_iff.1 hx (g, h)
692+
theorem isMulTwoCoboundary_of_mem_twoCoboundaries
693+
(f : G × G → M) (hf : f ∈ twoCoboundaries (Rep.ofMulDistribMulAction G M)) :
694+
IsMulTwoCoboundary (M := M) (Additive.toMul ∘ f) := by
695+
rcases hf with ⟨x, rfl
696+
exact ⟨x, fun _ _ => rfl
676697

677698
end ofMulDistribMulAction
678699

@@ -691,8 +712,9 @@ abbrev H1 := (shortComplexH1 A).moduleCatHomology
691712
abbrev H1π : ModuleCat.of k (oneCocycles A) ⟶ H1 A := (shortComplexH1 A).moduleCatHomologyπ
692713

693714
variable {A} in
694-
lemma H1π_eq_zero_iff (x : oneCocycles A) : H1π A x = 0 ↔ x ∈ oneCoboundaries A :=
695-
Submodule.Quotient.mk_eq_zero _
715+
lemma H1π_eq_zero_iff (x : oneCocycles A) : H1π A x = 0 ↔ ⇑x ∈ oneCoboundaries A := by
716+
show (LinearMap.range ((dZero A).codRestrict (oneCocycles A) _)).mkQ _ = 0 ↔ _
717+
simp [LinearMap.range_codRestrict, oneCoboundaries]
696718

697719
/-- We define the 2nd group cohomology of a `k`-linear `G`-representation `A`, `H²(G, A)`, to be
698720
2-cocycles (i.e. `Z²(G, A) := Ker(d² : Fun(G², A) → Fun(G³, A)`) modulo 2-coboundaries
@@ -703,8 +725,9 @@ abbrev H2 := (shortComplexH2 A).moduleCatHomology
703725
abbrev H2π : ModuleCat.of k (twoCocycles A) ⟶ H2 A := (shortComplexH2 A).moduleCatHomologyπ
704726

705727
variable {A} in
706-
lemma H2π_eq_zero_iff (x : twoCocycles A) : H2π A x = 0 ↔ x ∈ twoCoboundaries A :=
707-
Submodule.Quotient.mk_eq_zero _
728+
lemma H2π_eq_zero_iff (x : twoCocycles A) : H2π A x = 0 ↔ ⇑x ∈ twoCoboundaries A := by
729+
show (LinearMap.range ((dOne A).codRestrict (twoCocycles A) _)).mkQ _ = 0 ↔ _
730+
simp [LinearMap.range_codRestrict, twoCoboundaries]
708731

709732
end Cohomology
710733

@@ -731,8 +754,9 @@ section H1
731754
group homs `G → A`. -/
732755
def H1LequivOfIsTrivial [A.IsTrivial] :
733756
H1 A ≃ₗ[k] Additive G →+ A :=
734-
(Submodule.quotEquivOfEqBot _ (oneCoboundaries_eq_bot_of_isTrivial A)).trans
735-
(oneCocyclesLequivOfIsTrivial A)
757+
(Submodule.quotEquivOfEqBot _
758+
(by simp [shortComplexH1, ShortComplex.moduleCatToCycles, Submodule.eq_bot_iff])).trans
759+
(oneCocyclesLequivOfIsTrivial A)
736760

737761
theorem H1LequivOfIsTrivial_comp_H1π [A.IsTrivial] :
738762
(H1LequivOfIsTrivial A).comp (H1π A).hom = oneCocyclesLequivOfIsTrivial A := by

0 commit comments

Comments
 (0)