Theorem: GaloisField.splits_zmod_X_pow_sub_X
File: Mathlib/FieldTheory/Finite/GaloisField.lean

tactic: have hp : 1 < p := h_prime.out.one_lt
state_before: p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
⊢ Splits (RingHom.id (ZMod p)) (X ^ p - X)
state_after: p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
⊢ Splits (RingHom.id (ZMod p)) (X ^ p - X)

tactic: have h1 : roots (X ^ p - X : (ZMod p)[X]) = Finset.univ.val := by
  convert FiniteField.roots_X_pow_card_sub_X (ZMod p)
  exact (ZMod.card p).symm
state_before: p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
⊢ Splits (RingHom.id (ZMod p)) (X ^ p - X)
state_after: p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
h1 : (X ^ p - X).roots = univ.val
⊢ Splits (RingHom.id (ZMod p)) (X ^ p - X)

tactic: have h2 := FiniteField.X_pow_card_sub_X_natDegree_eq (ZMod p) hp
state_before: p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
h1 : (X ^ p - X).roots = univ.val
⊢ Splits (RingHom.id (ZMod p)) (X ^ p - X)
state_after: p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
h1 : (X ^ p - X).roots = univ.val
h2 : (X ^ p - X).natDegree = p
⊢ Splits (RingHom.id (ZMod p)) (X ^ p - X)

tactic: cases p
state_before: p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
h1 : (X ^ p - X).roots = univ.val
h2 : (X ^ p - X).natDegree = p
⊢ Splits (RingHom.id (ZMod p)) (X ^ p - X)
state_after: case zero
p : ℕ
inst✝ : Fact (Nat.Prime p)
n✝ n : ℕ
h_prime : Fact (Nat.Prime 0)
hp : 1 < 0
h1 : (X ^ 0 - X).roots = univ.val
h2 : (X ^ 0 - X).natDegree = 0
⊢ Splits (RingHom.id (ZMod 0)) (X ^ 0 - X)

case succ
p : ℕ
inst✝ : Fact (Nat.Prime p)
n✝¹ n n✝ : ℕ
h_prime : Fact (Nat.Prime (n✝ + 1))
hp : 1 < n✝ + 1
h1 : (X ^ (n✝ + 1) - X).roots = univ.val
h2 : (X ^ (n✝ + 1) - X).natDegree = n✝ + 1
⊢ Splits (RingHom.id (ZMod (n✝ + 1))) (X ^ (n✝ + 1) - X)

tactic: cases hp
state_before: case zero
p : ℕ
inst✝ : Fact (Nat.Prime p)
n✝ n : ℕ
h_prime : Fact (Nat.Prime 0)
hp : 1 < 0
h1 : (X ^ 0 - X).roots = univ.val
h2 : (X ^ 0 - X).natDegree = 0
⊢ Splits (RingHom.id (ZMod 0)) (X ^ 0 - X)

case succ
p : ℕ
inst✝ : Fact (Nat.Prime p)
n✝¹ n n✝ : ℕ
h_prime : Fact (Nat.Prime (n✝ + 1))
hp : 1 < n✝ + 1
h1 : (X ^ (n✝ + 1) - X).roots = univ.val
h2 : (X ^ (n✝ + 1) - X).natDegree = n✝ + 1
⊢ Splits (RingHom.id (ZMod (n✝ + 1))) (X ^ (n✝ + 1) - X)
state_after: case succ
p : ℕ
inst✝ : Fact (Nat.Prime p)
n✝¹ n n✝ : ℕ
h_prime : Fact (Nat.Prime (n✝ + 1))
hp : 1 < n✝ + 1
h1 : (X ^ (n✝ + 1) - X).roots = univ.val
h2 : (X ^ (n✝ + 1) - X).natDegree = n✝ + 1
⊢ Splits (RingHom.id (ZMod (n✝ + 1))) (X ^ (n✝ + 1) - X)

tactic: rw [splits_iff_card_roots, h1, ← Finset.card_def, Finset.card_univ, h2, ZMod.card]
state_before: case succ
p : ℕ
inst✝ : Fact (Nat.Prime p)
n✝¹ n n✝ : ℕ
h_prime : Fact (Nat.Prime (n✝ + 1))
hp : 1 < n✝ + 1
h1 : (X ^ (n✝ + 1) - X).roots = univ.val
h2 : (X ^ (n✝ + 1) - X).natDegree = n✝ + 1
⊢ Splits (RingHom.id (ZMod (n✝ + 1))) (X ^ (n✝ + 1) - X)
state_after: no goals

tactic: convert FiniteField.roots_X_pow_card_sub_X (ZMod p)
state_before: p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
⊢ (X ^ p - X).roots = univ.val
state_after: case h.e'_2.h.e'_4.h.h.e'_5.h.e'_6
p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
e_2✝ : ZMod.commRing p = EuclideanDomain.toCommRing
⊢ p = Fintype.card (ZMod p)

tactic: exact (ZMod.card p).symm
state_before: case h.e'_2.h.e'_4.h.h.e'_5.h.e'_6
p✝ : ℕ
inst✝ : Fact (Nat.Prime p✝)
n✝ p : ℕ
h_prime : Fact (Nat.Prime p)
n : ℕ
hp : 1 < p
e_2✝ : ZMod.commRing p = EuclideanDomain.toCommRing
⊢ p = Fintype.card (ZMod p)
state_after: no goals