Theorem: PowerSeries.order_eq_multiplicity_X
File: Mathlib/RingTheory/PowerSeries/Order.lean

tactic: rcases eq_or_ne φ 0 with (rfl | hφ)
state_before: R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
⊢ φ.order = multiplicity X φ
state_after: case inl
R✝ : Type u_1
inst✝² : Semiring R✝
φ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
⊢ order 0 = multiplicity X 0

case inr
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
⊢ φ.order = multiplicity X φ

tactic: induction' ho : order φ using PartENat.casesOn with n
state_before: case inr
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
⊢ φ.order = multiplicity X φ
state_after: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
ho : φ.order = ⊤
⊢ ⊤ = multiplicity X φ

case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
⊢ ↑n = multiplicity X φ

tactic: have hn : φ.order.get (order_finite_iff_ne_zero.mpr hφ) = n := by simp [ho]
state_before: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
⊢ ↑n = multiplicity X φ
state_after: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
⊢ ↑n = multiplicity X φ

tactic: rw [← hn]
state_before: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
⊢ ↑n = multiplicity X φ
state_after: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
⊢ ↑(φ.order.get ⋯) = multiplicity X φ

tactic: refine
  le_antisymm (le_multiplicity_of_pow_dvd <| X_pow_order_dvd (order_finite_iff_ne_zero.mpr hφ))
    (PartENat.find_le _ _ ?_)
state_before: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
⊢ ↑(φ.order.get ⋯) = multiplicity X φ
state_after: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
⊢ ¬X ^ (φ.order.get ⋯ + 1) ∣ φ

tactic: rintro ⟨ψ, H⟩
state_before: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
⊢ ¬X ^ (φ.order.get ⋯ + 1) ∣ φ
state_after: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
⊢ False

tactic: have := congr_arg (coeff R n) H
state_before: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
⊢ False
state_after: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (X ^ (φ.order.get ⋯ + 1) * ψ)
⊢ False

tactic: rw [← (ψ.commute_X.pow_right _).eq, coeff_mul_of_lt_order, ← hn] at this
state_before: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (X ^ (φ.order.get ⋯ + 1) * ψ)
⊢ False
state_after: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R (φ.order.get ⋯)) φ = 0
⊢ False

case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
⊢ ↑n < (X ^ (φ.order.get ⋯ + 1)).order

tactic: simp
state_before: case inl
R✝ : Type u_1
inst✝² : Semiring R✝
φ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
⊢ order 0 = multiplicity X 0
state_after: no goals

tactic: simp [hφ] at ho
state_before: case inr.a
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
ho : φ.order = ⊤
⊢ ⊤ = multiplicity X φ
state_after: no goals

tactic: simp [ho]
state_before: R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
⊢ φ.order.get ⋯ = n
state_after: no goals

tactic: exact coeff_order _ this
state_before: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R (φ.order.get ⋯)) φ = 0
⊢ False
state_after: no goals

tactic: rw [X_pow_eq, order_monomial]
state_before: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
⊢ ↑n < (X ^ (φ.order.get ⋯ + 1)).order
state_after: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
⊢ ↑n < if 1 = 0 then ⊤ else ↑(φ.order.get ⋯ + 1)

tactic: split_ifs
state_before: case inr.a.intro
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
⊢ ↑n < if 1 = 0 then ⊤ else ↑(φ.order.get ⋯ + 1)
state_after: case pos
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
h✝ : 1 = 0
⊢ ↑n < ⊤

case neg
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
h✝ : ¬1 = 0
⊢ ↑n < ↑(φ.order.get ⋯ + 1)

tactic: exact PartENat.natCast_lt_top _
state_before: case pos
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
h✝ : 1 = 0
⊢ ↑n < ⊤
state_after: no goals

tactic: rw [← hn, PartENat.coe_lt_coe]
state_before: case neg
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
h✝ : ¬1 = 0
⊢ ↑n < ↑(φ.order.get ⋯ + 1)
state_after: case neg
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
h✝ : ¬1 = 0
⊢ φ.order.get ⋯ < φ.order.get ⋯ + 1

tactic: exact Nat.lt_succ_self _
state_before: case neg
R✝ : Type u_1
inst✝² : Semiring R✝
φ✝ : R✝⟦X⟧
R : Type u_2
inst✝¹ : Semiring R
inst✝ : DecidableRel fun x x_1 => x ∣ x_1
φ : R⟦X⟧
hφ : φ ≠ 0
n : ℕ
ho : φ.order = ↑n
hn : φ.order.get ⋯ = n
ψ : R⟦X⟧
H : φ = X ^ (φ.order.get ⋯ + 1) * ψ
this : (coeff R n) φ = (coeff R n) (ψ * X ^ (φ.order.get ⋯ + 1))
h✝ : ¬1 = 0
⊢ φ.order.get ⋯ < φ.order.get ⋯ + 1
state_after: no goals