Skip to content

Commit 545b843

Browse files
committed
minimize imports
2 parents 4dceff8 + 2a51a80 commit 545b843

191 files changed

Lines changed: 1521 additions & 787 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Mathlib.lean

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ public import Mathlib.Algebra.Category.ModuleCat.Differentials.Basic
158158
public import Mathlib.Algebra.Category.ModuleCat.Differentials.Presheaf
159159
public import Mathlib.Algebra.Category.ModuleCat.EnoughInjectives
160160
public import Mathlib.Algebra.Category.ModuleCat.EpiMono
161+
public import Mathlib.Algebra.Category.ModuleCat.Ext.Basic
161162
public import Mathlib.Algebra.Category.ModuleCat.Ext.DimensionShifting
162163
public import Mathlib.Algebra.Category.ModuleCat.Ext.Finite
163164
public import Mathlib.Algebra.Category.ModuleCat.Ext.HasExt
@@ -779,6 +780,7 @@ public import Mathlib.Algebra.Module.LinearMap.Basic
779780
public import Mathlib.Algebra.Module.LinearMap.Defs
780781
public import Mathlib.Algebra.Module.LinearMap.DivisionRing
781782
public import Mathlib.Algebra.Module.LinearMap.End
783+
public import Mathlib.Algebra.Module.LinearMap.FiniteRange
782784
public import Mathlib.Algebra.Module.LinearMap.Polynomial
783785
public import Mathlib.Algebra.Module.LinearMap.Prod
784786
public import Mathlib.Algebra.Module.LinearMap.Rat
@@ -1690,6 +1692,7 @@ public import Mathlib.Analysis.CStarAlgebra.Unitary.Maps
16901692
public import Mathlib.Analysis.CStarAlgebra.Unitary.Span
16911693
public import Mathlib.Analysis.CStarAlgebra.Unitization
16921694
public import Mathlib.Analysis.CStarAlgebra.lpSpace
1695+
public import Mathlib.Analysis.Calculus.AbsolutelyMonotone
16931696
public import Mathlib.Analysis.Calculus.AddTorsor.AffineMap
16941697
public import Mathlib.Analysis.Calculus.AddTorsor.Coord
16951698
public import Mathlib.Analysis.Calculus.BumpFunction.Basic
@@ -5916,8 +5919,7 @@ public import Mathlib.Order.Cover
59165919
public import Mathlib.Order.Defs.LinearOrder
59175920
public import Mathlib.Order.Defs.PartialOrder
59185921
public import Mathlib.Order.Defs.Unbundled
5919-
public import Mathlib.Order.DirSupClosed.Basic
5920-
public import Mathlib.Order.DirSupClosed.Finite
5922+
public import Mathlib.Order.DirSupClosed
59215923
public import Mathlib.Order.Directed
59225924
public import Mathlib.Order.DirectedInverseSystem
59235925
public import Mathlib.Order.Disjoint

Mathlib/Algebra/Category/ModuleCat/Basic.lean

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public import Mathlib.Algebra.Category.ModuleCat.Semi
99
public import Mathlib.Algebra.Category.Grp.Preadditive
1010
public import Mathlib.CategoryTheory.Linear.Basic
1111
public import Mathlib.CategoryTheory.Preadditive.AdditiveFunctor
12+
public import Mathlib.LinearAlgebra.BilinearMap
1213

1314
/-!
1415
# The category of `R`-modules
@@ -386,6 +387,15 @@ lemma isZero_iff_subsingleton : IsZero M ↔ Subsingleton M where
386387
lemma isZero_of_iff_subsingleton {M : Type*} [AddCommGroup M] [Module R M] :
387388
IsZero (of R M) ↔ Subsingleton M := isZero_iff_subsingleton
388389

390+
@[simp]
391+
lemma ofHom_zero {M N : Type v} [AddCommGroup M] [Module R M]
392+
[AddCommGroup N] [Module R N] : ModuleCat.ofHom (0 : M →ₗ[R] N) = 0 := rfl
393+
394+
@[simp]
395+
lemma ofHom_add {M N : Type v} [AddCommGroup M] [Module R M]
396+
[AddCommGroup N] [Module R N] (f g : M →ₗ[R] N) :
397+
ModuleCat.ofHom (f + g) = ModuleCat.ofHom f + ModuleCat.ofHom g := rfl
398+
389399
end AddCommGroup
390400

