Theorem: IsIntegrallyClosed.pow_dvd_pow_iff
File: Mathlib/RingTheory/IntegrallyClosed.lean

tactic: refine ⟨fun ⟨x, hx⟩ ↦ ?_, fun h ↦ pow_dvd_pow_of_dvd h n⟩
state_before: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K : Type u_3
inst✝¹ : CommRing K
inst✝ : Algebra R K
ifr : IsFractionRing R K
n : ℕ
hn : n ≠ 0
a b : R
⊢ a ^ n ∣ b ^ n ↔ a ∣ b
state_after: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K : Type u_3
inst✝¹ : CommRing K
inst✝ : Algebra R K
ifr : IsFractionRing R K
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
⊢ a ∣ b

tactic: by_cases ha : a = 0
state_before: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K : Type u_3
inst✝¹ : CommRing K
inst✝ : Algebra R K
ifr : IsFractionRing R K
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
⊢ a ∣ b
state_after: case pos
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K : Type u_3
inst✝¹ : CommRing K
inst✝ : Algebra R K
ifr : IsFractionRing R K
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
ha : a = 0
⊢ a ∣ b

case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K : Type u_3
inst✝¹ : CommRing K
inst✝ : Algebra R K
ifr : IsFractionRing R K
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
ha : ¬a = 0
⊢ a ∣ b

tactic: let K := FractionRing R
state_before: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K : Type u_3
inst✝¹ : CommRing K
inst✝ : Algebra R K
ifr : IsFractionRing R K
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
ha : ¬a = 0
⊢ a ∣ b
state_after: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
ha : ¬a = 0
K : Type u_1 := FractionRing R
⊢ a ∣ b

tactic: replace ha : algebraMap R K a ≠ 0 := fun h ↦
  ha <| (injective_iff_map_eq_zero _).1 (IsFractionRing.injective R K) _ h
state_before: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
ha : ¬a = 0
K : Type u_1 := FractionRing R
⊢ a ∣ b
state_after: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
⊢ a ∣ b

tactic: let y := (algebraMap R K b) / (algebraMap R K a)
state_before: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
⊢ a ∣ b
state_after: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
⊢ a ∣ b

tactic: have hy : IsIntegral R y := by
  refine ⟨X ^ n - C x, monic_X_pow_sub_C _ hn, ?_⟩
  simp only [y, map_pow, eval₂_sub, eval₂_X_pow, div_pow, eval₂_pow', eval₂_C]
  replace hx := congr_arg (algebraMap R K) hx
  rw [map_pow] at hx
  field_simp [hx, ha]
state_before: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
⊢ a ∣ b
state_after: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hy : IsIntegral R y
⊢ a ∣ b

tactic: obtain ⟨k, hk⟩ := algebraMap_eq_of_integral hy
state_before: case neg
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hy : IsIntegral R y
⊢ a ∣ b
state_after: case neg.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hy : IsIntegral R y
k : R
hk : (algebraMap R K) k = y
⊢ a ∣ b

tactic: refine ⟨k, IsFractionRing.injective R K ?_⟩
state_before: case neg.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hy : IsIntegral R y
k : R
hk : (algebraMap R K) k = y
⊢ a ∣ b
state_after: case neg.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hy : IsIntegral R y
k : R
hk : (algebraMap R K) k = y
⊢ (algebraMap R K) b = (algebraMap R K) (a * k)

tactic: rw [map_mul, hk, mul_div_cancel₀ _ ha]
state_before: case neg.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hy : IsIntegral R y
k : R
hk : (algebraMap R K) k = y
⊢ (algebraMap R K) b = (algebraMap R K) (a * k)
state_after: no goals

tactic: simpa [ha, hn] using hx
state_before: case pos
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K : Type u_3
inst✝¹ : CommRing K
inst✝ : Algebra R K
ifr : IsFractionRing R K
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
ha : a = 0
⊢ a ∣ b
state_after: no goals

tactic: refine ⟨X ^ n - C x, monic_X_pow_sub_C _ hn, ?_⟩
state_before: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
⊢ IsIntegral R y
state_after: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
⊢ eval₂ (algebraMap R K) y (X ^ n - C x) = 0

tactic: simp only [y, map_pow, eval₂_sub, eval₂_X_pow, div_pow, eval₂_pow', eval₂_C]
state_before: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
⊢ eval₂ (algebraMap R K) y (X ^ n - C x) = 0
state_after: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
⊢ (algebraMap R K) b ^ n / (algebraMap R K) a ^ n - (algebraMap R K) x = 0

tactic: replace hx := congr_arg (algebraMap R K) hx
state_before: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
hx : b ^ n = a ^ n * x
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
⊢ (algebraMap R K) b ^ n / (algebraMap R K) a ^ n - (algebraMap R K) x = 0
state_after: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hx : (algebraMap R K) (b ^ n) = (algebraMap R K) (a ^ n * x)
⊢ (algebraMap R K) b ^ n / (algebraMap R K) a ^ n - (algebraMap R K) x = 0

tactic: rw [map_pow] at hx
state_before: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hx : (algebraMap R K) (b ^ n) = (algebraMap R K) (a ^ n * x)
⊢ (algebraMap R K) b ^ n / (algebraMap R K) a ^ n - (algebraMap R K) x = 0
state_after: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hx : (algebraMap R K) b ^ n = (algebraMap R K) (a ^ n * x)
⊢ (algebraMap R K) b ^ n / (algebraMap R K) a ^ n - (algebraMap R K) x = 0

tactic: field_simp [hx, ha]
state_before: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
id : IsDomain R
iic : IsIntegrallyClosed R
K✝ : Type u_3
inst✝¹ : CommRing K✝
inst✝ : Algebra R K✝
ifr : IsFractionRing R K✝
n : ℕ
hn : n ≠ 0
a b : R
x✝ : a ^ n ∣ b ^ n
x : R
K : Type u_1 := FractionRing R
ha : (algebraMap R K) a ≠ 0
y : K := (algebraMap R K) b / (algebraMap R K) a
hx : (algebraMap R K) b ^ n = (algebraMap R K) (a ^ n * x)
⊢ (algebraMap R K) b ^ n / (algebraMap R K) a ^ n - (algebraMap R K) x = 0
state_after: no goals