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

tactic: haveI := Classical.propDecidable
state_before: α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
⊢ ∀ (a : R), a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b

tactic: intro a
state_before: α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
⊢ ∀ (a : R), a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b

tactic: refine' induction_on_prime a _ _ _
state_before: α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a : R
⊢ a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b

tactic: intros
state_before: case refine'_1
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a : R
⊢ 0 ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = 0 ∧ c' * b' = b

tactic: contradiction
state_before: case refine'_1
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a : R
x✝ : 0 ≠ 0
b✝ : R
⊢ ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = 0 ∧ c' * b' = b✝

tactic: intro a a_unit _ b
state_before: case refine'_2
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a : R
⊢ ∀ (x : R),
    IsUnit x → x ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = x ∧ c' * b' = b

tactic: use a, b, 1
state_before: case refine'_2
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a : R
a_unit : IsUnit a
x✝ : a ≠ 0
b : R
⊢ ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b

tactic: constructor
state_before: case refine'_2
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a : R
a_unit : IsUnit a
x✝ : a ≠ 0
b : R
⊢ (∀ {d : R}, d ∣ a → d ∣ b → IsUnit d) ∧ 1 * a = a ∧ 1 * b = b

tactic: intro p p_dvd_a _
state_before: case refine'_2.left
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a : R
a_unit : IsUnit a
x✝ : a ≠ 0
b : R
⊢ ∀ {d : R}, d ∣ a → d ∣ b → IsUnit d

tactic: exact isUnit_of_dvd_unit p_dvd_a a_unit
state_before: case refine'_2.left
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝¹ a : R
a_unit : IsUnit a
x✝ : a ≠ 0
b p : R
p_dvd_a : p ∣ a
a✝ : p ∣ b
⊢ IsUnit p

tactic: simp
state_before: case refine'_2.right
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a : R
a_unit : IsUnit a
x✝ : a ≠ 0
b : R
⊢ 1 * a = a ∧ 1 * b = b

tactic: intro a p a_ne_zero p_prime ih_a pa_ne_zero b
state_before: case refine'_3
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a : R
⊢ ∀ (a p : R),
    a ≠ 0 →
      Prime p →
        (a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b) →
          p * a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = p * a ∧ c' * b' = b

tactic: by_cases p ∣ b
state_before: case refine'_3
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a p : R
a_ne_zero : a ≠ 0
p_prime : Prime p
ih_a : a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b
pa_ne_zero : p * a ≠ 0
b : R
⊢ ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = p * a ∧ c' * b' = b

tactic: rcases h with ⟨b, rfl⟩
state_before: case pos
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a p : R
a_ne_zero : a ≠ 0
p_prime : Prime p
ih_a : a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b
pa_ne_zero : p * a ≠ 0
b : R
h : p ∣ b
⊢ ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = p * a ∧ c' * b' = b

tactic: obtain ⟨a', b', c', no_factor, ha', hb'⟩ := ih_a a_ne_zero b
state_before: case pos.intro
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a p : R
a_ne_zero : a ≠ 0
p_prime : Prime p
ih_a : a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b
pa_ne_zero : p * a ≠ 0
b : R
⊢ ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = p * a ∧ c' * b' = p * b

tactic: refine' ⟨a', b', p * c', @no_factor, _, _⟩
state_before: case pos.intro.intro.intro.intro.intro.intro
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a p : R
a_ne_zero : a ≠ 0
p_prime : Prime p
ih_a : a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b
pa_ne_zero : p * a ≠ 0
b a' b' c' : R
no_factor : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
ha' : c' * a' = a
hb' : c' * b' = b
⊢ ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = p * a ∧ c' * b' = p * b

