Theorem: Ideal.finprod_not_dvd
File: Mathlib/RingTheory/DedekindDomain/Factorization.lean

tactic: have hf := finite_mulSupport hI
state_before: R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
⊢ ¬v.asIdeal ^ (Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) + 1) ∣
      ∏ᶠ (v : HeightOneSpectrum R), maxPowDividing v I

tactic: have h_ne_zero : v.maxPowDividing I ≠ 0 := pow_ne_zero _ v.ne_bot
state_before: R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
⊢ ¬v.asIdeal ^ (Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) + 1) ∣
      ∏ᶠ (v : HeightOneSpectrum R), maxPowDividing v I

tactic: rw [← mul_finprod_cond_ne v hf, pow_add, pow_one, finprod_cond_ne _ _ hf]
state_before: R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
h_ne_zero : maxPowDividing v I ≠ 0
⊢ ¬v.asIdeal ^ (Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) + 1) ∣
      ∏ᶠ (v : HeightOneSpectrum R), maxPowDividing v I

tactic: intro h_contr
state_before: R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
h_ne_zero : maxPowDividing v I ≠ 0
⊢ ¬v.asIdeal ^ Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) * v.asIdeal ∣
      maxPowDividing v I * ∏ i in Finset.erase (Finite.toFinset hf) v, maxPowDividing i I

tactic: have hv_prime : Prime v.asIdeal := Ideal.prime_of_isPrime v.ne_bot v.IsPrime
state_before: R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
h_ne_zero : maxPowDividing v I ≠ 0
h_contr :
  v.asIdeal ^ Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) * v.asIdeal ∣
    maxPowDividing v I * ∏ i in Finset.erase (Finite.toFinset hf) v, maxPowDividing i I
⊢ False

tactic: obtain ⟨w, hw, hvw'⟩ :=
  Prime.exists_mem_finset_dvd hv_prime ((mul_dvd_mul_iff_left h_ne_zero).mp h_contr)
state_before: R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
h_ne_zero : maxPowDividing v I ≠ 0
h_contr :
  v.asIdeal ^ Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) * v.asIdeal ∣
    maxPowDividing v I * ∏ i in Finset.erase (Finite.toFinset hf) v, maxPowDividing i I
hv_prime : Prime v.asIdeal
⊢ False

tactic: have hw_prime : Prime w.asIdeal := Ideal.prime_of_isPrime w.ne_bot w.IsPrime
state_before: case intro.intro
R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
h_ne_zero : maxPowDividing v I ≠ 0
h_contr :
  v.asIdeal ^ Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) * v.asIdeal ∣
    maxPowDividing v I * ∏ i in Finset.erase (Finite.toFinset hf) v, maxPowDividing i I
hv_prime : Prime v.asIdeal
w : HeightOneSpectrum R
hw : w ∈ Finset.erase (Finite.toFinset hf) v
hvw' : v.asIdeal ∣ maxPowDividing w I
⊢ False

tactic: have hvw := Prime.dvd_of_dvd_pow hv_prime hvw'
state_before: case intro.intro
R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
h_ne_zero : maxPowDividing v I ≠ 0
h_contr :
  v.asIdeal ^ Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) * v.asIdeal ∣
    maxPowDividing v I * ∏ i in Finset.erase (Finite.toFinset hf) v, maxPowDividing i I
hv_prime : Prime v.asIdeal
w : HeightOneSpectrum R
hw : w ∈ Finset.erase (Finite.toFinset hf) v
hvw' : v.asIdeal ∣ maxPowDividing w I
hw_prime : Prime w.asIdeal
⊢ False

tactic: rw [Prime.dvd_prime_iff_associated hv_prime hw_prime, associated_iff_eq] at hvw
state_before: case intro.intro
R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
h_ne_zero : maxPowDividing v I ≠ 0
h_contr :
  v.asIdeal ^ Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) * v.asIdeal ∣
    maxPowDividing v I * ∏ i in Finset.erase (Finite.toFinset hf) v, maxPowDividing i I
hv_prime : Prime v.asIdeal
w : HeightOneSpectrum R
hw : w ∈ Finset.erase (Finite.toFinset hf) v
hvw' : v.asIdeal ∣ maxPowDividing w I
hw_prime : Prime w.asIdeal
hvw : v.asIdeal ∣ w.asIdeal
⊢ False

tactic: exact (Finset.mem_erase.mp hw).1 (HeightOneSpectrum.ext w v (Eq.symm hvw))
state_before: case intro.intro
R : Type u_1
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
K : Type ?u.235854
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
v : HeightOneSpectrum R
I : Ideal R
hI : I ≠ 0
hf : Set.Finite (mulSupport fun v => maxPowDividing v I)
h_ne_zero : maxPowDividing v I ≠ 0
h_contr :
  v.asIdeal ^ Associates.count (Associates.mk v.asIdeal) (Associates.factors (Associates.mk I)) * v.asIdeal ∣
    maxPowDividing v I * ∏ i in Finset.erase (Finite.toFinset hf) v, maxPowDividing i I
hv_prime : Prime v.asIdeal
w : HeightOneSpectrum R
hw : w ∈ Finset.erase (Finite.toFinset hf) v
hvw' : v.asIdeal ∣ maxPowDividing w I
hw_prime : Prime w.asIdeal
hvw : v.asIdeal = w.asIdeal
⊢ False