Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit c2e9ec0

Browse files
committed
feat(group_theory/subgroup): add {monoid,add_monoid,ring}_hom.lift_of_right_inverse (#6814)
This provides a computable alternative to `lift_of_surjective`.
1 parent 5cafdff commit c2e9ec0

File tree

5 files changed

+169
-123
lines changed

5 files changed

+169
-123
lines changed

src/data/zmod/basic.lean

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -835,8 +835,10 @@ lemma ring_hom_surjective [ring R] (f : R →+* (zmod n)) : function.surjective
835835

836836
lemma ring_hom_eq_of_ker_eq [comm_ring R] (f g : R →+* (zmod n))
837837
(h : f.ker = g.ker) : f = g :=
838-
by rw [← f.lift_of_surjective_comp (zmod.ring_hom_surjective f) g (le_of_eq h),
839-
ring_hom.ext_zmod (f.lift_of_surjective _ _ _) (ring_hom.id _),
840-
ring_hom.id_comp]
838+
begin
839+
have := f.lift_of_right_inverse_comp _ (zmod.ring_hom_right_inverse f) ⟨g, le_of_eq h⟩,
840+
rw subtype.coe_mk at this,
841+
rw [←this, ring_hom.ext_zmod (f.lift_of_right_inverse _ _ _) (ring_hom.id _), ring_hom.id_comp],
842+
end
841843

842844
end zmod

src/group_theory/subgroup.lean

Lines changed: 70 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,15 +1252,43 @@ end subgroup
12521252
namespace monoid_hom
12531253

12541254
variables {G₁ G₂ G₃ : Type*} [group G₁] [group G₂] [group G₃]
1255-
variables (f : G₁ →* G₂)
1255+
variables (f : G₁ →* G₂) (f_inv : G₂ → G₁)
12561256

1257-
/-- `lift_of_surjective f hf g hg` is the unique group homomorphism `φ`
1257+
/-- Auxiliary definition used to define `lift_of_right_inverse` -/
1258+
@[to_additive "Auxiliary definition used to define `lift_of_right_inverse`"]
1259+
def lift_of_right_inverse_aux
1260+
(hf : function.right_inverse f_inv f) (g : G₁ →* G₃) (hg : f.ker ≤ g.ker) :
1261+
G₂ →* G₃ :=
1262+
{ to_fun := λ b, g (f_inv b),
1263+
map_one' := hg (hf 1),
1264+
map_mul' :=
1265+
begin
1266+
intros x y,
1267+
rw [← g.map_mul, ← mul_inv_eq_one, ← g.map_inv, ← g.map_mul, ← g.mem_ker],
1268+
apply hg,
1269+
rw [f.mem_ker, f.map_mul, f.map_inv, mul_inv_eq_one, f.map_mul],
1270+
simp only [hf _],
1271+
end }
1272+
1273+
@[simp, to_additive]
1274+
lemma lift_of_right_inverse_aux_comp_apply
1275+
(hf : function.right_inverse f_inv f) (g : G₁ →* G₃) (hg : f.ker ≤ g.ker) (x : G₁) :
1276+
(f.lift_of_right_inverse_aux f_inv hf g hg) (f x) = g x :=
1277+
begin
1278+
dsimp [lift_of_right_inverse_aux],
1279+
rw [← mul_inv_eq_one, ← g.map_inv, ← g.map_mul, ← g.mem_ker],
1280+
apply hg,
1281+
rw [f.mem_ker, f.map_mul, f.map_inv, mul_inv_eq_one],
1282+
simp only [hf _],
1283+
end
12581284

1259-
* such that `φ.comp f = g` (`lift_of_surjective_comp`),
1260-
* where `f : G₁ →+* G₂` is surjective (`hf`),
1285+
/-- `lift_of_right_inverse f hf g hg` is the unique group homomorphism `φ`
1286+
1287+
* such that `φ.comp f = g` (`monoid_hom.lift_of_right_inverse_comp`),
1288+
* where `f : G₁ →+* G₂` has a right_inverse `f_inv` (`hf`),
12611289
* and `g : G₂ →+* G₃` satisfies `hg : f.ker ≤ g.ker`.
12621290
1263-
See `lift_of_surjective_eq` for the uniqueness lemma.
1291+
See `monoid_hom.eq_lift_of_right_inverse` for the uniqueness lemma.
12641292
12651293
```
12661294
G₁.
@@ -1272,13 +1300,13 @@ See `lift_of_surjective_eq` for the uniqueness lemma.
12721300
∃!φ
12731301
```
12741302
-/
1275-
@[to_additive "`lift_of_surjective f hf g hg` is the unique additive group homomorphism `φ`
1303+
@[to_additive "`lift_of_right_inverse f f_inv hf g hg` is the unique additive group homomorphism `φ`
12761304
1277-
* such that `φ.comp f = g` (`lift_of_surjective_comp`),
1278-
* where `f : G₁ →+* G₂` is surjective (`hf`),
1279-
* and `g : G₂ →+* G₃` satisfies `hg : f.ker ≤ g.ker`.
1305+
* such that `φ.comp f = g` (`add_monoid_hom.lift_of_right_inverse_comp`),
1306+
* where `f : G₁ →+ G₂` has a right_inverse `f_inv` (`hf`),
1307+
* and `g : G₂ →+ G₃` satisfies `hg : f.ker ≤ g.ker`.
12801308
1281-
See `lift_of_surjective_eq` for the uniqueness lemma.
1309+
See `add_monoid_hom.eq_lift_of_right_inverse` for the uniqueness lemma.
12821310
12831311
```
12841312
G₁.
@@ -1289,44 +1317,45 @@ See `lift_of_surjective_eq` for the uniqueness lemma.
12891317
G₂----> G₃
12901318
∃!φ
12911319
```"]
1292-
noncomputable def lift_of_surjective
1293-
(hf : function.surjective f) (g : G₁ →* G₃) (hg : f.ker ≤ g.ker) :
1294-
G₂ →* G₃ :=
1295-
{ to_fun := λ b, g (classical.some (hf b)),
1296-
map_one' := hg (classical.some_spec (hf 1)),
1297-
map_mul' :=
1298-
begin
1299-
intros x y,
1300-
rw [← g.map_mul, ← mul_inv_eq_one, ← g.map_inv, ← g.map_mul, ← g.mem_ker],
1301-
apply hg,
1302-
rw [f.mem_ker, f.map_mul, f.map_inv, mul_inv_eq_one, f.map_mul],
1303-
simp only [classical.some_spec (hf _)],
1304-
end }
1320+
def lift_of_right_inverse
1321+
(hf : function.right_inverse f_inv f) : {g : G₁ →* G₃ // f.ker ≤ g.ker} ≃ (G₂ →* G₃) :=
1322+
{ to_fun := λ g, f.lift_of_right_inverse_aux f_inv hf g.1 g.2,
1323+
inv_fun := λ φ, ⟨φ.comp f, λ x hx, (mem_ker _).mpr $ by simp [(mem_ker _).mp hx]⟩,
1324+
left_inv := λ g, by {
1325+
ext,
1326+
simp only [comp_apply, lift_of_right_inverse_aux_comp_apply, subtype.coe_mk,
1327+
subtype.val_eq_coe], },
1328+
right_inv := λ φ, by {
1329+
ext b,
1330+
simp [lift_of_right_inverse_aux, hf b], } }
1331+
1332+
/-- A non-computable version of `monoid_hom.lift_of_right_inverse` for when no computable right
1333+
inverse is available, that uses `function.surj_inv`. -/
1334+
@[simp, to_additive "A non-computable version of `add_monoid_hom.lift_of_right_inverse` for when no
1335+
computable right inverse is available."]
1336+
noncomputable abbreviation lift_of_surjective
1337+
(hf : function.surjective f) : {g : G₁ →* G₃ // f.ker ≤ g.ker} ≃ (G₂ →* G₃) :=
1338+
f.lift_of_right_inverse (function.surj_inv hf) (function.right_inverse_surj_inv hf)
13051339

13061340
@[simp, to_additive]
1307-
lemma lift_of_surjective_comp_apply
1308-
(hf : function.surjective f) (g : G₁ →* G₃) (hg : f.ker ≤ g.ker) (x : G₁) :
1309-
(f.lift_of_surjective hf g hg) (f x) = g x :=
1310-
begin
1311-
dsimp [lift_of_surjective],
1312-
rw [← mul_inv_eq_one, ← g.map_inv, ← g.map_mul, ← g.mem_ker],
1313-
apply hg,
1314-
rw [f.mem_ker, f.map_mul, f.map_inv, mul_inv_eq_one],
1315-
simp only [classical.some_spec (hf _)],
1316-
end
1341+
lemma lift_of_right_inverse_comp_apply
1342+
(hf : function.right_inverse f_inv f) (g : {g : G₁ →* G₃ // f.ker ≤ g.ker}) (x : G₁) :
1343+
(f.lift_of_right_inverse f_inv hf g) (f x) = g x :=
1344+
f.lift_of_right_inverse_aux_comp_apply f_inv hf g.1 g.2 x
13171345

13181346
@[simp, to_additive]
1319-
lemma lift_of_surjective_comp (hf : function.surjective f) (g : G₁ →* G₃) (hg : f.ker ≤ g.ker) :
1320-
(f.lift_of_surjective hf g hg).comp f = g :=
1321-
by { ext, simp only [comp_apply, lift_of_surjective_comp_apply] }
1347+
lemma lift_of_right_inverse_comp (hf : function.right_inverse f_inv f)
1348+
(g : {g : G₁ →* G₃ // f.ker ≤ g.ker}) :
1349+
(f.lift_of_right_inverse f_inv hf g).comp f = g :=
1350+
monoid_hom.ext $ f.lift_of_right_inverse_comp_apply f_inv hf g
13221351

13231352
@[to_additive]
1324-
lemma eq_lift_of_surjective (hf : function.surjective f) (g : G₁ →* G₃) (hg : f.ker ≤ g.ker)
1325-
(h : G₂ →* G₃) (hh : h.comp f = g) :
1326-
h = (f.lift_of_surjective hf g hg) :=
1353+
lemma eq_lift_of_right_inverse (hf : function.right_inverse f_inv f) (g : G₁ →* G₃)
1354+
(hg : f.ker ≤ g.ker) (h : G₂ →* G₃) (hh : h.comp f = g) :
1355+
h = (f.lift_of_right_inverse f_inv hf ⟨g, hg) :=
13271356
begin
1328-
ext b, rcases hf b with ⟨a, rfl⟩,
1329-
simp only [← comp_apply, hh, f.lift_of_surjective_comp],
1357+
simp_rw ←hh,
1358+
exact ((f.lift_of_right_inverse f_inv hf).apply_symm_apply _).symm,
13301359
end
13311360

13321361
end monoid_hom

src/ring_theory/ideal/operations.lean

Lines changed: 63 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,62 +1443,88 @@ end submodule
14431443

14441444
namespace ring_hom
14451445
variables {A B C : Type*} [comm_ring A] [comm_ring B] [comm_ring C]
1446-
variables (f : A →+* B)
1446+
variables (f : A →+* B) (f_inv : B → A)
14471447

1448-
/-- `lift_of_surjective f hf g hg` is the unique ring homomorphism `φ`
1449-
1450-
* such that `φ.comp f = g` (`lift_of_surjective_comp`),
1451-
* where `f : A →+* B` is surjective (`hf`),
1452-
* and `g : B →+* C` satisfies `hg : f.ker ≤ g.ker`.
1453-
1454-
See `lift_of_surjective_eq` for the uniqueness lemma.
1455-
1456-
```
1457-
A .
1458-
| \
1459-
f | \ g
1460-
| \
1461-
v \⌟
1462-
B ----> C
1463-
∃!φ
1464-
```
1465-
-/
1466-
noncomputable def lift_of_surjective
1467-
(hf : function.surjective f) (g : A →+* C) (hg : f.ker ≤ g.ker) :
1448+
/-- Auxiliary definition used to define `lift_of_right_inverse` -/
1449+
def lift_of_right_inverse_aux
1450+
(hf : function.right_inverse f_inv f) (g : A →+* C) (hg : f.ker ≤ g.ker) :
14681451
B →+* C :=
1469-
{ to_fun := λ b, g (classical.some (hf b)),
1452+
{ to_fun := λ b, g (f_inv b),
14701453
map_one' :=
14711454
begin
14721455
rw [← g.map_one, ← sub_eq_zero, ← g.map_sub, ← g.mem_ker],
14731456
apply hg,
14741457
rw [f.mem_ker, f.map_sub, sub_eq_zero, f.map_one],
1475-
exact classical.some_spec (hf 1)
1458+
exact hf 1
14761459
end,
14771460
map_mul' :=
14781461
begin
14791462
intros x y,
14801463
rw [← g.map_mul, ← sub_eq_zero, ← g.map_sub, ← g.mem_ker],
14811464
apply hg,
14821465
rw [f.mem_ker, f.map_sub, sub_eq_zero, f.map_mul],
1483-
simp only [classical.some_spec (hf _)],
1466+
simp only [hf _],
14841467
end,
1485-
.. add_monoid_hom.lift_of_surjective f.to_add_monoid_hom hf g.to_add_monoid_hom hg }
1468+
.. add_monoid_hom.lift_of_right_inverse f.to_add_monoid_hom f_inv hf g.to_add_monoid_hom, hg }
14861469

1487-
@[simp] lemma lift_of_surjective_comp_apply
1488-
(hf : function.surjective f) (g : A →+* C) (hg : f.ker ≤ g.ker) (a : A) :
1489-
(f.lift_of_surjective hf g hg) (f a) = g a :=
1490-
f.to_add_monoid_hom.lift_of_surjective_comp_apply hf g.to_add_monoid_hom hg a
1470+
@[simp] lemma lift_of_right_inverse_aux_comp_apply
1471+
(hf : function.right_inverse f_inv f) (g : A →+* C) (hg : f.ker ≤ g.ker) (a : A) :
1472+
(f.lift_of_right_inverse_aux f_inv hf g hg) (f a) = g a :=
1473+
f.to_add_monoid_hom.lift_of_right_inverse_comp_apply f_inv hf g.to_add_monoid_hom, hg a
14911474

1492-
@[simp] lemma lift_of_surjective_comp (hf : function.surjective f) (g : A →+* C)
1493-
(hg : f.ker ≤ g.ker) : (f.lift_of_surjective hf g hg).comp f = g :=
1494-
by { ext, simp only [comp_apply, lift_of_surjective_comp_apply] }
1475+
/-- `lift_of_right_inverse f hf g hg` is the unique ring homomorphism `φ`
14951476
1496-
lemma eq_lift_of_surjective (hf : function.surjective f) (g : A →+* C) (hg : f.ker ≤ g.ker)
1497-
(h : B →+* C) (hh : h.comp f = g) :
1498-
h = (f.lift_of_surjective hf g hg) :=
1477+
* such that `φ.comp f = g` (`ring_hom.lift_of_right_inverse_comp`),
1478+
* where `f : A →+* B` is has a right_inverse `f_inv` (`hf`),
1479+
* and `g : B →+* C` satisfies `hg : f.ker ≤ g.ker`.
1480+
1481+
See `ring_hom.eq_lift_of_right_inverse` for the uniqueness lemma.
1482+
1483+
```
1484+
A .
1485+
| \
1486+
f | \ g
1487+
| \
1488+
v \⌟
1489+
B ----> C
1490+
∃!φ
1491+
```
1492+
-/
1493+
def lift_of_right_inverse
1494+
(hf : function.right_inverse f_inv f) : {g : A →+* C // f.ker ≤ g.ker} ≃ (B →+* C) :=
1495+
{ to_fun := λ g, f.lift_of_right_inverse_aux f_inv hf g.1 g.2,
1496+
inv_fun := λ φ, ⟨φ.comp f, λ x hx, (mem_ker _).mpr $ by simp [(mem_ker _).mp hx]⟩,
1497+
left_inv := λ g, by {
1498+
ext,
1499+
simp only [comp_apply, lift_of_right_inverse_aux_comp_apply, subtype.coe_mk,
1500+
subtype.val_eq_coe], },
1501+
right_inv := λ φ, by {
1502+
ext b,
1503+
simp [lift_of_right_inverse_aux, hf b], } }
1504+
1505+
/-- A non-computable version of `ring_hom.lift_of_right_inverse` for when no computable right
1506+
inverse is available, that uses `function.surj_inv`. -/
1507+
@[simp]
1508+
noncomputable abbreviation lift_of_surjective
1509+
(hf : function.surjective f) : {g : A →+* C // f.ker ≤ g.ker} ≃ (B →+* C) :=
1510+
f.lift_of_right_inverse (function.surj_inv hf) (function.right_inverse_surj_inv hf)
1511+
1512+
lemma lift_of_right_inverse_comp_apply
1513+
(hf : function.right_inverse f_inv f) (g : {g : A →+* C // f.ker ≤ g.ker}) (x : A) :
1514+
(f.lift_of_right_inverse f_inv hf g) (f x) = g x :=
1515+
f.lift_of_right_inverse_aux_comp_apply f_inv hf g.1 g.2 x
1516+
1517+
lemma lift_of_right_inverse_comp (hf : function.right_inverse f_inv f)
1518+
(g : {g : A →+* C // f.ker ≤ g.ker}) :
1519+
(f.lift_of_right_inverse f_inv hf g).comp f = g :=
1520+
ring_hom.ext $ f.lift_of_right_inverse_comp_apply f_inv hf g
1521+
1522+
lemma eq_lift_of_right_inverse (hf : function.right_inverse f_inv f) (g : A →+* C)
1523+
(hg : f.ker ≤ g.ker) (h : B →+* C) (hh : h.comp f = g) :
1524+
h = (f.lift_of_right_inverse f_inv hf ⟨g, hg⟩) :=
14991525
begin
1500-
ext b, rcases hf b with ⟨a, rfl⟩,
1501-
simp only [← comp_apply, hh, f.lift_of_surjective_comp],
1526+
simp_rw ←hh,
1527+
exact ((f.lift_of_right_inverse f_inv hf).apply_symm_apply _).symm,
15021528
end
15031529

15041530
end ring_hom

src/ring_theory/roots_of_unity.lean

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -488,44 +488,35 @@ h.pow_eq_one
488488
and the powers of a primitive root of unity `ζ`. -/
489489
def zmod_equiv_gpowers (h : is_primitive_root ζ k) : zmod k ≃+ additive (subgroup.gpowers ζ) :=
490490
add_equiv.of_bijective
491-
(add_monoid_hom.lift_of_surjective (int.cast_add_hom _)
492-
zmod.int_cast_surjective
493-
{ to_fun := λ i, additive.of_mul (⟨_, i, rfl⟩ : subgroup.gpowers ζ),
494-
map_zero' := by { simp only [gpow_zero], refl },
495-
map_add' := by { intros i j, simp only [gpow_add], refl } }
496-
(λ i hi,
491+
(add_monoid_hom.lift_of_right_inverse (int.cast_add_hom $ zmod k) _ zmod.int_cast_right_inverse
492+
⟨{ to_fun := λ i, additive.of_mul (⟨_, i, rfl⟩ : subgroup.gpowers ζ),
493+
map_zero' := by { simp only [gpow_zero], refl },
494+
map_add' := by { intros i j, simp only [gpow_add], refl } },
495+
(λ i hi,
496+
begin
497+
simp only [add_monoid_hom.mem_ker, char_p.int_cast_eq_zero_iff (zmod k) k,
498+
add_monoid_hom.coe_mk, int.coe_cast_add_hom] at hi ⊢,
499+
obtain ⟨i, rfl⟩ := hi,
500+
simp only [gpow_mul, h.pow_eq_one, one_gpow, gpow_coe_nat],
501+
refl
502+
end)⟩)
497503
begin
498-
simp only [add_monoid_hom.mem_ker, char_p.int_cast_eq_zero_iff (zmod k) k,
499-
add_monoid_hom.coe_mk, int.coe_cast_add_hom] at hi ⊢,
500-
obtain ⟨i, rfl⟩ := hi,
501-
simp only [gpow_mul, h.pow_eq_one, one_gpow, gpow_coe_nat],
502-
refl
503-
end)) $
504-
begin
505-
split,
506-
{ rw add_monoid_hom.injective_iff,
507-
intros i hi,
508-
rw subtype.ext_iff at hi,
509-
have := (h.gpow_eq_one_iff_dvd _).mp hi,
510-
rw [← (char_p.int_cast_eq_zero_iff (zmod k) k _).mpr this, eq_comm],
511-
exact classical.some_spec (zmod.int_cast_surjective i) },
512-
{ rintro ⟨ξ, i, rfl⟩,
513-
refine ⟨int.cast_add_hom _ i, _⟩,
514-
rw [add_monoid_hom.lift_of_surjective_comp_apply],
515-
refl }
516-
end
504+
split,
505+
{ rw add_monoid_hom.injective_iff,
506+
intros i hi,
507+
rw subtype.ext_iff at hi,
508+
have := (h.gpow_eq_one_iff_dvd _).mp hi,
509+
rw [← (char_p.int_cast_eq_zero_iff (zmod k) k _).mpr this, eq_comm],
510+
exact zmod.int_cast_right_inverse i },
511+
{ rintro ⟨ξ, i, rfl⟩,
512+
refine ⟨int.cast_add_hom _ i, _⟩,
513+
rw [add_monoid_hom.lift_of_right_inverse_comp_apply],
514+
refl }
515+
end
517516

518517
@[simp] lemma zmod_equiv_gpowers_apply_coe_int (i : ℤ) :
519518
h.zmod_equiv_gpowers i = additive.of_mul (⟨ζ ^ i, i, rfl⟩ : subgroup.gpowers ζ) :=
520-
begin
521-
apply add_monoid_hom.lift_of_surjective_comp_apply,
522-
intros j hj,
523-
simp only [add_monoid_hom.mem_ker, char_p.int_cast_eq_zero_iff (zmod k) k,
524-
add_monoid_hom.coe_mk, int.coe_cast_add_hom] at hj ⊢,
525-
obtain ⟨j, rfl⟩ := hj,
526-
simp only [gpow_mul, h.pow_eq_one, one_gpow, gpow_coe_nat],
527-
refl
528-
end
519+
add_monoid_hom.lift_of_right_inverse_comp_apply _ _ zmod.int_cast_right_inverse _ _
529520

530521
@[simp] lemma zmod_equiv_gpowers_apply_coe_nat (i : ℕ) :
531522
h.zmod_equiv_gpowers i = additive.of_mul (⟨ζ ^ i, i, rfl⟩ : subgroup.gpowers ζ) :=

src/ring_theory/witt_vector/truncated.lean

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ variable [comm_ring R]
198198

199199
lemma truncate_fun_surjective :
200200
surjective (@truncate_fun p n R) :=
201-
λ x, ⟨x.out, truncated_witt_vector.truncate_fun_out x⟩
201+
function.right_inverse.surjective truncated_witt_vector.truncate_fun_out
202202

203203
include hp
204204

@@ -300,24 +300,22 @@ A ring homomorphism that truncates a truncated Witt vector of length `m` to
300300
a truncated Witt vector of length `n`, for `n ≤ m`.
301301
-/
302302
def truncate {m : ℕ} (hm : n ≤ m) : truncated_witt_vector p m R →+* truncated_witt_vector p n R :=
303-
ring_hom.lift_of_surjective
304-
(witt_vector.truncate m)
305-
(witt_vector.truncate_surjective p m R)
306-
(witt_vector.truncate n)
303+
ring_hom.lift_of_right_inverse (witt_vector.truncate m) out truncate_fun_out
304+
⟨witt_vector.truncate n,
307305
begin
308306
intro x,
309307
simp only [witt_vector.mem_ker_truncate],
310308
intros h i hi,
311309
exact h i (lt_of_lt_of_le hi hm)
312-
end
310+
end
313311

314312
@[simp] lemma truncate_comp_witt_vector_truncate {m : ℕ} (hm : n ≤ m) :
315313
(@truncate p _ n R _ m hm).comp (witt_vector.truncate m) = witt_vector.truncate n :=
316-
ring_hom.lift_of_surjective_comp _ _ _ _
314+
ring_hom.lift_of_right_inverse_comp _ _ _ _
317315

318316
@[simp] lemma truncate_witt_vector_truncate {m : ℕ} (hm : n ≤ m) (x : 𝕎 R) :
319317
truncate hm (witt_vector.truncate m x) = witt_vector.truncate n x :=
320-
ring_hom.lift_of_surjective_comp_apply _ _ _ _ _
318+
ring_hom.lift_of_right_inverse_comp_apply _ _ _ _ _
321319

322320
@[simp] lemma truncate_truncate {n₁ n₂ n₃ : ℕ} (h1 : n₁ ≤ n₂) (h2 : n₂ ≤ n₃)
323321
(x : truncated_witt_vector p n₃ R) :

0 commit comments

Comments
 (0)