Skip to content

Commit 509f708

Browse files
feat(RingTheory/Perfection): lemmas for frobeniusEquiv.symm (#26386)
This PR continues the work from #22330. Original PR: #22330 Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Jiedong Jiang <emailboxofjjd@163.com> Co-authored-by: jjdishere <emailboxofjjd@163.com>
1 parent 362d141 commit 509f708

File tree

3 files changed

+116
-3
lines changed

3 files changed

+116
-3
lines changed

Mathlib/FieldTheory/Perfect.lean

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,18 @@ theorem frobeniusEquiv_symm_comp_frobenius :
150150
((frobeniusEquiv R p).symm : R →+* R).comp (frobenius R p) = RingHom.id R := by
151151
ext; simp
152152

153+
@[simp]
154+
theorem coe_frobenius_comp_coe_frobeniusEquiv_symm :
155+
⇑(frobenius R p) ∘ ⇑(frobeniusEquiv R p).symm = id := by
156+
ext
157+
simp
158+
159+
@[simp]
160+
theorem coe_frobeniusEquiv_symm_comp_coe_frobenius :
161+
⇑(frobeniusEquiv R p).symm ∘ ⇑(frobenius R p) = id := by
162+
ext
163+
simp
164+
153165
@[simp]
154166
theorem frobeniusEquiv_symm_pow_p (x : R) : ((frobeniusEquiv R p).symm x) ^ p = x :=
155167
frobenius_apply_frobeniusEquiv_symm R p x
@@ -161,6 +173,43 @@ theorem iterate_frobeniusEquiv_symm_pow_p_pow (x : R) (n : ℕ) :
161173
| zero => simp
162174
| succ n ih => simp [pow_succ, pow_mul, ih]
163175

176+
section commute
177+
178+
variable {R S : Type*} [CommSemiring R] [CommSemiring S] (p : ℕ)
179+
[ExpChar R p] [PerfectRing R p] [ExpChar S p] [PerfectRing S p]
180+
181+
/--
182+
The `(frobeniusEquiv R p).symm` version of `MonoidHom.map_frobenius`.
183+
`(frobeniusEquiv R p).symm` commute with any monoid homomorphisms.
184+
-/
185+
theorem MonoidHom.map_frobeniusEquiv_symm (f : R →* S) (x : R) :
186+
f ((frobeniusEquiv R p).symm x) = (frobeniusEquiv S p).symm (f x) := by
187+
apply_fun (frobeniusEquiv S p)
188+
simp [← MonoidHom.map_frobenius]
189+
190+
theorem RingHom.map_frobeniusEquiv_symm (f : R →+* S) (x : R) :
191+
f ((frobeniusEquiv R p).symm x) = (frobeniusEquiv S p).symm (f x) := by
192+
apply_fun (frobeniusEquiv S p)
193+
simp [← RingHom.map_frobenius]
194+
195+
theorem MonoidHom.map_iterate_frobeniusEquiv_symm (f : R →* S) (n : ℕ) (x : R) :
196+
f (((frobeniusEquiv R p).symm ^[n]) x) = ((frobeniusEquiv S p).symm ^[n]) (f x) := by
197+
apply_fun (frobeniusEquiv S p)^[n]
198+
· simp only [coe_frobeniusEquiv, ← map_iterate_frobenius]
199+
· rw [← Function.comp_apply (f := (⇑(frobenius R p))^[n]),
200+
← Function.comp_apply (f := (⇑(frobenius S p))^[n]),
201+
← Function.Commute.comp_iterate, ← Function.Commute.comp_iterate]
202+
· simp
203+
all_goals rw [← coe_frobeniusEquiv]; simp [Function.Commute, Function.Semiconj]
204+
apply Function.Injective.iterate
205+
simp
206+
207+
theorem RingHom.map_iterate_frobeniusEquiv_symm (f : R →+* S) (n : ℕ) (x : R) :
208+
f (((frobeniusEquiv R p).symm ^[n]) x) = ((frobeniusEquiv S p).symm ^[n]) (f x) :=
209+
MonoidHom.map_iterate_frobeniusEquiv_symm p (f.toMonoidHom) n x
210+
211+
end commute
212+
164213
theorem injective_pow_p {x y : R} (h : x ^ p = y ^ p) : x = y := (frobeniusEquiv R p).injective h
165214

166215
lemma polynomial_expand_eq (f : R[X]) :

Mathlib/RingTheory/Perfection.lean

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,24 @@ variable {R p}
106106
@[simp]
107107
theorem coeff_mk (f : ℕ → R) (hf) (n : ℕ) : coeff R p n ⟨f, hf⟩ = f n := rfl
108108

109+
@[simp]
109110
theorem coeff_pthRoot (f : Ring.Perfection R p) (n : ℕ) :
110111
coeff R p n (pthRoot R p f) = coeff R p (n + 1) f := rfl
111112

113+
@[simp]
112114
theorem coeff_pow_p (f : Ring.Perfection R p) (n : ℕ) :
113115
coeff R p (n + 1) (f ^ p) = coeff R p n f := by rw [RingHom.map_pow]; exact f.2 n
114116

117+
@[simp]
115118
theorem coeff_pow_p' (f : Ring.Perfection R p) (n : ℕ) : coeff R p (n + 1) f ^ p = coeff R p n f :=
116119
f.2 n
117120

121+
@[simp]
118122
theorem coeff_frobenius (f : Ring.Perfection R p) (n : ℕ) :
119123
coeff R p (n + 1) (frobenius _ p f) = coeff R p n f := by apply coeff_pow_p f n
120124

121125
-- `coeff_pow_p f n` also works but is slow!
126+
@[simp]
122127
theorem coeff_iterate_frobenius (f : Ring.Perfection R p) (n m : ℕ) :
123128
coeff R p (n + m) ((frobenius _ p)^[m] f) = coeff R p n f :=
124129
Nat.recOn m rfl fun m ih => by
@@ -128,10 +133,12 @@ theorem coeff_iterate_frobenius' (f : Ring.Perfection R p) (n m : ℕ) (hmn : m
128133
coeff R p n ((frobenius _ p)^[m] f) = coeff R p (n - m) f :=
129134
Eq.symm <| (coeff_iterate_frobenius _ _ m).symm.trans <| (tsub_add_cancel_of_le hmn).symm ▸ rfl
130135

136+
@[simp]
131137
theorem pthRoot_frobenius : (pthRoot R p).comp (frobenius _ p) = RingHom.id _ :=
132138
RingHom.ext fun x =>
133139
ext fun n => by rw [RingHom.comp_apply, RingHom.id_apply, coeff_pthRoot, coeff_frobenius]
134140

141+
@[simp]
135142
theorem frobenius_pthRoot : (frobenius _ p).comp (pthRoot R p) = RingHom.id _ :=
136143
RingHom.ext fun x =>
137144
ext fun n => by
@@ -149,14 +156,31 @@ theorem coeff_ne_zero_of_le {f : Ring.Perfection R p} {m n : ℕ} (hfm : coeff R
149156
let ⟨k, hk⟩ := Nat.exists_eq_add_of_le hmn
150157
hk.symm ▸ coeff_add_ne_zero hfm k
151158

152-
variable (R p)
153-
159+
variable (R p) in
154160
instance perfectRing : PerfectRing (Ring.Perfection R p) p where
155161
bijective_frobenius := Function.bijective_iff_has_inverse.mpr
156162
⟨pthRoot R p,
157163
DFunLike.congr_fun <| @frobenius_pthRoot R _ p _ _,
158164
DFunLike.congr_fun <| @pthRoot_frobenius R _ p _ _⟩
159165

166+
@[simp]
167+
theorem coeff_frobeniusEquiv_symm (f : Ring.Perfection R p) (n : ℕ) :
168+
Perfection.coeff R p n ((frobeniusEquiv (Ring.Perfection R p) p).symm f) =
169+
Perfection.coeff R p (n + 1) f := by
170+
nth_rw 2 [← frobenius_apply_frobeniusEquiv_symm _ p f]
171+
rw [coeff_frobenius]
172+
173+
@[simp]
174+
theorem coeff_iterate_frobeniusEquiv_symm (f : Ring.Perfection R p) (n m : ℕ) :
175+
Perfection.coeff _ p n ((frobeniusEquiv _ p).symm ^[m] f) =
176+
Perfection.coeff _ p (n + m) f := by
177+
induction m generalizing f n with
178+
| zero => simp
179+
| succ m ih =>
180+
simp [ih, ← add_assoc]
181+
182+
variable (R p)
183+
160184
/-- Given rings `R` and `S` of characteristic `p`, with `R` being perfect,
161185
any homomorphism `R →+* S` can be lifted to a homomorphism `R →+* Perfection S p`. -/
162186
@[simps]
@@ -323,7 +347,7 @@ section ModP
323347
variable (O : Type u₂) [CommRing O] (p : ℕ)
324348

325349
/-- `O/(p)` for `O`, ring of integers of `K`. -/
326-
def ModP :=
350+
abbrev ModP :=
327351
O ⧸ (Ideal.span {(p : O)} : Ideal O)
328352

329353
namespace ModP
@@ -456,6 +480,37 @@ instance : CommRing (PreTilt O p) :=
456480
instance : CharP (PreTilt O p) p :=
457481
Perfection.charP (ModP O p) p
458482

483+
instance : PerfectRing (PreTilt O p) p :=
484+
Perfection.perfectRing (ModP O p) p
485+
486+
section coeff
487+
488+
@[simp]
489+
theorem coeff_frobenius (n : ℕ) (x : PreTilt O p) :
490+
((Perfection.coeff (ModP O p) p (n + 1)) (((frobenius (PreTilt O p) p)) x)) =
491+
((Perfection.coeff (ModP O p) p n) x):= by
492+
simp [PreTilt]
493+
494+
@[simp]
495+
theorem coeff_frobenius_pow (m n : ℕ) (x : PreTilt O p) :
496+
((Perfection.coeff (ModP O p) p (m + n)) (((frobenius (PreTilt O p) p) ^[n]) x)) =
497+
((Perfection.coeff (ModP O p) p m) x):= by
498+
simp [PreTilt]
499+
500+
@[simp]
501+
theorem coeff_frobeniusEquiv_symm (n : ℕ) (x : PreTilt O p) :
502+
((Perfection.coeff (ModP O p) p n) (((frobeniusEquiv (PreTilt O p) p).symm) x)) =
503+
((Perfection.coeff (ModP O p) p (n + 1)) x):= by
504+
simp [PreTilt]
505+
506+
@[simp]
507+
theorem coeff_iterate_frobeniusEquiv_symm (m n : ℕ) (x : PreTilt O p) :
508+
((Perfection.coeff (ModP O p) p m) (((frobeniusEquiv (PreTilt O p) p).symm ^[n]) x)) =
509+
((Perfection.coeff (ModP O p) p (m + n)) x):= by
510+
simp [PreTilt]
511+
512+
end coeff
513+
459514
section Classical
460515

461516
open Perfection

Mathlib/RingTheory/Perfectoid/Untilt.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ def untilt : PreTilt O p →* O where
149149
The composition of the mod `p` map
150150
with the untilt function equals taking the zeroth component of the perfection.
151151
-/
152+
@[simp]
152153
theorem mk_untilt_eq_coeff_zero (x : PreTilt O p) :
153154
Ideal.Quotient.mk (Ideal.span {(p : O)}) (x.untilt) = coeff (ModP O p) p 0 x := by
154155
simp only [untilt]
@@ -160,10 +161,18 @@ The composition of the mod `p` map
160161
with the untilt function equals taking the zeroth component of the perfection.
161162
A variation of `PreTilt.mk_untilt_eq_coeff_zero`.
162163
-/
164+
@[simp]
163165
theorem mk_comp_untilt_eq_coeff_zero :
164166
Ideal.Quotient.mk (Ideal.span {(p : O)}) ∘ untilt = coeff (ModP O p) p 0 :=
165167
funext mk_untilt_eq_coeff_zero
166168

169+
@[simp]
170+
theorem untilt_iterate_frobeniusEquiv_symm_pow (x : PreTilt O p) (n : ℕ) :
171+
untilt (((frobeniusEquiv (PreTilt O p) p).symm ^[n]) x) ^ p ^ n = x.untilt := by
172+
simp only [← map_pow]
173+
congr
174+
simp
175+
167176
end IsAdicComplete
168177

169178
end PreTilt

0 commit comments

Comments
 (0)