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

Commit 0ed425f

Browse files
committed
feat(ring_theory/perfection): define characteristic predicate of perfection (#5386)
Name changes: - `perfect_field` --> `perfect_ring` (generalization) - `semiring.perfection` --> `ring.perfection` - Original `ring.perfection` deleted.
1 parent 96a2aa1 commit 0ed425f

File tree

2 files changed

+180
-57
lines changed

2 files changed

+180
-57
lines changed

src/field_theory/perfect_closure.lean

Lines changed: 56 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,65 +18,82 @@ open function
1818

1919
section defs
2020

21-
variables (K : Type u) [field K] (p : ℕ) [fact p.prime] [char_p K p]
21+
variables (R : Type u) [comm_semiring R] (p : ℕ) [fact p.prime] [char_p R p]
2222

23-
/-- A perfect field is a field of characteristic p that has p-th root. -/
24-
class perfect_field (K : Type u) [field K] (p : ℕ) [fact p.prime] [char_p K p] : Type u :=
25-
(pth_root' : K → K)
26-
(frobenius_pth_root' : ∀ x, frobenius K p (pth_root' x) = x)
23+
/-- A perfect ring is a ring of characteristic p that has p-th root. -/
24+
class perfect_ring : Type u :=
25+
(pth_root' : R → R)
26+
(frobenius_pth_root' : ∀ x, frobenius R p (pth_root' x) = x)
27+
(pth_root_frobenius' : ∀ x, pth_root' (frobenius R p x) = x)
2728

28-
/-- Frobenius automorphism of a perfect field. -/
29-
def frobenius_equiv [perfect_field K p] : K ≃+* K :=
30-
{ inv_fun := perfect_field.pth_root' p,
31-
left_inv := λ x, frobenius_inj K p $ perfect_field.frobenius_pth_root' _,
32-
right_inv := perfect_field.frobenius_pth_root',
33-
.. frobenius K p }
29+
/-- Frobenius automorphism of a perfect ring. -/
30+
def frobenius_equiv [perfect_ring R p] : R ≃+* R :=
31+
{ inv_fun := perfect_ring.pth_root' p,
32+
left_inv := perfect_ring.pth_root_frobenius',
33+
right_inv := perfect_ring.frobenius_pth_root',
34+
.. frobenius R p }
3435

35-
/-- `p`-th root of a number in a `perfect_field` as a `ring_hom`. -/
36-
def pth_root [perfect_field K p] : K →+* K :=
37-
(frobenius_equiv K p).symm.to_ring_hom
36+
/-- `p`-th root of an element in a `perfect_ring` as a `ring_hom`. -/
37+
def pth_root [perfect_ring R p] : R →+* R :=
38+
(frobenius_equiv R p).symm
3839

3940
end defs
4041

4142
section
4243

43-
variables {K : Type u} [field K] {L : Type v} [field L] (f : K →* L) (g : K →+* L)
44-
{p : ℕ} [fact p.prime] [char_p K p] [perfect_field K p] [char_p L p] [perfect_field L p]
44+
variables {R : Type u} [comm_semiring R] {S : Type v} [comm_semiring S] (f : R →* S) (g : R →+* S)
45+
{p : ℕ} [fact p.prime] [char_p R p] [perfect_ring R p] [char_p S p] [perfect_ring S p]
4546

46-
@[simp] lemma coe_frobenius_equiv : ⇑(frobenius_equiv K p) = frobenius K p := rfl
47+
@[simp] lemma coe_frobenius_equiv : ⇑(frobenius_equiv R p) = frobenius R p := rfl
4748

48-
@[simp] lemma coe_frobenius_equiv_symm : ⇑(frobenius_equiv K p).symm = pth_root K p := rfl
49+
@[simp] lemma coe_frobenius_equiv_symm : ⇑(frobenius_equiv R p).symm = pth_root R p := rfl
4950

50-
@[simp] theorem frobenius_pth_root (x : K) : frobenius K p (pth_root K p x) = x :=
51-
(frobenius_equiv K p).apply_symm_apply x
51+
@[simp] theorem frobenius_pth_root (x : R) : frobenius R p (pth_root R p x) = x :=
52+
(frobenius_equiv R p).apply_symm_apply x
5253

53-
@[simp] theorem pth_root_frobenius (x : K) : pth_root K p (frobenius K p x) = x :=
54-
(frobenius_equiv K p).symm_apply_apply x
54+
@[simp] theorem pth_root_pow_p (x : R) : pth_root R p x ^ p = x :=
55+
frobenius_pth_root x
5556

56-
theorem left_inverse_pth_root_frobenius : left_inverse (pth_root K p) (frobenius K p) :=
57+
@[simp] theorem pth_root_frobenius (x : R) : pth_root R p (frobenius R p x) = x :=
58+
(frobenius_equiv R p).symm_apply_apply x
59+
60+
@[simp] theorem pth_root_pow_p' (x : R) : pth_root R p (x ^ p) = x :=
61+
pth_root_frobenius x
62+
63+
theorem left_inverse_pth_root_frobenius : left_inverse (pth_root R p) (frobenius R p) :=
5764
pth_root_frobenius
5865

59-
theorem eq_pth_root_iff {x y : K} : x = pth_root K p y ↔ frobenius K p x = y :=
60-
(frobenius_equiv K p).to_equiv.eq_symm_apply
66+
theorem right_inverse_pth_root_frobenius : function.right_inverse (pth_root R p) (frobenius R p) :=
67+
frobenius_pth_root
68+
69+
theorem commute_frobenius_pth_root : function.commute (frobenius R p) (pth_root R p) :=
70+
λ x, (frobenius_pth_root x).trans (pth_root_frobenius x).symm
6171

62-
theorem pth_root_eq_iff {x y : K} : pth_root K p x = y ↔ x = frobenius K p y :=
63-
(frobenius_equiv K p).to_equiv.symm_apply_eq
72+
theorem eq_pth_root_iff {x y : R} : x = pth_root R p y ↔ frobenius R p x = y :=
73+
(frobenius_equiv R p).to_equiv.eq_symm_apply
6474

65-
theorem monoid_hom.map_pth_root (x : K) : f (pth_root K p x) = pth_root L p (f x) :=
75+
theorem pth_root_eq_iff {x y : R} : pth_root R p x = y ↔ x = frobenius R p y :=
76+
(frobenius_equiv R p).to_equiv.symm_apply_eq
77+
78+
theorem monoid_hom.map_pth_root (x : R) : f (pth_root R p x) = pth_root S p (f x) :=
6679
eq_pth_root_iff.2 $ by rw [← f.map_frobenius, frobenius_pth_root]
6780

68-
theorem monoid_hom.map_iterate_pth_root (x : K) (n : ℕ) :
69-
f (pth_root K p^[n] x) = (pth_root L p^[n] (f x)) :=
81+
theorem monoid_hom.map_iterate_pth_root (x : R) (n : ℕ) :
82+
f (pth_root R p^[n] x) = (pth_root S p^[n] (f x)) :=
7083
semiconj.iterate_right f.map_pth_root n x
7184

72-
theorem ring_hom.map_pth_root (x : K) :
73-
g (pth_root K p x) = pth_root L p (g x) :=
85+
theorem ring_hom.map_pth_root (x : R) :
86+
g (pth_root R p x) = pth_root S p (g x) :=
7487
g.to_monoid_hom.map_pth_root x
7588

76-
theorem ring_hom.map_iterate_pth_root (x : K) (n : ℕ) :
77-
g (pth_root K p^[n] x) = (pth_root L p^[n] (g x)) :=
89+
theorem ring_hom.map_iterate_pth_root (x : R) (n : ℕ) :
90+
g (pth_root R p^[n] x) = (pth_root S p^[n] (g x)) :=
7891
g.to_monoid_hom.map_iterate_pth_root x n
7992

93+
variables (p)
94+
lemma injective_pow_p {x y : R} (hxy : x ^ p = y ^ p) : x = y :=
95+
left_inverse_pth_root_frobenius.injective hxy
96+
8097
end
8198

8299
section
@@ -361,12 +378,14 @@ instance : field (perfect_closure K p) :=
361378
.. (infer_instance : comm_ring (perfect_closure K p)) }
362379

