Theorem: IsPrimitiveRoot.ne_zero'
File: Mathlib/RingTheory/RootsOfUnity/Basic.lean

tactic: let p := ringChar R
state_before: M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
⊢ NeZero ↑↑n

tactic: have hfin := multiplicity.finite_nat_iff.2 ⟨CharP.char_ne_one R p, n.pos⟩
state_before: M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
⊢ NeZero ↑↑n

tactic: obtain ⟨m, hm⟩ := multiplicity.exists_eq_pow_mul_and_not_dvd hfin
state_before: M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
⊢ NeZero ↑↑n

tactic: by_cases hp : p ∣ n
state_before: case intro
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
⊢ NeZero ↑↑n

tactic: obtain ⟨k, hk⟩ := Nat.exists_eq_succ_of_ne_zero (multiplicity.pos_of_dvd hfin hp).ne'
state_before: case pos
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
⊢ NeZero ↑↑n

tactic: haveI : NeZero p := NeZero.of_pos (Nat.pos_of_dvd_of_pos hp n.pos)
state_before: case pos.intro
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
⊢ NeZero ↑↑n

tactic: haveI hpri : Fact p.Prime := CharP.char_is_prime_of_pos R p
state_before: case pos.intro
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this : NeZero p
⊢ NeZero ↑↑n

tactic: have := hζ.pow_eq_one
state_before: case pos.intro
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this : NeZero p
hpri : Fact (Nat.Prime p)
⊢ NeZero ↑↑n

tactic: rw [hm.1, hk, pow_succ, mul_assoc, pow_mul', ← frobenius_def, ← frobenius_one p] at this
state_before: case pos.intro
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝ : NeZero p
hpri : Fact (Nat.Prime p)
this : ζ ^ ↑n = 1
⊢ NeZero ↑↑n

tactic: exfalso
state_before: case pos.intro
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
⊢ NeZero ↑↑n

tactic: have hpos : 0 < p ^ k * m := by
  refine' mul_pos (pow_pos hpri.1.pos _) (Nat.pos_of_ne_zero fun h => _)
  have H := hm.1
  rw [h] at H
  simp at H
state_before: case pos.intro.h
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
⊢ False

tactic: refine' hζ.pow_ne_one_of_pos_of_lt hpos _ (frobenius_inj R p this)
state_before: case pos.intro.h
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
hpos : 0 < p ^ k * m
⊢ False

tactic: refine' mul_pos (pow_pos hpri.1.pos _) (Nat.pos_of_ne_zero fun h => _)
state_before: M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
⊢ 0 < p ^ k * m

tactic: have H := hm.1
state_before: M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
h : m = 0
⊢ False

tactic: rw [h] at H
state_before: M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
h : m = 0
H : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m
⊢ False

tactic: simp at H
state_before: M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
h : m = 0
H : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * 0
⊢ False

tactic: rw [hm.1, hk, pow_succ, mul_assoc, mul_comm p]
state_before: case pos.intro.h
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
hpos : 0 < p ^ k * m
⊢ p ^ k * m < ↑n

tactic: exact lt_mul_of_one_lt_right hpos hpri.1.one_lt
state_before: case pos.intro.h
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k✝ l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : p ∣ ↑n
k : ℕ
hk : Part.get (multiplicity p ↑n) hfin = Nat.succ k
this✝¹ : NeZero p
hpri : Fact (Nat.Prime p)
this✝ : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = 1
this : ↑(frobenius R p) (ζ ^ (p ^ k * m)) = ↑(frobenius R p) 1
hpos : 0 < p ^ k * m
⊢ p ^ k * m < p ^ k * m * p

tactic: exact NeZero.of_not_dvd R hp
state_before: case neg
M : Type ?u.2763073
N : Type ?u.2763076
G : Type ?u.2763079
R : Type u_1
S : Type ?u.2763085
F : Type ?u.2763088
inst✝⁴ : CommMonoid M
inst✝³ : CommMonoid N
inst✝² : DivisionCommMonoid G
k l : ℕ
ζ : R
inst✝¹ : CommRing R
inst✝ : IsDomain R
n : ℕ+
hζ : IsPrimitiveRoot ζ ↑n
p : ℕ := ringChar R
hfin : multiplicity.Finite p ↑n
m : ℕ
hm : ↑n = p ^ Part.get (multiplicity p ↑n) hfin * m ∧ ¬p ∣ m
hp : ¬p ∣ ↑n
⊢ NeZero ↑↑n