Theorem: UniqueFactorizationMonoid.prime_pow_coprime_prod_of_coprime_insert
File: Mathlib/RingTheory/UniqueFactorizationDomain.lean

Proof steps:
state_before: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
⊢ IsRelPrime (p ^ i p) (∏ p' ∈ s, p' ^ i p')
state_after: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
⊢ IsRelPrime (p ^ i p) (∏ p' ∈ s, p' ^ i p')
tactic: have hp := is_prime _ (Finset.mem_insert_self _ _)
state_before: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
⊢ IsRelPrime (p ^ i p) (∏ p' ∈ s, p' ^ i p')
state_after: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
⊢ ∀ ⦃d : α⦄, d ∣ p ^ i p → d ∣ ∏ p' ∈ s, p' ^ i p' → ¬Prime d
tactic: refine (isRelPrime_iff_no_prime_factors <| pow_ne_zero _ hp.ne_zero).mpr ?_
state_before: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
⊢ ∀ ⦃d : α⦄, d ∣ p ^ i p → d ∣ ∏ p' ∈ s, p' ^ i p' → ¬Prime d
state_after: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdp : d ∣ p ^ i p
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
⊢ False
tactic: intro d hdp hdprod hd
state_before: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdp : d ∣ p ^ i p
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
⊢ False
state_after: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdp : d ∣ p ^ i p
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
⊢ p ∈ s
tactic: apply hps
state_before: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdp : d ∣ p ^ i p
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
⊢ p ∈ s
state_after: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
⊢ p ∈ s
tactic: replace hdp := hd.dvd_of_dvd_pow hdp
state_before: α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
⊢ p ∈ s
state_after: case intro.intro
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem' : q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q
⊢ p ∈ s
tactic: obtain ⟨q, q_mem', hdq⟩ := hd.exists_mem_multiset_dvd hdprod
state_before: case intro.intro
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem' : q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q
⊢ p ∈ s
state_after: case intro.intro.intro.intro
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem : q ∈ s.val
q_mem' : q ^ i q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q ^ i q
⊢ p ∈ s
tactic: obtain ⟨q, q_mem, rfl⟩ := Multiset.mem_map.mp q_mem'
state_before: case intro.intro.intro.intro
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem : q ∈ s.val
q_mem' : q ^ i q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q ^ i q
⊢ p ∈ s
state_after: case intro.intro.intro.intro
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem : q ∈ s.val
q_mem' : q ^ i q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q
⊢ p ∈ s
tactic: replace hdq := hd.dvd_of_dvd_pow hdq
state_before: case intro.intro.intro.intro
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem : q ∈ s.val
q_mem' : q ^ i q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q
⊢ p ∈ s
state_after: case intro.intro.intro.intro
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem : q ∈ s.val
q_mem' : q ^ i q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q
this : p ∣ q
⊢ p ∈ s
tactic: have : p ∣ q := dvd_trans (hd.irreducible.dvd_symm hp.irreducible hdp) hdq
state_before: case intro.intro.intro.intro
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem : q ∈ s.val
q_mem' : q ^ i q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q
this : p ∣ q
⊢ p ∈ s
state_after: case a
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem : q ∈ s.val
q_mem' : q ^ i q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q
this : p ∣ q
⊢ p ∈ s ↔ q ∈ s.val
tactic: convert q_mem
state_before: case a
α : Type u_1
R : Type u_2
inst✝⁵ : CancelCommMonoidWithZero R
inst✝⁴ : UniqueFactorizationMonoid R
inst✝³ : CancelCommMonoidWithZero α
inst✝² : UniqueFactorizationMonoid α
β : Type u_3
inst✝¹ : CancelCommMonoidWithZero β
inst✝ : DecidableEq α
s : Finset α
i : α → ℕ
p : α
hps : p ∉ s
is_prime : ∀ q ∈ insert p s, Prime q
is_coprime : ∀ q ∈ insert p s, ∀ q' ∈ insert p s, q ∣ q' → q = q'
hp : Prime p
d : α
hdprod : d ∣ ∏ p' ∈ s, p' ^ i p'
hd : Prime d
hdp : d ∣ p
q : α
q_mem : q ∈ s.val
q_mem' : q ^ i q ∈ Multiset.map (fun p' => p' ^ i p') s.val
hdq : d ∣ q
this : p ∣ q
⊢ p ∈ s ↔ q ∈ s.val
state_after: no goals
tactic: rw [Finset.mem_val,
    is_coprime _ (Finset.mem_insert_self p s) _ (Finset.mem_insert_of_mem q_mem) this]