Theorem: FractionalIdeal.finprod_heightOneSpectrum_factorization'
File: Mathlib/RingTheory/DedekindDomain/Factorization.lean

Proof steps:
state_before: R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
⊢ ∏ᶠ (v : HeightOneSpectrum R), ↑v.asIdeal ^ count K v I = I
state_after: R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
⊢ ∏ᶠ (v : HeightOneSpectrum R), ↑v.asIdeal ^ count K v I = I
tactic: have h := (choose_spec (choose_spec (exists_eq_spanSingleton_mul I))).2
state_before: R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
⊢ ∏ᶠ (v : HeightOneSpectrum R), ↑v.asIdeal ^ count K v I = I
state_after: R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
⊢ ∏ᶠ (v : HeightOneSpectrum R), ↑v.asIdeal ^ count K v I =
    ∏ᶠ (v : HeightOneSpectrum R),
      ↑v.asIdeal ^
        (↑((Associates.mk v.asIdeal).count (Associates.mk (choose ⋯)).factors) -
          ↑((Associates.mk v.asIdeal).count (Associates.mk (Ideal.span {choose ⋯})).factors))
tactic: conv_rhs => rw [← finprod_heightOneSpectrum_factorization hI h]
state_before: R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
⊢ ∏ᶠ (v : HeightOneSpectrum R), ↑v.asIdeal ^ count K v I =
    ∏ᶠ (v : HeightOneSpectrum R),
      ↑v.asIdeal ^
        (↑((Associates.mk v.asIdeal).count (Associates.mk (choose ⋯)).factors) -
          ↑((Associates.mk v.asIdeal).count (Associates.mk (Ideal.span {choose ⋯})).factors))
state_after: case h
R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
⊢ ∀ (x : HeightOneSpectrum R),
    ↑x.asIdeal ^ count K x I =
      ↑x.asIdeal ^
        (↑((Associates.mk x.asIdeal).count (Associates.mk (choose ⋯)).factors) -
          ↑((Associates.mk x.asIdeal).count (Associates.mk (Ideal.span {choose ⋯})).factors))
tactic: apply finprod_congr
state_before: case h
R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
⊢ ∀ (x : HeightOneSpectrum R),
    ↑x.asIdeal ^ count K x I =
      ↑x.asIdeal ^
        (↑((Associates.mk x.asIdeal).count (Associates.mk (choose ⋯)).factors) -
          ↑((Associates.mk x.asIdeal).count (Associates.mk (Ideal.span {choose ⋯})).factors))
state_after: case h
R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
w : HeightOneSpectrum R
⊢ ↑w.asIdeal ^ count K w I =
    ↑w.asIdeal ^
      (↑((Associates.mk w.asIdeal).count (Associates.mk (choose ⋯)).factors) -
        ↑((Associates.mk w.asIdeal).count (Associates.mk (Ideal.span {choose ⋯})).factors))
tactic: intro w
state_before: case h
R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
w : HeightOneSpectrum R
⊢ ↑w.asIdeal ^ count K w I =
    ↑w.asIdeal ^
      (↑((Associates.mk w.asIdeal).count (Associates.mk (choose ⋯)).factors) -
        ↑((Associates.mk w.asIdeal).count (Associates.mk (Ideal.span {choose ⋯})).factors))
state_after: case h.h
R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
w : HeightOneSpectrum R
⊢ count K w I =
    ↑((Associates.mk w.asIdeal).count (Associates.mk (choose ⋯)).factors) -
      ↑((Associates.mk w.asIdeal).count (Associates.mk (Ideal.span {choose ⋯})).factors)
tactic: apply congr_arg
state_before: case h.h
R : Type u_1
inst✝⁴ : CommRing R
K : Type u_2
inst✝³ : Field K
inst✝² : Algebra R K
inst✝¹ : IsFractionRing R K
inst✝ : IsDedekindDomain R
v : HeightOneSpectrum R
I : FractionalIdeal R⁰ K
hI : I ≠ 0
h : I = spanSingleton R⁰ ((algebraMap R K) (choose ⋯))⁻¹ * ↑(choose ⋯)
w : HeightOneSpectrum R
⊢ count K w I =
    ↑((Associates.mk w.asIdeal).count (Associates.mk (choose ⋯)).factors) -
      ↑((Associates.mk w.asIdeal).count (Associates.mk (Ideal.span {choose ⋯})).factors)
state_after: no goals
tactic: rw [count_ne_zero K w hI]