391401
section SMul
@@ -456,6 +466,9 @@ variable {S : Type u} [CommRing S]
456466

457467
instance : Linear S (ModuleCat.{v} S) := ModuleCat.Algebra.instLinear
458468

469+
lemma lsmul_eq_smul_id (M : ModuleCat.{v} S) (s : S) :
470+
ModuleCat.ofHom (LinearMap.lsmul S M s) = s • 𝟙 M := rfl
471+
459472
variable {X Y X' Y' : ModuleCat.{v} S}
460473

461474
set_option backward.privateInPublic true in
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/-
2+
Copyright (c) 2026 Nailin Guan. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Nailin Guan
5+
-/
6+
7+
module
8+
9+
public import Mathlib.Algebra.Category.Grp.Zero
10+
public import Mathlib.Algebra.Category.ModuleCat.Ext.HasExt
11+
public import Mathlib.Algebra.Homology.DerivedCategory.Ext.Linear
12+
public import Mathlib.RingTheory.Ideal.Maps
13+
14+
/-!
15+
16+
# Some basic lemmas for manipulating `Ext` over `ModuleCat`
17+
18+
-/
19+
20+
@[expose] public section
21+
22+
universe v u
23+
24+
open LinearMap CategoryTheory Limits
25+
26+
variable {R : Type u} [CommRing R]
27+
28+
variable {M N : Type v} [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N]
29+
30+
namespace CategoryTheory.Abelian
31+
32+
variable [Small.{v} R] {M N : ModuleCat.{v} R}
33+
34+
/-- If `r • N = 0`, then `r • 𝟙 M` induces the zero endomorphism on `Ext M N n`. -/
35+
lemma Ext.postcomp_smul_id_eq_zero_of_mem_annihilator {r : R} (mem_ann : r ∈ Module.annihilator R N)
36+
(n : ℕ) : AddCommGrpCat.ofHom ((Ext.mk₀ (r • 𝟙 M)).postcomp N (add_zero n)) = 0 := by
37+
ext h
38+
have : r • 𝟙 N = 0 := by
39+
simp [← ModuleCat.lsmul_eq_smul_id, Module.mem_annihilator_iff_lsmul_eq_zero.mp mem_ann]
40+
have smul_eq : r • h = (Ext.mk₀ (r • 𝟙 N)).comp h (zero_add n) := by simp [Ext.mk₀_smul]
41+
simp [Ext.mk₀_smul, this, smul_eq]
42+
43+
/-- `r • 𝟙 M` induces a monomorphism in `Ext M N n` if and only if scalar multiplication by `r`
44+
is faithful on `Ext M N n`. -/
45+
lemma Ext.postcomp_smul_id_mono_iff (r : R) (i : ℕ) :
46+
Mono (AddCommGrpCat.ofHom ((Ext.mk₀ (r • 𝟙 M)).postcomp N (add_zero i))) ↔
47+
IsSMulRegular (Ext N M i) r := by
48+
simp only [IsSMulRegular, AddCommGrpCat.mono_iff_injective]
49+
congr!
50+
ext
51+
simp [Ext.mk₀_smul]
52+
53+
end CategoryTheory.Abelian

Mathlib/Algebra/Category/Ring/Under/Basic.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def toUnder {A B : Type u} [CommRing A] [CommRing B] [Algebra R A] [Algebra R B]
8080
@[simp]
8181
lemma toUnder_right {A B : Type u} [CommRing A] [CommRing B] [Algebra R A]
8282
[Algebra R B] (f : A →ₐ[R] B) (a : A) :
83-
f.toUnder.right a = f a :=
83+
Under.Hom.right f.toUnder a = f a :=
8484
rfl
8585

8686
@[simp]
@@ -130,7 +130,7 @@ variable [Algebra R S]
130130

