Theorem: IsPrimitiveRoot.pow_iff_coprime
File: Mathlib/RingTheory/RootsOfUnity/Basic.lean

tactic: refine' ⟨_, h.pow_of_coprime i⟩
state_before: M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i : ℕ
⊢ IsPrimitiveRoot (ζ ^ i) k ↔ Nat.coprime i k

tactic: intro hi
state_before: M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i : ℕ
⊢ IsPrimitiveRoot (ζ ^ i) k → Nat.coprime i k

tactic: obtain ⟨a, ha⟩ := i.gcd_dvd_left k
state_before: M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i : ℕ
hi : IsPrimitiveRoot (ζ ^ i) k
⊢ Nat.coprime i k

tactic: obtain ⟨b, hb⟩ := i.gcd_dvd_right k
state_before: case intro
M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i : ℕ
hi : IsPrimitiveRoot (ζ ^ i) k
a : ℕ
ha : i = Nat.gcd i k * a
⊢ Nat.coprime i k

tactic: suffices b = k by
  rw [this, eq_comm, Nat.mul_left_eq_self_iff h0] at hb
  rwa [Nat.coprime]
state_before: case intro.intro
M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i : ℕ
hi : IsPrimitiveRoot (ζ ^ i) k
a : ℕ
ha : i = Nat.gcd i k * a
b : ℕ
hb : k = Nat.gcd i k * b
⊢ Nat.coprime i k

tactic: rw [ha] at hi
state_before: case intro.intro
M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i : ℕ
hi : IsPrimitiveRoot (ζ ^ i) k
a : ℕ
ha : i = Nat.gcd i k * a
b : ℕ
hb : k = Nat.gcd i k * b
⊢ b = k

tactic: rw [mul_comm] at hb
state_before: case intro.intro
M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i a : ℕ
hi : IsPrimitiveRoot (ζ ^ (Nat.gcd i k * a)) k
ha : i = Nat.gcd i k * a
b : ℕ
hb : k = Nat.gcd i k * b
⊢ b = k

tactic: apply Nat.dvd_antisymm ⟨i.gcd k, hb⟩ (hi.dvd_of_pow_eq_one b _)
state_before: case intro.intro
M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i a : ℕ
hi : IsPrimitiveRoot (ζ ^ (Nat.gcd i k * a)) k
ha : i = Nat.gcd i k * a
b : ℕ
hb : k = b * Nat.gcd i k
⊢ b = k

tactic: rw [← pow_mul', ← mul_assoc, ← hb, pow_mul, h.pow_eq_one, one_pow]
state_before: M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i a : ℕ
hi : IsPrimitiveRoot (ζ ^ (Nat.gcd i k * a)) k
ha : i = Nat.gcd i k * a
b : ℕ
hb : k = b * Nat.gcd i k
⊢ (ζ ^ (Nat.gcd i k * a)) ^ b = 1

tactic: rw [this, eq_comm, Nat.mul_left_eq_self_iff h0] at hb
state_before: M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i : ℕ
hi : IsPrimitiveRoot (ζ ^ i) k
a : ℕ
ha : i = Nat.gcd i k * a
b : ℕ
hb : k = Nat.gcd i k * b
this : b = k
⊢ Nat.coprime i k

tactic: rwa [Nat.coprime]
state_before: M : Type u_1
N : Type ?u.2013558
G : Type ?u.2013561
R : Type ?u.2013564
S : Type ?u.2013567
F : Type ?u.2013570
inst✝² : CommMonoid M
inst✝¹ : CommMonoid N
inst✝ : DivisionCommMonoid G
k l : ℕ
ζ : M
f : F
h✝ h : IsPrimitiveRoot ζ k
h0 : 0 < k
i : ℕ
hi : IsPrimitiveRoot (ζ ^ i) k
a : ℕ
ha : i = Nat.gcd i k * a
b : ℕ
hb : Nat.gcd i k = 1
this : b = k
⊢ Nat.coprime i k