Theorem: AddChar.exists_divisor_of_not_isPrimitive
File: Mathlib/NumberTheory/LegendreSymbol/AddCharacter.lean

tactic: simp_rw [IsPrimitive, not_forall, not_ne_iff] at he
state_before: R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
he : ¬e.IsPrimitive
⊢ ∃ d, d ∣ N ∧ d < N ∧ e.mulShift ↑d = 1
state_after: R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
he : ∃ x, ∃ (_ : x ≠ 0), e.mulShift x = 1
⊢ ∃ d, d ∣ N ∧ d < N ∧ e.mulShift ↑d = 1

tactic: rcases he with ⟨b, hb_ne, hb⟩
state_before: R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
he : ∃ x, ∃ (_ : x ≠ 0), e.mulShift x = 1
⊢ ∃ d, d ∣ N ∧ d < N ∧ e.mulShift ↑d = 1
state_after: case intro.intro
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
b : ZMod N
hb_ne : b ≠ 0
hb : e.mulShift b = 1
⊢ ∃ d, d ∣ N ∧ d < N ∧ e.mulShift ↑d = 1

tactic: obtain ⟨d, hd, u, hu, rfl⟩ := b.eq_unit_mul_divisor
state_before: case intro.intro
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
b : ZMod N
hb_ne : b ≠ 0
hb : e.mulShift b = 1
⊢ ∃ d, d ∣ N ∧ d < N ∧ e.mulShift ↑d = 1
state_after: case intro.intro.intro.intro.intro.intro
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
⊢ ∃ d, d ∣ N ∧ d < N ∧ e.mulShift ↑d = 1

tactic: refine ⟨d, hd, lt_of_le_of_ne (Nat.le_of_dvd (NeZero.pos _) hd) ?_, ?_⟩
state_before: case intro.intro.intro.intro.intro.intro
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
⊢ ∃ d, d ∣ N ∧ d < N ∧ e.mulShift ↑d = 1
state_after: case intro.intro.intro.intro.intro.intro.refine_1
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
⊢ d ≠ N

case intro.intro.intro.intro.intro.intro.refine_2
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
⊢ e.mulShift ↑d = 1

tactic: exact fun h ↦ by simp only [h, ZMod.natCast_self, mul_zero, ne_eq, not_true_eq_false] at hb_ne
state_before: case intro.intro.intro.intro.intro.intro.refine_1
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
⊢ d ≠ N
state_after: no goals

tactic: simp only [h, ZMod.natCast_self, mul_zero, ne_eq, not_true_eq_false] at hb_ne
state_before: R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
h : d = N
⊢ False
state_after: no goals

tactic: rw [← mulShift_unit_eq_one_iff _ hu, ← hb, mul_comm]
state_before: case intro.intro.intro.intro.intro.intro.refine_2
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
⊢ e.mulShift ↑d = 1
state_after: case intro.intro.intro.intro.intro.intro.refine_2
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
⊢ (e.mulShift ↑d).mulShift u = e.mulShift (↑d * u)

tactic: ext1 y
state_before: case intro.intro.intro.intro.intro.intro.refine_2
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
⊢ (e.mulShift ↑d).mulShift u = e.mulShift (↑d * u)
state_after: case intro.intro.intro.intro.intro.intro.refine_2.h
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
y : ZMod N
⊢ ((e.mulShift ↑d).mulShift u) y = (e.mulShift (↑d * u)) y

tactic: rw [mulShift_apply, mulShift_apply, mulShift_apply, mul_assoc]
state_before: case intro.intro.intro.intro.intro.intro.refine_2.h
R✝ : Type u
inst✝³ : CommRing R✝
R' : Type v
inst✝² : CommMonoid R'
N : ℕ
inst✝¹ : NeZero N
R : Type u_1
inst✝ : CommRing R
e : AddChar (ZMod N) R
d : ℕ
hd : d ∣ N
u : ZMod N
hu : IsUnit u
hb_ne : u * ↑d ≠ 0
hb : e.mulShift (u * ↑d) = 1
y : ZMod N
⊢ ((e.mulShift ↑d).mulShift u) y = (e.mulShift (↑d * u)) y
state_after: no goals