131131
variable (R S) in
132132
/-- The base change functor `A ↦ S ⊗[R] A`. -/
133-
@[simps! map_right]
133+
@[simps! obj_right map_right]
134134
def tensorProd : Under R ⥤ Under S where
135135
obj A := mkUnder S (S ⊗[R] A)
136136
map f := Algebra.TensorProduct.map (AlgHom.id S S) (toAlgHom f) |>.toUnder

Mathlib/Algebra/Category/Ring/Under/Property.lean

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module
88
public import Mathlib.Algebra.Category.Ring.Under.Limits
99
public import Mathlib.CategoryTheory.Limits.MorphismProperty
1010
public import Mathlib.CategoryTheory.ObjectProperty.FiniteProducts
11+
public import Mathlib.CategoryTheory.ConcreteCategory.EpiMono
1112

1213
/-!
1314
# Properties of `P.Under ⊤ R` for `R : CommRingCat`
@@ -19,6 +20,8 @@ In this file we translate ring theoretic properties of a property of ring homomo
1920
2021
- `CommRingCat.Under.hasFiniteLimits`: If `P` is stable under finite products and equalizers,
2122
`P.Under ⊤ R` has finite limits.
23+
- `RingHom.HasStableEqualizers.preservesFiniteLimits_pushout`: If `P` has stable equalizers,
24+
base change along arbitrary morphisms preserve finite limits.
2225
-/
2326