363380

364-
instance : perfect_field (perfect_closure K p) p :=
381+
instance : perfect_ring (perfect_closure K p) p :=
365382
{ pth_root' := λ e, lift_on e (λ x, mk K p (x.1 + 1, x.2)) (λ x y H,
366383
match x, y, H with
367384
| _, _, r.intro n x := quot.sound (r.intro _ _)
368385
end),
369386
frobenius_pth_root' := λ e, induction_on e (λ ⟨n, x⟩,
387+
by { simp only [lift_on_mk, frobenius_mk], exact (quot.sound $ r.intro _ _).symm }),
388+
pth_root_frobenius' := λ e, induction_on e (λ ⟨n, x⟩,
370389
by { simp only [lift_on_mk, frobenius_mk], exact (quot.sound $ r.intro _ _).symm }) }
371390

372391
theorem eq_pth_root (x : ℕ × K) :
@@ -377,9 +396,9 @@ begin
377396
rw [iterate_succ_apply', ← ih]; refl
378397
end
379398

380-
/-- Given a field `K` of characteristic `p` and a perfect field `L` of the same characteristic,
399+
/-- Given a field `K` of characteristic `p` and a perfect ring `L` of the same characteristic,
381400
any homomorphism `K →+* L` can be lifted to `perfect_closure K p`. -/
382-
def lift (L : Type v) [field L] [char_p L p] [perfect_field L p] :
401+
def lift (L : Type v) [comm_semiring L] [char_p L p] [perfect_ring L p] :
383402
(K →+* L) ≃ (perfect_closure K p →+* L) :=
384403
begin
385404
have := left_inverse_pth_root_frobenius.iterate,

src/ring_theory/perfection.lean

Lines changed: 124 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,19 @@ def monoid.perfection (M : Type u₁) [comm_monoid M] (p : ℕ) : submonoid (ℕ
3636
one_mem' := λ n, one_pow _,
3737
mul_mem' := λ f g hf hg n, (mul_pow _ _ _).trans $ congr_arg2 _ (hf n) (hg n) }
3838

39-
/-- The perfection of a semiring `R` with characteristic `p`,
39+
/-- The perfection of a ring `R` with characteristic `p`,
4040
defined to be the projective limit of `R` using the Frobenius maps `R → R`
4141
indexed by the natural numbers, implemented as `{ f : ℕ → R | ∀ n, f (n + 1) ^ p = f n }`. -/
42-
def semiring.perfection (R : Type u₁) [comm_semiring R]
42+
def ring.perfection (R : Type u₁) [comm_semiring R]
4343
(p : ℕ) [hp : fact p.prime] [char_p R p] :
4444
subsemiring (ℕ → R) :=
4545
{ zero_mem' := λ n, zero_pow $ hp.pos,
4646
add_mem' := λ f g hf hg n, (frobenius_add R p _ _).trans $ congr_arg2 _ (hf n) (hg n),
4747
.. monoid.perfection R p }
4848

49-
/-- The perfection of a ring `R` with characteristic `p`,
50-
defined to be the projective limit of `R` using the Frobenius maps `R → R`
51-
indexed by the natural numbers, implemented as `{ f : ℕ → R | ∀ n, f (n + 1) ^ p = f n }`. -/
52-
def ring.perfection (R : Type u₁) [comm_ring R] (p : ℕ) [hp : fact p.prime] [char_p R p] :
53-
subring (ℕ → R) :=
54-
{ neg_mem' := λ f hf n, (frobenius_neg R p _).trans $ congr_arg _ (hf n),
55-
.. semiring.perfection R p }
56-
57-
namespace ring.perfection
49+
namespace perfection
5850

59-
variables (R : Type u₁) [comm_ring R] (p : ℕ) [hp : fact p.prime] [char_p R p]
51+
variables (R : Type u₁) [comm_semiring R] (p : ℕ) [hp : fact p.prime] [char_p R p]
6052
include hp
6153

6254
/-- The `n`-th coefficient of an element of the perfection. -/
@@ -84,6 +76,8 @@ def pth_root : ring.perfection R p →+* ring.perfection R p :=
8476

8577
variables {R p}
8678

79+
@[simp] lemma coeff_mk (f : ℕ → R) (hf) (n : ℕ) : coeff R p n ⟨f, hf⟩ = f n := rfl
80+
8781
lemma coeff_pth_root (f : ring.perfection R p) (n : ℕ) :
8882
coeff R p n (pth_root R p f) = coeff R p (n + 1) f :=
8983
rfl
@@ -96,6 +90,14 @@ lemma coeff_frobenius (f : ring.perfection R p) (n : ℕ) :
9690
coeff R p (n + 1) (frobenius _ p f) = coeff R p n f :=
9791
by convert coeff_pow_p f n
9892

93+
lemma coeff_iterate_frobenius (f : ring.perfection R p) (n m : ℕ) :
94+
coeff R p (n + m) (frobenius _ p ^[m] f) = coeff R p n f :=
95+
nat.rec_on m rfl $ λ m ih, by erw [function.iterate_succ_apply', coeff_frobenius, ih]
96+
97+
lemma coeff_iterate_frobenius' (f : ring.perfection R p) (n m : ℕ) (hmn : m ≤ n) :
98+
coeff R p n (frobenius _ p ^[m] f) = coeff R p (n - m) f :=
99+
eq.symm $ (coeff_iterate_frobenius _ _ m).symm.trans $ (nat.sub_add_cancel hmn).symm ▸ rfl
100+
99101
lemma pth_root_frobenius : (pth_root R p).comp (frobenius _ p) = ring_hom.id _ :=
100102
ring_hom.ext $ λ x, ext $ λ n,
101103
by rw [ring_hom.comp_apply, ring_hom.id_apply, coeff_pth_root, coeff_frobenius]
@@ -113,7 +115,106 @@ lemma coeff_ne_zero_of_le {f : ring.perfection R p} {m n : ℕ} (hfm : coeff R p
113115
(hmn : m ≤ n) : coeff R p n f ≠ 0 :=
114116
let ⟨k, hk⟩ := nat.exists_eq_add_of_le hmn in hk.symm ▸ coeff_add_ne_zero hfm k
115117

116-
end ring.perfection
118+
variables (R p)
119+
120+
instance perfect_ring : perfect_ring (ring.perfection R p) p :=
121+
{ pth_root' := pth_root R p,
122+
frobenius_pth_root' := congr_fun $ congr_arg ring_hom.to_fun $ @frobenius_pth_root R _ p _ _,
123+
pth_root_frobenius' := congr_fun $ congr_arg ring_hom.to_fun $ @pth_root_frobenius R _ p _ _ }
124+
125+
instance ring (R : Type u₁) [comm_ring R] [char_p R p] : ring (ring.perfection R p) :=
126+
((ring.perfection R p).to_subring $ λ n, by simp_rw [← frobenius_def, pi.neg_apply,
127+
pi.one_apply, ring_hom.map_neg, ring_hom.map_one]).to_ring
128+
129+
instance comm_ring (R : Type u₁) [comm_ring R] [char_p R p] : comm_ring (ring.perfection R p) :=
130+
((ring.perfection R p).to_subring $ λ n, by simp_rw [← frobenius_def, pi.neg_apply,
131+
pi.one_apply, ring_hom.map_neg, ring_hom.map_one]).to_comm_ring
132+
133+
/-- Given rings `R` and `S` of characteristic `p`, with `R` being perfect,
134+
any homomorphism `R →+* S` can be lifted to a homomorphism `R →+* perfection S p`. -/
135+
@[simps] def lift (R : Type u₁) [comm_semiring R] [char_p R p] [perfect_ring R p]
136+
(S : Type u₂) [comm_semiring S] [char_p S p] :
137+
(R →+* S) ≃ (R →+* ring.perfection S p) :=
138+
{ to_fun := λ f,
139+
{ to_fun := λ r, ⟨λ n, f $ _root_.pth_root R p ^[n] r,
140+
λ n, by rw [← f.map_pow, function.iterate_succ_apply', pth_root_pow_p]⟩,
141+
map_one' := ext $ λ n, (congr_arg f $ ring_hom.iterate_map_one _ _).trans f.map_one,
142+
map_mul' := λ x y, ext $ λ n, (congr_arg f $ ring_hom.iterate_map_mul _ _ _ _).trans $
143+
f.map_mul _ _,
144+
map_zero' := ext $ λ n, (congr_arg f $ ring_hom.iterate_map_zero _ _).trans f.map_zero,
145+
map_add' := λ x y, ext $ λ n, (congr_arg f $ ring_hom.iterate_map_add _ _ _ _).trans $
146+
f.map_add _ _ },
147+
inv_fun := ring_hom.comp $ coeff S p 0,
148+
left_inv := λ f, ring_hom.ext $ λ r, rfl,
149+
right_inv := λ f, ring_hom.ext $ λ r, ext $ λ n,
150+
show coeff S p 0 (f (_root_.pth_root R p ^[n] r)) = coeff S p n (f r),
151+
by rw [← coeff_iterate_frobenius _ 0 n, zero_add, ← ring_hom.map_iterate_frobenius,
152+
right_inverse_pth_root_frobenius.iterate] }
153+
154+
end perfection
155+
156+
/-- A perfection map to a ring of characteristic `p` is a map that is isomorphic
157+
to its perfection. -/
158+
@[nolint has_inhabited_instance] structure perfection_map (p : ℕ) [fact p.prime]
159+
{R : Type u₁} [comm_semiring R] [char_p R p]
160+
{P : Type u₂} [comm_semiring P] [char_p P p] [perfect_ring P p] (π : P →+* R) : Prop :=
161+
(injective : ∀ ⦃x y : P⦄, (∀ n, π (pth_root P p ^[n] x) = π (pth_root P p ^[n] y)) → x = y)
162+
(surjective : ∀ f : ℕ → R, (∀ n, f (n + 1) ^ p = f n) →
163+
∃ x : P, ∀ n, π (pth_root P p ^[n] x) = f n)
164+
165+
namespace perfection_map
166+
167+
variables {p : ℕ} [fact p.prime]
168+
variables {R : Type u₁} [comm_semiring R] [char_p R p]
169+
variables {P : Type u₂} [comm_semiring P] [char_p P p] [perfect_ring P p]
170+
171+
/-- Create a `perfection_map` from an isomorphism to the perfection. -/
172+
@[simps] lemma mk' {f : P →+* R} (g : P ≃+* ring.perfection R p)
173+
(hfg : perfection.lift p P R f = g) :
174+
perfection_map p f :=
175+
{ injective := λ x y hxy, g.injective $ (ring_hom.ext_iff.1 hfg x).symm.trans $
176+
eq.symm $ (ring_hom.ext_iff.1 hfg y).symm.trans $ perfection.ext $ λ n, (hxy n).symm,
177+
surjective := λ y hy, let ⟨x, hx⟩ := g.surjective ⟨y, hy⟩ in
178+
⟨x, λ n, show perfection.coeff R p n (perfection.lift p P R f x) =
179+
perfection.coeff R p n ⟨y, hy⟩,
180+
by rw [hfg, ← coe_fn_coe_base, hx]⟩ }
181+
182+
variables (p R P)
183+
184+
/-- The canonical perfection map from the perfection of a ring. -/
185+
lemma of : perfection_map p (perfection.coeff R p 0) :=
186+
mk' (ring_equiv.refl _) $ (equiv.apply_eq_iff_eq_symm_apply _).2 rfl
187+
188+
/-- For a perfect ring, it itself is the perfection. -/
189+
lemma id [perfect_ring R p] : perfection_map p (ring_hom.id R) :=
190+
{ injective := λ x y hxy, hxy 0,
191+
surjective := λ f hf, ⟨f 0, λ n, show pth_root R p ^[n] (f 0) = f n,
192+
from nat.rec_on n rfl $ λ n ih, injective_pow_p p $
193+
by rw [function.iterate_succ_apply', pth_root_pow_p _, ih, hf]⟩ }
194+
195+
variables {p R P}
196+
/-- A perfection map induces an isomorphism to the prefection. -/
197+
noncomputable def equiv {π : P →+* R} (m : perfection_map p π) : P ≃+* ring.perfection R p :=
198+
ring_equiv.of_bijective (perfection.lift p P R π)
199+
⟨λ x y hxy, m.injective $ λ n, (congr_arg (perfection.coeff R p n) hxy : _),
200+
λ f, let ⟨x, hx⟩ := m.surjective f.1 f.2 in ⟨x, perfection.ext $ hx⟩⟩
201+
202+
variables (p R P)
203+
/-- Given rings `R` and `S` of characteristic `p`, with `R` being perfect,
204+
any homomorphism `R →+* S` can be lifted to a homomorphism `R →+* P`,
205+
where `P` is any perfection of `S`. -/
206+
@[simps] noncomputable def lift [perfect_ring R p] (S : Type u₂) [comm_semiring S] [char_p S p]
207+
(P : Type u₃) [comm_semiring P] [char_p P p] [perfect_ring P p]
208+
(π : P →+* S) (m : perfection_map p π) :
209+
(R →+* S) ≃ (R →+* P) :=
210+
{ to_fun := λ f, ring_hom.comp ↑m.equiv.symm $ perfection.lift p R S f,
211+
inv_fun := λ f, (perfection.lift p R S).symm (ring_hom.comp ↑m.equiv f),
212+
left_inv := λ f, (equiv.symm_apply_eq _).2 $ ring_hom.ext $ λ x,
213+
by simp_rw [ring_hom.comp_apply, ring_equiv.coe_ring_hom, ring_equiv.apply_symm_apply],
214+
right_inv := λ f, ring_hom.ext $ λ x, by simp_rw [equiv.apply_symm_apply,
215+
ring_hom.comp_apply, ring_equiv.coe_ring_hom, ring_equiv.symm_apply_apply] }
216+
217+
end perfection_map
117218

118219
section perfectoid
119220

@@ -239,10 +340,13 @@ ring.perfection (mod_p K v O hv p) p
239340

240341
namespace pre_tilt
241342

343+
instance : comm_ring (pre_tilt K v O hv p) :=
344+
perfection.comm_ring p _
345+
242346
section classical
243347
local attribute [instance] classical.dec
244348

245-
open ring.perfection
349+
open perfection
246350

247351
/-- The valuation `Perfection(O/(p)) → ℝ≥0` as a function.
248352
Given `f ∈ Perfection(O/(p))`, if `f = 0` then output `0`;
@@ -287,8 +391,8 @@ lemma val_aux_mul (f g : pre_tilt K v O hv p) :
287391
begin
288392
by_cases hf : f = 0, { rw [hf, zero_mul, val_aux_zero, zero_mul] },
289393
by_cases hg : g = 0, { rw [hg, mul_zero, val_aux_zero, mul_zero] },
290-
replace hf : ∃ n, coeff _ _ n f ≠ 0 := not_forall.1 (λ h, hf $ ring.perfection.ext h),
291-
replace hg : ∃ n, coeff _ _ n g ≠ 0 := not_forall.1 (λ h, hg $ ring.perfection.ext h),
394+
replace hf : ∃ n, coeff _ _ n f ≠ 0 := not_forall.1 (λ h, hf $ perfection.ext h),
395+
replace hg : ∃ n, coeff _ _ n g ≠ 0 := not_forall.1 (λ h, hg $ perfection.ext h),
292396
obtain ⟨m, hm⟩ := hf, obtain ⟨n, hn⟩ := hg,
293397
replace hm := coeff_ne_zero_of_le hm (le_max_left m n),
294398
replace hn := coeff_ne_zero_of_le hn (le_max_right m n),
@@ -305,9 +409,9 @@ begin
305409
by_cases hf : f = 0, { rw [hf, zero_add, val_aux_zero, max_eq_right], exact zero_le _ },
306410
by_cases hg : g = 0, { rw [hg, add_zero, val_aux_zero, max_eq_left], exact zero_le _ },
307411
by_cases hfg : f + g = 0, { rw [hfg, val_aux_zero], exact zero_le _ },
308-
replace hf : ∃ n, coeff _ _ n f ≠ 0 := not_forall.1 (λ h, hf $ ring.perfection.ext h),
309-
replace hg : ∃ n, coeff _ _ n g ≠ 0 := not_forall.1 (λ h, hg $ ring.perfection.ext h),
310-
replace hfg : ∃ n, coeff _ _ n (f + g) ≠ 0 := not_forall.1 (λ h, hfg $ ring.perfection.ext h),
412+
replace hf : ∃ n, coeff _ _ n f ≠ 0 := not_forall.1 (λ h, hf $ perfection.ext h),
413+
replace hg : ∃ n, coeff _ _ n g ≠ 0 := not_forall.1 (λ h, hg $ perfection.ext h),
414+
replace hfg : ∃ n, coeff _ _ n (f + g) ≠ 0 := not_forall.1 (λ h, hfg $ perfection.ext h),
311415
obtain ⟨m, hm⟩ := hf, obtain ⟨n, hn⟩ := hg, obtain ⟨k, hk⟩ := hfg,
312416
replace hm := coeff_ne_zero_of_le hm (le_trans (le_max_left m n) (le_max_left _ k)),
313417
replace hn := coeff_ne_zero_of_le hn (le_trans (le_max_right m n) (le_max_left _ k)),
@@ -334,7 +438,7 @@ variables {K v O hv p}
334438
lemma map_eq_zero {f : pre_tilt K v O hv p} : val K v O hv p f = 0 ↔ f = 0 :=
335439
begin
336440
by_cases hf0 : f = 0, { rw hf0, exact iff_of_true (valuation.map_zero _) rfl },
337-
obtain ⟨n, hn⟩ : ∃ n, coeff _ _ n f ≠ 0 := not_forall.1 (λ h, hf0 $ ring.perfection.ext h),
441+
obtain ⟨n, hn⟩ : ∃ n, coeff _ _ n f ≠ 0 := not_forall.1 (λ h, hf0 $ perfection.ext h),
338442
show val_aux K v O hv p f = 0 ↔ f = 0, refine iff_of_false (λ hvf, hn _) hf0,
339443
rw val_aux_eq hn at hvf, replace hvf := nnreal.pow_eq_zero hvf, rwa mod_p.pre_val_eq_zero at hvf
340444
end

0 commit comments

Comments
 (0)