Theorem: FiniteField.card
File: Mathlib/FieldTheory/Finite/Basic.lean

tactic: haveI hp : Fact p.Prime := ⟨CharP.char_is_prime K p⟩
state_before: K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n
state_after: K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n

tactic: letI : Module (ZMod p) K := { (ZMod.castHom dvd_rfl K : ZMod p →+* _).toModule with }
state_before: K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n
state_after: K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n

tactic: obtain ⟨n, h⟩ := VectorSpace.card_fintype (ZMod p) K
state_before: K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
n : ℕ
h : q = Fintype.card (ZMod p) ^ n
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n

tactic: rw [ZMod.card] at h
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
n : ℕ
h : q = Fintype.card (ZMod p) ^ n
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
n : ℕ
h : q = p ^ n
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n

tactic: refine ⟨⟨n, ?_⟩, hp.1, h⟩
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
n : ℕ
h : q = p ^ n
⊢ ∃ n, Nat.Prime p ∧ q = p ^ ↑n
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
n : ℕ
h : q = p ^ n
⊢ 0 < n

tactic: apply Or.resolve_left (Nat.eq_zero_or_pos n)
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
n : ℕ
h : q = p ^ n
⊢ 0 < n
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
n : ℕ
h : q = p ^ n
⊢ ¬n = 0

tactic: rintro rfl
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
n : ℕ
h : q = p ^ n
⊢ ¬n = 0
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
h : q = p ^ 0
⊢ False

tactic: rw [pow_zero] at h
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
h : q = p ^ 0
⊢ False
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
h : q = 1
⊢ False

tactic: have : (0 : K) = 1 := by apply Fintype.card_le_one_iff.mp (le_of_eq h)
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
h : q = 1
⊢ False
state_after: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this✝ : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
h : q = 1
this : 0 = 1
⊢ False

tactic: exact absurd this zero_ne_one
state_before: case intro
K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this✝ : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
h : q = 1
this : 0 = 1
⊢ False
state_after: no goals

tactic: apply Fintype.card_le_one_iff.mp (le_of_eq h)
state_before: K : Type u_1
R : Type u_2
inst✝² : Field K
inst✝¹ : Fintype K
p : ℕ
inst✝ : CharP K p
hp : Fact (Nat.Prime p)
this : Module (ZMod p) K :=
  let __src := (ZMod.castHom ⋯ K).toModule;
  Module.mk ⋯ ⋯
h : q = 1
⊢ 0 = 1
state_after: no goals