Theorem: Prime.dvd_of_pow_dvd_pow_mul_pow_of_square_not_dvd
File: Mathlib/Algebra/Associated.lean

tactic: cases' hp.dvd_or_dvd ((dvd_pow_self p (Nat.succ_ne_zero n)).trans hpow) with H hbdiv
state_before: α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a b : α
n : ℕ
hp : Prime p
hpow : p ^ Nat.succ n ∣ a ^ Nat.succ n * b ^ n
hb : ¬p ^ 2 ∣ b
⊢ p ∣ a

tactic: obtain ⟨x, rfl⟩ := hp.dvd_of_dvd_pow hbdiv
state_before: case inr
α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a b : α
n : ℕ
hp : Prime p
hpow : p ^ Nat.succ n ∣ a ^ Nat.succ n * b ^ n
hb : ¬p ^ 2 ∣ b
hbdiv : p ∣ b ^ n
⊢ p ∣ a

tactic: obtain ⟨y, hy⟩ := hpow
state_before: case inr.intro
α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a : α
n : ℕ
hp : Prime p
x : α
hpow : p ^ Nat.succ n ∣ a ^ Nat.succ n * (p * x) ^ n
hb : ¬p ^ 2 ∣ p * x
hbdiv : p ∣ (p * x) ^ n
⊢ p ∣ a

tactic: have : a ^ n.succ * x ^ n = p * y := by
  refine' mul_left_cancel₀ (pow_ne_zero n hp.ne_zero) _
  rw [← mul_assoc _ p, ← pow_succ', ← hy, mul_pow, ← mul_assoc (a ^ n.succ), mul_comm _ (p ^ n),
    mul_assoc]
state_before: case inr.intro.intro
α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a : α
n : ℕ
hp : Prime p
x : α
hb : ¬p ^ 2 ∣ p * x
hbdiv : p ∣ (p * x) ^ n
y : α
hy : a ^ Nat.succ n * (p * x) ^ n = p ^ Nat.succ n * y
⊢ p ∣ a

tactic: refine' hp.dvd_of_dvd_pow ((hp.dvd_or_dvd ⟨_, this⟩).resolve_right fun hdvdx => hb _)
state_before: case inr.intro.intro
α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a : α
n : ℕ
hp : Prime p
x : α
hb : ¬p ^ 2 ∣ p * x
hbdiv : p ∣ (p * x) ^ n
y : α
hy : a ^ Nat.succ n * (p * x) ^ n = p ^ Nat.succ n * y
this : a ^ Nat.succ n * x ^ n = p * y
⊢ p ∣ a

tactic: obtain ⟨z, rfl⟩ := hp.dvd_of_dvd_pow hdvdx
state_before: case inr.intro.intro
α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a : α
n : ℕ
hp : Prime p
x : α
hb : ¬p ^ 2 ∣ p * x
hbdiv : p ∣ (p * x) ^ n
y : α
hy : a ^ Nat.succ n * (p * x) ^ n = p ^ Nat.succ n * y
this : a ^ Nat.succ n * x ^ n = p * y
hdvdx : p ∣ x ^ n
⊢ p ^ 2 ∣ p * x

tactic: rw [pow_two, ← mul_assoc]
state_before: case inr.intro.intro.intro
α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a : α
n : ℕ
hp : Prime p
y z : α
hb : ¬p ^ 2 ∣ p * (p * z)
hbdiv : p ∣ (p * (p * z)) ^ n
hy : a ^ Nat.succ n * (p * (p * z)) ^ n = p ^ Nat.succ n * y
this : a ^ Nat.succ n * (p * z) ^ n = p * y
hdvdx : p ∣ (p * z) ^ n
⊢ p ^ 2 ∣ p * (p * z)

tactic: exact dvd_mul_right _ _
state_before: case inr.intro.intro.intro
α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a : α
n : ℕ
hp : Prime p
y z : α
hb : ¬p ^ 2 ∣ p * (p * z)
hbdiv : p ∣ (p * (p * z)) ^ n
hy : a ^ Nat.succ n * (p * (p * z)) ^ n = p ^ Nat.succ n * y
this : a ^ Nat.succ n * (p * z) ^ n = p * y
hdvdx : p ∣ (p * z) ^ n
⊢ p * p ∣ p * p * z

tactic: exact hp.dvd_of_dvd_pow H
state_before: case inl
α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a b : α
n : ℕ
hp : Prime p
hpow : p ^ Nat.succ n ∣ a ^ Nat.succ n * b ^ n
hb : ¬p ^ 2 ∣ b
H : p ∣ a ^ Nat.succ n
⊢ p ∣ a

tactic: refine' mul_left_cancel₀ (pow_ne_zero n hp.ne_zero) _
state_before: α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a : α
n : ℕ
hp : Prime p
x : α
hb : ¬p ^ 2 ∣ p * x
hbdiv : p ∣ (p * x) ^ n
y : α
hy : a ^ Nat.succ n * (p * x) ^ n = p ^ Nat.succ n * y
⊢ a ^ Nat.succ n * x ^ n = p * y

tactic: rw [← mul_assoc _ p, ← pow_succ', ← hy, mul_pow, ← mul_assoc (a ^ n.succ), mul_comm _ (p ^ n),
  mul_assoc]
state_before: α : Type u_1
β : Type ?u.44629
γ : Type ?u.44632
δ : Type ?u.44635
inst✝ : CancelCommMonoidWithZero α
p a : α
n : ℕ
hp : Prime p
x : α
hb : ¬p ^ 2 ∣ p * x
hbdiv : p ∣ (p * x) ^ n
y : α
hy : a ^ Nat.succ n * (p * x) ^ n = p ^ Nat.succ n * y
⊢ p ^ n * (a ^ Nat.succ n * x ^ n) = p ^ n * (p * y)