2427
@[expose] public section
@@ -80,6 +83,18 @@ lemma RingHom.HasFiniteProducts.hasFiniteProducts (hQi : RespectsIso Q) (hQp : H
8083
have := hQp.createsFiniteProductsForget hQi R
8184
exact CategoryTheory.hasLimit_of_created D (Under.forget _ _ R)
8285

86+
lemma RingHom.HasFiniteProducts.preservesFiniteProducts_pushout (hQi : RingHom.RespectsIso Q)
87+
(hQp : RingHom.HasFiniteProducts Q) [(toMorphismProperty Q).IsStableUnderCobaseChange]
88+
{R S : CommRingCat.{u}} (f : R ⟶ S) :
89+
PreservesFiniteProducts (Under.pushout (toMorphismProperty Q) ⊤ f) := by
90+
have := hQp.createsFiniteProductsForget hQi R
91+
refine ⟨fun n ↦ ⟨fun {K} ↦ ?_⟩⟩
92+
have : PreservesLimit K (Under.pushout (toMorphismProperty Q) ⊤ f ⋙
93+
Under.forget (toMorphismProperty Q) ⊤ S) := by
94+
rw [preservesLimit_iff_of_natIso _ (Under.pushoutCompForgetIso _)]
95+
infer_instance
96+
exact preservesLimit_of_reflects_of_preserves _ (MorphismProperty.Under.forget _ ⊤ S)
97+
8398
/-- If `Q` is stable under equalizers, the inclusion from the subcategory of `Under R` defined
8499
by `Q` creates equalizers. -/
85100
@[implicit_reducible]
@@ -117,3 +132,74 @@ lemma Under.hasFiniteLimits (hQi : RingHom.RespectsIso Q)
117132
hasFiniteLimits_of_hasEqualizers_and_finite_products
118133

119134
end CommRingCat
135+
136+
variable (P : ∀ {R S : Type u} [CommRing R] [CommRing S], (R →+* S) → Prop)
137+
138+
open RingHom
139+
140+
variable {P}
141+
142+
lemma CommRingCat.preservesLimit_parallelPair_tensorProd_iff_tensorEqualizer_bijective
143+
{R S : CommRingCat.{u}} [Algebra R S] {A B : Under R} {f g : A ⟶ B} :
144+
PreservesLimit (parallelPair f g) (tensorProd R S) ↔
145+
Function.Bijective ((toAlgHom f).tensorEqualizer R S (toAlgHom g)) := by
146+
let c : Fork f g := Under.equalizerFork f g
147+
let hc : IsLimit c := Under.equalizerForkIsLimit f g
148+
let ι : R.mkUnder (AlgHom.equalizer (toAlgHom f) (toAlgHom g)) ⟶ A :=
149+
(AlgHom.equalizer (toAlgHom f) (toAlgHom g)).val.toUnder
150+
let h' := (R.tensorProd S).map ι
151+
have w' : h' ≫ (tensorProd R S).map f = h' ≫ (tensorProd R S).map g := by
152+
simpa using congr((R.tensorProd S).map $(CommRingCat.Under.equalizer_comp f g))
153+
let e : IsLimit ((R.tensorProd S).mapCone c) ≃ IsLimit (Fork.ofι h' w') :=
154+
isLimitMapConeForkEquiv (tensorProd R S) (Under.equalizer_comp f g)
155+
rw [preservesLimit_iff_isLimit_mapCone hc, e.nonempty_congr,
156+
(Under.equalizerForkIsLimit _ _).nonempty_isLimit_iff_isIso_lift]
157+
have heq : (Under.equalizerForkIsLimit _ _).lift (Fork.ofι h' w') =
158+
(AlgHom.tensorEqualizer S S (toAlgHom f) (toAlgHom g)).toUnder ≫
159+
Under.homMk (CommRingCat.ofHom (.id _)) := by
160+
refine Fork.IsLimit.hom_ext (Under.equalizerForkIsLimit _ _) ?_
161+
rw [Fork.IsLimit.lift_ι]
162+
ext : 2
163+
dsimp
164+
ext x <;> rfl
165+
rw [heq, ← isIso_iff_of_reflects_iso _ (CategoryTheory.Under.forget S),
166+
ConcreteCategory.isIso_iff_bijective]
167+
rfl
168+
169+
lemma RingHom.HasStableEqualizers.preservesLimit_parallelPair_tensorProd
170+
(hPse : HasStableEqualizers P) {R S : CommRingCat.{u}} [Algebra R S]
171+
{A B : Under R} (f g : A ⟶ B) (hA : P A.hom.hom) (hB : P B.hom.hom) :
172+
PreservesLimit (parallelPair f g) (CommRingCat.tensorProd R S) := by
173+
rw [CommRingCat.preservesLimit_parallelPair_tensorProd_iff_tensorEqualizer_bijective]
174+
exact hPse _ _ hA hB
175+
176+
lemma RingHom.HasStableEqualizers.preservesEqualizers_pushout (hPi : RespectsIso P)
177+
(hPe : HasEqualizers P) (hPse : HasStableEqualizers P)
178+
[(toMorphismProperty P).IsStableUnderCobaseChange] {R S : CommRingCat.{u}} (f : R ⟶ S) :
179+
PreservesLimitsOfShape WalkingParallelPair (Under.pushout (toMorphismProperty P) ⊤ f) := by
180+
refine ⟨fun {K} ↦ ?_⟩
181+
have := hPe.createsLimitsWalkingParallelPair hPi R
182+
algebraize [f.hom]
183+
have : PreservesLimit (K ⋙ Under.forget (toMorphismProperty P) ⊤ R)
184+
(CategoryTheory.Under.pushout f) := by
185+
rw [← CommRingCat.ofHom_hom f,
186+
← preservesLimit_iff_of_natIso _ (CommRingCat.tensorProdIsoPushout R S),
187+
← preservesLimit_iff_of_iso_diagram _ (diagramIsoParallelPair _).symm]
188+
exact hPse.preservesLimit_parallelPair_tensorProd _ _ ((K.obj _).prop) ((K.obj _).prop)
189+
have : PreservesLimit K (Under.pushout (toMorphismProperty P) ⊤ f ⋙
190+
Under.forget (toMorphismProperty P) ⊤ S) := by
191+
rw [preservesLimit_iff_of_natIso _ (Under.pushoutCompForgetIso _)]
192+
infer_instance
193+
exact preservesLimit_of_reflects_of_preserves _ (Under.forget _ ⊤ S)
194+
195+
/-- If `P` is a property of ring homs that is stable under finite products and
196+
equalizers, and the latter are preserved by arbitrary base change,
197+
pushout along any ring homomorphism preserves finite limits. -/
198+
lemma RingHom.HasStableEqualizers.preservesFiniteLimits_pushout (hPi : RingHom.RespectsIso P)
199+
(hPp : HasFiniteProducts P) (hPe : HasEqualizers P) (hPse : HasStableEqualizers P)
200+
[(toMorphismProperty P).IsStableUnderCobaseChange] {R S : CommRingCat.{u}} (f : R ⟶ S) :
201+
PreservesFiniteLimits (Under.pushout (toMorphismProperty P) ⊤ f) :=
202+
have := hPp.preservesFiniteProducts_pushout hPi f
203+
have := hPse.preservesEqualizers_pushout hPi hPe f
204+
have := CommRingCat.Under.hasFiniteLimits hPi hPp hPe
205+
preservesFiniteLimits_of_preservesEqualizers_and_finiteProducts _

Mathlib/Algebra/DirectSum/Module.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ theorem component.of [DecidableEq ι] (i j : ι) (b : M j) :
213213
component R ι M i ((lof R ι M j) b) = if h : j = i then Eq.recOn h b else 0 :=
214214
DFinsupp.single_apply
215215

216+
lemma component_comp_lof [DecidableEq ι] (i j : ι) :
217+
component R ι M i ∘ₗ lof R ι M j = if h : j = i then h ▸ .id else 0 := by
218+
aesop (add simp component.of)
219+
220+
@[simp]
221+
lemma component_comp_lof_same [DecidableEq ι] (i : ι) : component R ι M i ∘ₗ lof R ι M i = .id := by
222+
simp [component_comp_lof]
223+
216224
section map
217225

218226
variable {R} {N : ι → Type*}

Mathlib/Algebra/Group/Subgroup/Basic.lean

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -337,26 +337,30 @@ theorem mem_normalizer_iff_conj_image_eq {s : Set G} {g : G} :
337337
refine forall_congr' fun h ↦ ?_
338338
simp_rw [mul_inv_eq_iff_eq_mul, ← eq_inv_mul_iff_mul_eq, ← mul_assoc, exists_eq_right, iff_comm]
339339

340-
theorem _root_.AddSubgroup.mem_normalizer_iff_conj_image_eq {G : Type*} [AddGroup G] {s : Set G}
340+
theorem _root_.AddSubgroup.mem_normalizer_iff_addConj_image_eq {G : Type*} [AddGroup G] {s : Set G}
341341
{g : G} : g ∈ AddSubgroup.normalizer s ↔ AddAut.conj g '' s = s := by
342342
simp_rw [AddSubgroup.mem_set_normalizer_iff'', Set.ext_iff, Set.mem_image, AddAut.conj_apply]
343343
refine forall_congr' fun h ↦ ?_
344344
simp_rw [add_neg_eq_iff_eq_add, ← eq_neg_add_iff_add_eq, ← add_assoc, exists_eq_right, iff_comm]
345345

346+
@[deprecated (since := "2026-05-12")]
347+
alias _root_.AddSubgroup.mem_normalizer_iff_conj_image_eq :=
348+
AddSubgroup.mem_normalizer_iff_addConj_image_eq
349+
346350
theorem normalizer_le_normalizer_closure (s : Set G) : normalizer s ≤ normalizer (closure s) := by
347351
intro g hg
348352
have : MulAut.conj g '' (closure s) = closure (MulAut.conj g '' s) :=
349-
congr(SetLike.coe $(MulAut.conj g |>.toMonoidHom.map_closure s))
353+
congr($(MulAut.conj g |>.toMonoidHom.map_closure s))
350354
rw [mem_normalizer_iff_conj_image_eq.mp hg] at this
351355
rwa [mem_normalizer_iff_conj_image_eq]
352356

353357
theorem _root_.AddSubgroup.normalizer_le_normalizer_closure {G : Type*} [AddGroup G] (s : Set G) :
354358
AddSubgroup.normalizer s ≤ AddSubgroup.normalizer (AddSubgroup.closure s) := by
355359
intro g hg
356360
have : AddAut.conj g '' (AddSubgroup.closure s) = AddSubgroup.closure (AddAut.conj g '' s) :=
357-
congr(SetLike.coe $(AddAut.conj g |>.toAddMonoidHom.map_closure s))
358-
rw [AddSubgroup.mem_normalizer_iff_conj_image_eq.mp hg] at this
359-
rwa [AddSubgroup.mem_normalizer_iff_conj_image_eq]
361+
congr($(AddAut.conj g |>.toAddMonoidHom.map_closure s))
362+
rw [AddSubgroup.mem_normalizer_iff_addConj_image_eq.mp hg] at this
363+
rwa [AddSubgroup.mem_normalizer_iff_addConj_image_eq]
360364

361365
variable {H}
362366

@@ -371,6 +375,39 @@ variable (H) in
371375
theorem normalizer_eq_top [h : H.Normal] : normalizer (H : Set G) = ⊤ :=
372376
normalizer_eq_top_iff.mpr h
373377

378+
@[to_additive]
379+
theorem le_set_normalizer_iff {s : Set G} :
380+
H ≤ normalizer s ↔ ∀ h ∈ H, ∀ g ∈ s, h * g * h⁻¹ ∈ s := by
381+
refine ⟨fun hH h hh g hg ↦ hH hh g |>.mp hg, fun hH h hh k ↦ ⟨fun hk ↦ hH h hh k hk, fun hk ↦ ?_⟩⟩
382+
simpa [mul_assoc] using hH h⁻¹ (inv_mem hh) _ hk
383+
384+
@[to_additive]
385+
theorem le_normalizer_iff : H ≤ normalizer K ↔ ∀ h ∈ H, ∀ k ∈ K, h * k * h⁻¹ ∈ K := by
386+
refine ⟨fun hH h hh g hg ↦ hH hh g |>.mp hg, fun hH h hh k ↦ ⟨fun hk ↦ hH h hh k hk, fun hk ↦ ?_⟩⟩
387+
simpa [mul_assoc] using hH h⁻¹ (inv_mem hh) _ hk
388+
389+
theorem le_normalizer_closure_iff {s : Set G} :
390+
H ≤ normalizer (closure s) ↔ ∀ h ∈ H, ∀ g ∈ s, h * g * h⁻¹ ∈ closure s := by
391+
refine ⟨fun hH h hh g hg ↦ hH hh g |>.mp <| mem_closure_of_mem hg, fun hH h hh ↦ ?_⟩
392+
have : MulAut.conj h '' (closure s) = closure (MulAut.conj h '' s) :=
393+
congr($(MulAut.conj h |>.toMonoidHom.map_closure s))
394+
rw [mem_normalizer_iff_conj_image_eq, this]
395+
apply subset_antisymm <| by simpa using hH h hh
396+
rw [SetLike.coe_subset_coe, closure_le, ← this]
397+
exact fun g hg ↦ ⟨_, hH _ (inv_mem hh) g hg, by simp [mul_assoc]⟩
398+
399+
theorem _root_.AddSubgroup.le_normalizer_closure_iff {G : Type*} [AddGroup G] {H : AddSubgroup G}
400+
{s : Set G} :
401+
H ≤ AddSubgroup.normalizer (AddSubgroup.closure s) ↔
402+
∀ h ∈ H, ∀ g ∈ s, h + g + -h ∈ AddSubgroup.closure s := by
403+
refine ⟨fun hH h hh g hg ↦ hH hh g |>.mp <| AddSubgroup.mem_closure_of_mem hg, fun hH h hh ↦ ?_⟩
404+
have : AddAut.conj h '' (AddSubgroup.closure s) = AddSubgroup.closure (AddAut.conj h '' s) :=
405+
congr($(AddAut.conj h |>.toAddMonoidHom.map_closure s))
406+
rw [AddSubgroup.mem_normalizer_iff_addConj_image_eq, this]
407+
apply subset_antisymm <| by simpa using hH h hh
408+
rw [SetLike.coe_subset_coe, AddSubgroup.closure_le, ← this]
409+
exact fun g hg ↦ ⟨_, hH _ (neg_mem hh) g hg, by simp [add_assoc]⟩
410+
374411
variable {N : Type*} [Group N]
375412

376413
/-- The preimage of the normalizer is contained in the normalizer of the preimage. -/

0 commit comments

Comments
 (0)