Theorem: IsFractionRing.exists_reduced_fraction
File: Mathlib/RingTheory/Localization/NumDen.lean

tactic: obtain ⟨⟨b, b_nonzero⟩, a, hab⟩ := exists_integer_multiple (nonZeroDivisors A) x
state_before: R : Type ?u.2417
inst✝⁹ : CommRing R
M : Submonoid R
S : Type ?u.2623
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.2877
inst✝⁶ : CommRing P
A : Type u_1
inst✝⁵ : CommRing A
inst✝⁴ : IsDomain A
inst✝³ : UniqueFactorizationMonoid A
K : Type u_2
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
x : K
⊢ ∃ a b, (∀ {d : A}, d ∣ a → d ∣ ↑b → IsUnit d) ∧ mk' K a b = x

tactic: obtain ⟨a', b', c', no_factor, rfl, rfl⟩ :=
  UniqueFactorizationMonoid.exists_reduced_factors' a b
    (mem_nonZeroDivisors_iff_ne_zero.mp b_nonzero)
state_before: case intro.mk.intro
R : Type ?u.2417
inst✝⁹ : CommRing R
M : Submonoid R
S : Type ?u.2623
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.2877
inst✝⁶ : CommRing P
A : Type u_1
inst✝⁵ : CommRing A
inst✝⁴ : IsDomain A
inst✝³ : UniqueFactorizationMonoid A
K : Type u_2
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
x : K
b : A
b_nonzero : b ∈ nonZeroDivisors A
a : A
hab : ↑(algebraMap A K) a = ↑{ val := b, property := b_nonzero } • x
⊢ ∃ a b, (∀ {d : A}, d ∣ a → d ∣ ↑b → IsUnit d) ∧ mk' K a b = x

tactic: obtain ⟨_, b'_nonzero⟩ := mul_mem_nonZeroDivisors.mp b_nonzero
state_before: case intro.mk.intro.intro.intro.intro.intro.intro
R : Type ?u.2417
inst✝⁹ : CommRing R
M : Submonoid R
S : Type ?u.2623
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.2877
inst✝⁶ : CommRing P
A : Type u_1
inst✝⁵ : CommRing A
inst✝⁴ : IsDomain A
inst✝³ : UniqueFactorizationMonoid A
K : Type u_2
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
x : K
a' b' c' : A
no_factor : ∀ {d : A}, d ∣ a' → d ∣ b' → IsUnit d
b_nonzero : c' * b' ∈ nonZeroDivisors A
hab : ↑(algebraMap A K) (c' * a') = ↑{ val := c' * b', property := b_nonzero } • x
⊢ ∃ a b, (∀ {d : A}, d ∣ a → d ∣ ↑b → IsUnit d) ∧ mk' K a b = x

tactic: refine' ⟨a', ⟨b', b'_nonzero⟩, no_factor, _⟩
state_before: case intro.mk.intro.intro.intro.intro.intro.intro.intro
R : Type ?u.2417
inst✝⁹ : CommRing R
M : Submonoid R
S : Type ?u.2623
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.2877
inst✝⁶ : CommRing P
A : Type u_1
inst✝⁵ : CommRing A
inst✝⁴ : IsDomain A
inst✝³ : UniqueFactorizationMonoid A
K : Type u_2
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
x : K
a' b' c' : A
no_factor : ∀ {d : A}, d ∣ a' → d ∣ b' → IsUnit d
b_nonzero : c' * b' ∈ nonZeroDivisors A
hab : ↑(algebraMap A K) (c' * a') = ↑{ val := c' * b', property := b_nonzero } • x
left✝ : c' ∈ nonZeroDivisors A
b'_nonzero : b' ∈ nonZeroDivisors A
⊢ ∃ a b, (∀ {d : A}, d ∣ a → d ∣ ↑b → IsUnit d) ∧ mk' K a b = x

tactic: refine' mul_left_cancel₀ (IsFractionRing.to_map_ne_zero_of_mem_nonZeroDivisors b_nonzero) _
state_before: case intro.mk.intro.intro.intro.intro.intro.intro.intro
R : Type ?u.2417
inst✝⁹ : CommRing R
M : Submonoid R
S : Type ?u.2623
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.2877
inst✝⁶ : CommRing P
A : Type u_1
inst✝⁵ : CommRing A
inst✝⁴ : IsDomain A
inst✝³ : UniqueFactorizationMonoid A
K : Type u_2
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
x : K
a' b' c' : A
no_factor : ∀ {d : A}, d ∣ a' → d ∣ b' → IsUnit d
b_nonzero : c' * b' ∈ nonZeroDivisors A
hab : ↑(algebraMap A K) (c' * a') = ↑{ val := c' * b', property := b_nonzero } • x
left✝ : c' ∈ nonZeroDivisors A
b'_nonzero : b' ∈ nonZeroDivisors A
⊢ mk' K a' { val := b', property := b'_nonzero } = x

tactic: simp only [Subtype.coe_mk, RingHom.map_mul, Algebra.smul_def] at *
state_before: case intro.mk.intro.intro.intro.intro.intro.intro.intro
R : Type ?u.2417
inst✝⁹ : CommRing R
M : Submonoid R
S : Type ?u.2623
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.2877
inst✝⁶ : CommRing P
A : Type u_1
inst✝⁵ : CommRing A
inst✝⁴ : IsDomain A
inst✝³ : UniqueFactorizationMonoid A
K : Type u_2
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
x : K
a' b' c' : A
no_factor : ∀ {d : A}, d ∣ a' → d ∣ b' → IsUnit d
b_nonzero : c' * b' ∈ nonZeroDivisors A
hab : ↑(algebraMap A K) (c' * a') = ↑{ val := c' * b', property := b_nonzero } • x
left✝ : c' ∈ nonZeroDivisors A
b'_nonzero : b' ∈ nonZeroDivisors A
⊢ ↑(algebraMap A K) (c' * b') * mk' K a' { val := b', property := b'_nonzero } = ↑(algebraMap A K) (c' * b') * x

tactic: erw [← hab, mul_assoc, mk'_spec' _ a' ⟨b', b'_nonzero⟩]
state_before: case intro.mk.intro.intro.intro.intro.intro.intro.intro
R : Type ?u.2417
inst✝⁹ : CommRing R
M : Submonoid R
S : Type ?u.2623
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.2877
inst✝⁶ : CommRing P
A : Type u_1
inst✝⁵ : CommRing A
inst✝⁴ : IsDomain A
inst✝³ : UniqueFactorizationMonoid A
K : Type u_2
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
x : K
a' b' c' : A
no_factor : ∀ {d : A}, d ∣ a' → d ∣ b' → IsUnit d
b_nonzero : c' * b' ∈ nonZeroDivisors A
left✝ : c' ∈ nonZeroDivisors A
b'_nonzero : b' ∈ nonZeroDivisors A
hab : ↑(algebraMap A K) c' * ↑(algebraMap A K) a' = ↑(algebraMap A K) c' * ↑(algebraMap A K) b' * x
⊢ ↑(algebraMap A K) c' * ↑(algebraMap A K) b' * mk' K a' { val := b', property := b'_nonzero } =
    ↑(algebraMap A K) c' * ↑(algebraMap A K) b' * x