Theorem: cardQuot_mul_of_coprime
File: Mathlib/RingTheory/Ideal/Norm.lean

tactic: let b := Module.Free.chooseBasis ℤ S
state_before: S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: cases isEmpty_or_nonempty (Module.Free.ChooseBasisIndex ℤ S)
state_before: S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case inl
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : IsEmpty (Module.Free.ChooseBasisIndex ℤ S)
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

case inr
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: haveI : Infinite S := Infinite.of_surjective _ b.repr.toEquiv.surjective
state_before: case inr
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case inr
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: by_cases hI : I = ⊥
state_before: case inr
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case pos
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : I = ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : ¬I = ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: by_cases hJ : J = ⊥
state_before: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : ¬I = ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case pos
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : ¬I = ⊥
hJ : J = ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: have hIJ : I * J ≠ ⊥ := mt Ideal.mul_eq_bot.mp (not_or_of_not hI hJ)
state_before: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: letI := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
state_before: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this✝ : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
this : DecidableEq (Module.Free.ChooseBasisIndex ℤ S) := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: letI := I.fintypeQuotientOfFreeOfNeBot hI
state_before: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this✝ : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
this : DecidableEq (Module.Free.ChooseBasisIndex ℤ S) := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this✝¹ : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
this✝ : DecidableEq (Module.Free.ChooseBasisIndex ℤ S) := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
this : Fintype (S ⧸ I) := I.fintypeQuotientOfFreeOfNeBot hI
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: letI := J.fintypeQuotientOfFreeOfNeBot hJ
state_before: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this✝¹ : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
this✝ : DecidableEq (Module.Free.ChooseBasisIndex ℤ S) := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
this : Fintype (S ⧸ I) := I.fintypeQuotientOfFreeOfNeBot hI
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this✝² : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
this✝¹ : DecidableEq (Module.Free.ChooseBasisIndex ℤ S) := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
this✝ : Fintype (S ⧸ I) := I.fintypeQuotientOfFreeOfNeBot hI
this : Fintype (S ⧸ J) := J.fintypeQuotientOfFreeOfNeBot hJ
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: letI := (I * J).fintypeQuotientOfFreeOfNeBot hIJ
state_before: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this✝² : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
this✝¹ : DecidableEq (Module.Free.ChooseBasisIndex ℤ S) := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
this✝ : Fintype (S ⧸ I) := I.fintypeQuotientOfFreeOfNeBot hI
this : Fintype (S ⧸ J) := J.fintypeQuotientOfFreeOfNeBot hJ
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this✝³ : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
this✝² : DecidableEq (Module.Free.ChooseBasisIndex ℤ S) := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
this✝¹ : Fintype (S ⧸ I) := I.fintypeQuotientOfFreeOfNeBot hI
this✝ : Fintype (S ⧸ J) := J.fintypeQuotientOfFreeOfNeBot hJ
this : Fintype (S ⧸ I * J) := (I * J).fintypeQuotientOfFreeOfNeBot hIJ
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: rw [cardQuot_apply, cardQuot_apply, cardQuot_apply,
  Fintype.card_eq.mpr ⟨(Ideal.quotientMulEquivQuotientProd I J coprime).toEquiv⟩,
  Fintype.card_prod]
state_before: case neg
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this✝³ : Infinite S
hI : ¬I = ⊥
hJ : ¬J = ⊥
hIJ : I * J ≠ ⊥
this✝² : DecidableEq (Module.Free.ChooseBasisIndex ℤ S) := Classical.decEq (Module.Free.ChooseBasisIndex ℤ S)
this✝¹ : Fintype (S ⧸ I) := I.fintypeQuotientOfFreeOfNeBot hI
this✝ : Fintype (S ⧸ J) := J.fintypeQuotientOfFreeOfNeBot hJ
this : Fintype (S ⧸ I * J) := (I * J).fintypeQuotientOfFreeOfNeBot hIJ
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: no goals

tactic: haveI : Subsingleton S := Function.Surjective.subsingleton b.repr.toEquiv.symm.surjective
state_before: case inl
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : IsEmpty (Module.Free.ChooseBasisIndex ℤ S)
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case inl
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : IsEmpty (Module.Free.ChooseBasisIndex ℤ S)
this : Subsingleton S
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: nontriviality S
state_before: case inl
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : IsEmpty (Module.Free.ChooseBasisIndex ℤ S)
this : Subsingleton S
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case inl
S : Type u_1
inst✝⁴ : CommRing S
inst✝³ : IsDomain S
inst✝² : Module.Free ℤ S
inst✝¹ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : IsEmpty (Module.Free.ChooseBasisIndex ℤ S)
this : Subsingleton S
inst✝ : Nontrivial S
⊢ cardQuot (I * J) = cardQuot I * cardQuot J

tactic: exfalso
state_before: case inl
S : Type u_1
inst✝⁴ : CommRing S
inst✝³ : IsDomain S
inst✝² : Module.Free ℤ S
inst✝¹ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : IsEmpty (Module.Free.ChooseBasisIndex ℤ S)
this : Subsingleton S
inst✝ : Nontrivial S
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: case inl
S : Type u_1
inst✝⁴ : CommRing S
inst✝³ : IsDomain S
inst✝² : Module.Free ℤ S
inst✝¹ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : IsEmpty (Module.Free.ChooseBasisIndex ℤ S)
this : Subsingleton S
inst✝ : Nontrivial S
⊢ False

tactic: exact not_nontrivial_iff_subsingleton.mpr ‹Subsingleton S› ‹Nontrivial S›
state_before: case inl
S : Type u_1
inst✝⁴ : CommRing S
inst✝³ : IsDomain S
inst✝² : Module.Free ℤ S
inst✝¹ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : IsEmpty (Module.Free.ChooseBasisIndex ℤ S)
this : Subsingleton S
inst✝ : Nontrivial S
⊢ False
state_after: no goals

tactic: rw [hI, Submodule.bot_mul, cardQuot_bot, zero_mul]
state_before: case pos
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : I = ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: no goals

tactic: rw [hJ, Submodule.mul_bot, cardQuot_bot, mul_zero]
state_before: case pos
S : Type u_1
inst✝³ : CommRing S
inst✝² : IsDomain S
inst✝¹ : Module.Free ℤ S
inst✝ : Module.Finite ℤ S
I J : Ideal S
coprime : IsCoprime I J
b : Basis (Module.Free.ChooseBasisIndex ℤ S) ℤ S := Module.Free.chooseBasis ℤ S
h✝ : Nonempty (Module.Free.ChooseBasisIndex ℤ S)
this : Infinite S
hI : ¬I = ⊥
hJ : J = ⊥
⊢ cardQuot (I * J) = cardQuot I * cardQuot J
state_after: no goals