-rw-r--r-- 1009 leangoppa-20230726/Goppadecoding/finite_perfect.lean raw
-- written by Riccardo Brasca, used with permission import Mathlib.FieldTheory.PerfectClosure import Mathlib.FieldTheory.Finite.Basic variable (K : Type _) [Field K] [Fintype K] (p : ℕ) [inst : CharP K p] theorem finite_field_is_perfect : have : Fact (Nat.Prime p) := ⟨CharP.char_is_prime K p⟩ Function.Surjective (frobenius K p) := by intro x obtain ⟨n, _, hn⟩ := FiniteField.card K p refine' ⟨x ^ (p ^ (n - 1)), _⟩ dsimp [frobenius] calc _ = x ^ (p ^ (↑n - 1) * p ^ 1) := by rw [← pow_mul, pow_one] _ = x ^ (p ^ (↑n - 1 + 1)) := by rw [pow_add] _ = x ^ (p ^ ((n : ℕ).pred.succ)) := by rw [Nat.pred_eq_sub_one] _ = x ^ (p ^ n) := by rw [Nat.succ_pred n.ne_zero] _ = x := by rw [← hn, FiniteField.pow_card _] noncomputable instance : have : Fact (Nat.Prime p) := ⟨CharP.char_is_prime K p⟩ PerfectRing K p := have : Fact (Nat.Prime p) := ⟨CharP.char_is_prime K p⟩ PerfectRing.ofSurjective K _ (finite_field_is_perfect K p)