Theorem: PerfectClosure.frobenius_mk
File: Mathlib/FieldTheory/PerfectClosure.lean

tactic: simp only [frobenius_def]
state_before: K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
x : ℕ × K
⊢ ↑(frobenius (PerfectClosure K p) p) (mk K p x) = mk K p (x.fst, x.snd ^ p)

tactic: cases' x with n x
state_before: K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
x : ℕ × K
⊢ mk K p x ^ p = mk K p (x.fst, x.snd ^ p)

tactic: dsimp only
state_before: case mk
K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
n : ℕ
x : K
⊢ mk K p (n, x) ^ p = mk K p ((n, x).fst, (n, x).snd ^ p)

tactic: suffices ∀ p' : ℕ, mk K p (n, x) ^ p' = mk K p (n, x ^ p') by apply this
state_before: case mk
K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
n : ℕ
x : K
⊢ mk K p (n, x) ^ p = mk K p (n, x ^ p)

tactic: intro p
state_before: case mk
K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
n : ℕ
x : K
⊢ ∀ (p' : ℕ), mk K p (n, x) ^ p' = mk K p (n, x ^ p')

tactic: induction' p with p ih
state_before: case mk
K : Type u
inst✝² : CommRing K
p✝ : ℕ
inst✝¹ : Fact (Nat.Prime p✝)
inst✝ : CharP K p✝
n : ℕ
x : K
p : ℕ
⊢ mk K p✝ (n, x) ^ p = mk K p✝ (n, x ^ p)

tactic: case zero => apply R.sound; rw [(frobenius _ _).iterate_map_one, pow_zero]
state_before: case mk.zero
K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
n : ℕ
x : K
⊢ mk K p (n, x) ^ Nat.zero = mk K p (n, x ^ Nat.zero)

case mk.succ
K : Type u
inst✝² : CommRing K
p✝ : ℕ
inst✝¹ : Fact (Nat.Prime p✝)
inst✝ : CharP K p✝
n : ℕ
x : K
p : ℕ
ih : mk K p✝ (n, x) ^ p = mk K p✝ (n, x ^ p)
⊢ mk K p✝ (n, x) ^ Nat.succ p = mk K p✝ (n, x ^ Nat.succ p)

tactic: case succ =>
  rw [pow_succ, ih]
  symm
  apply R.sound
  simp only [pow_succ, (frobenius _ _).iterate_map_mul]
state_before: case mk.succ
K : Type u
inst✝² : CommRing K
p✝ : ℕ
inst✝¹ : Fact (Nat.Prime p✝)
inst✝ : CharP K p✝
n : ℕ
x : K
p : ℕ
ih : mk K p✝ (n, x) ^ p = mk K p✝ (n, x ^ p)
⊢ mk K p✝ (n, x) ^ Nat.succ p = mk K p✝ (n, x ^ Nat.succ p)

tactic: apply this
state_before: K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
n : ℕ
x : K
this : ∀ (p' : ℕ), mk K p (n, x) ^ p' = mk K p (n, x ^ p')
⊢ mk K p (n, x) ^ p = mk K p (n, x ^ p)

tactic: apply R.sound
state_before: K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
n : ℕ
x : K
⊢ mk K p (n, x) ^ Nat.zero = mk K p (n, x ^ Nat.zero)

tactic: rw [(frobenius _ _).iterate_map_one, pow_zero]
state_before: case H
K : Type u
inst✝² : CommRing K
p : ℕ
inst✝¹ : Fact (Nat.Prime p)
inst✝ : CharP K p
n : ℕ
x : K
⊢ (↑(frobenius K p)^[n]) 1 = x ^ Nat.zero

tactic: rw [pow_succ, ih]
state_before: K : Type u
inst✝² : CommRing K
p✝ : ℕ
inst✝¹ : Fact (Nat.Prime p✝)
inst✝ : CharP K p✝
n : ℕ
x : K
p : ℕ
ih : mk K p✝ (n, x) ^ p = mk K p✝ (n, x ^ p)
⊢ mk K p✝ (n, x) ^ Nat.succ p = mk K p✝ (n, x ^ Nat.succ p)

tactic: symm
state_before: K : Type u
inst✝² : CommRing K
p✝ : ℕ
inst✝¹ : Fact (Nat.Prime p✝)
inst✝ : CharP K p✝
n : ℕ
x : K
p : ℕ
ih : mk K p✝ (n, x) ^ p = mk K p✝ (n, x ^ p)
⊢ mk K p✝ (n, x) * mk K p✝ (n, x ^ p) = mk K p✝ (n, x ^ Nat.succ p)

tactic: apply R.sound
state_before: K : Type u
inst✝² : CommRing K
p✝ : ℕ
inst✝¹ : Fact (Nat.Prime p✝)
inst✝ : CharP K p✝
n : ℕ
x : K
p : ℕ
ih : mk K p✝ (n, x) ^ p = mk K p✝ (n, x ^ p)
⊢ mk K p✝ (n, x ^ Nat.succ p) = mk K p✝ (n, x) * mk K p✝ (n, x ^ p)

tactic: simp only [pow_succ, (frobenius _ _).iterate_map_mul]
state_before: case H
K : Type u
inst✝² : CommRing K
p✝ : ℕ
inst✝¹ : Fact (Nat.Prime p✝)
inst✝ : CharP K p✝
n : ℕ
x : K
p : ℕ
ih : mk K p✝ (n, x) ^ p = mk K p✝ (n, x ^ p)
⊢ (↑(frobenius K p✝)^[(n, x).fst]) (x ^ Nat.succ p) =
    (↑(frobenius K p✝)^[(n, x ^ p).fst]) (n, x).snd * (↑(frobenius K p✝)^[(n, x).fst]) (n, x ^ p).snd