tactic: rw [mul_assoc, ha']
state_before: case pos.intro.intro.intro.intro.intro.intro.refine'_1
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a p : R
a_ne_zero : a ≠ 0
p_prime : Prime p
ih_a : a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b
pa_ne_zero : p * a ≠ 0
b a' b' c' : R
no_factor : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
ha' : c' * a' = a
hb' : c' * b' = b
⊢ p * c' * a' = p * a

tactic: rw [mul_assoc, hb']
state_before: case pos.intro.intro.intro.intro.intro.intro.refine'_2
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a p : R
a_ne_zero : a ≠ 0
p_prime : Prime p
ih_a : a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b
pa_ne_zero : p * a ≠ 0
b a' b' c' : R
no_factor : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
ha' : c' * a' = a
hb' : c' * b' = b
⊢ p * c' * b' = p * b

tactic: obtain ⟨a', b', c', coprime, rfl, rfl⟩ := ih_a a_ne_zero b
state_before: case neg
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a✝ a p : R
a_ne_zero : a ≠ 0
p_prime : Prime p
ih_a : a ≠ 0 → ∀ (b : R), ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = a ∧ c' * b' = b
pa_ne_zero : p * a ≠ 0
b : R
h : ¬p ∣ b
⊢ ∃ a' b' c', (∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d) ∧ c' * a' = p * a ∧ c' * b' = b

tactic: refine' ⟨p * a', b', c', _, mul_left_comm _ _ _, rfl⟩
state_before: case neg.intro.intro.intro.intro.intro
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a p : R
p_prime : Prime p
a' b' c' : R
coprime : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
a_ne_zero : c' * a' ≠ 0
ih_a :
  c' * a' ≠ 0 →
    ∀ (b : R), ∃ a'_1 b' c'_1, (∀ {d : R}, d ∣ a'_1 → d ∣ b' → IsUnit d) ∧ c'_1 * a'_1 = c' * a' ∧ c'_1 * b' = b
pa_ne_zero : p * (c' * a') ≠ 0
h : ¬p ∣ c' * b'
⊢ ∃ a'_1 b'_1 c'_1, (∀ {d : R}, d ∣ a'_1 → d ∣ b'_1 → IsUnit d) ∧ c'_1 * a'_1 = p * (c' * a') ∧ c'_1 * b'_1 = c' * b'

tactic: intro q q_dvd_pa' q_dvd_b'
state_before: case neg.intro.intro.intro.intro.intro
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a p : R
p_prime : Prime p
a' b' c' : R
coprime : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
a_ne_zero : c' * a' ≠ 0
ih_a :
  c' * a' ≠ 0 →
    ∀ (b : R), ∃ a'_1 b' c'_1, (∀ {d : R}, d ∣ a'_1 → d ∣ b' → IsUnit d) ∧ c'_1 * a'_1 = c' * a' ∧ c'_1 * b' = b
pa_ne_zero : p * (c' * a') ≠ 0
h : ¬p ∣ c' * b'
⊢ ∀ {d : R}, d ∣ p * a' → d ∣ b' → IsUnit d

tactic: cases' p_prime.left_dvd_or_dvd_right_of_dvd_mul q_dvd_pa' with p_dvd_q q_dvd_a'
state_before: case neg.intro.intro.intro.intro.intro
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a p : R
p_prime : Prime p
a' b' c' : R
coprime : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
a_ne_zero : c' * a' ≠ 0
ih_a :
  c' * a' ≠ 0 →
    ∀ (b : R), ∃ a'_1 b' c'_1, (∀ {d : R}, d ∣ a'_1 → d ∣ b' → IsUnit d) ∧ c'_1 * a'_1 = c' * a' ∧ c'_1 * b' = b
pa_ne_zero : p * (c' * a') ≠ 0
h : ¬p ∣ c' * b'
q : R
q_dvd_pa' : q ∣ p * a'
q_dvd_b' : q ∣ b'
⊢ IsUnit q

tactic: exact coprime q_dvd_a' q_dvd_b'
state_before: case neg.intro.intro.intro.intro.intro.inr
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a p : R
p_prime : Prime p
a' b' c' : R
coprime : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
a_ne_zero : c' * a' ≠ 0
ih_a :
  c' * a' ≠ 0 →
    ∀ (b : R), ∃ a'_1 b' c'_1, (∀ {d : R}, d ∣ a'_1 → d ∣ b' → IsUnit d) ∧ c'_1 * a'_1 = c' * a' ∧ c'_1 * b' = b
pa_ne_zero : p * (c' * a') ≠ 0
h : ¬p ∣ c' * b'
q : R
q_dvd_pa' : q ∣ p * a'
q_dvd_b' : q ∣ b'
q_dvd_a' : q ∣ a'
⊢ IsUnit q

tactic: have : p ∣ c' * b' := dvd_mul_of_dvd_right (p_dvd_q.trans q_dvd_b') _
state_before: case neg.intro.intro.intro.intro.intro.inl
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this : (a : Prop) → Decidable a
a p : R
p_prime : Prime p
a' b' c' : R
coprime : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
a_ne_zero : c' * a' ≠ 0
ih_a :
  c' * a' ≠ 0 →
    ∀ (b : R), ∃ a'_1 b' c'_1, (∀ {d : R}, d ∣ a'_1 → d ∣ b' → IsUnit d) ∧ c'_1 * a'_1 = c' * a' ∧ c'_1 * b' = b
pa_ne_zero : p * (c' * a') ≠ 0
h : ¬p ∣ c' * b'
q : R
q_dvd_pa' : q ∣ p * a'
q_dvd_b' : q ∣ b'
p_dvd_q : p ∣ q
⊢ IsUnit q

tactic: contradiction
state_before: case neg.intro.intro.intro.intro.intro.inl
α : Type ?u.947754
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
inst✝ : UniqueFactorizationMonoid R
this✝ : (a : Prop) → Decidable a
a p : R
p_prime : Prime p
a' b' c' : R
coprime : ∀ {d : R}, d ∣ a' → d ∣ b' → IsUnit d
a_ne_zero : c' * a' ≠ 0
ih_a :
  c' * a' ≠ 0 →
    ∀ (b : R), ∃ a'_1 b' c'_1, (∀ {d : R}, d ∣ a'_1 → d ∣ b' → IsUnit d) ∧ c'_1 * a'_1 = c' * a' ∧ c'_1 * b' = b
pa_ne_zero : p * (c' * a') ≠ 0
h : ¬p ∣ c' * b'
q : R
q_dvd_pa' : q ∣ p * a'
q_dvd_b' : q ∣ b'
p_dvd_q : p ∣ q
this : p ∣ c' * b'
⊢ IsUnit q