Theorem: Ideal.sum_ramification_inertia
File: Mathlib/NumberTheory/RamificationInertia.lean

Proof steps:
state_before: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset,
      ramificationIdx (algebraMap R S) p P * inertiaDeg (algebraMap R S) p P =
    finrank K L
state_after: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * inertiaDeg (algebraMap R S) p P = finrank K L
tactic: set e := ramificationIdx (algebraMap R S) p
state_before: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * inertiaDeg (algebraMap R S) p P = finrank K L
state_after: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * f P = finrank K L
tactic: set f := inertiaDeg (algebraMap R S) p
state_before: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * f P = finrank K L
state_after: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ⇑(algebraMap R L)
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * f P = finrank K L
tactic: have inj_RL : Function.Injective (algebraMap R L) := by
    rw [IsScalarTower.algebraMap_eq R K L, RingHom.coe_comp]
    exact (RingHom.injective _).comp (IsFractionRing.injective R K)
state_before: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ⇑(algebraMap R L)
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * f P = finrank K L
state_after: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ⇑(algebraMap R L)
inj_RS : Function.Injective ⇑(algebraMap R S)
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * f P = finrank K L
tactic: have inj_RS : Function.Injective (algebraMap R S) := by
    refine Function.Injective.of_comp (show Function.Injective (algebraMap S L ∘ _) from ?_)
    rw [← RingHom.coe_comp, ← IsScalarTower.algebraMap_eq]
    exact inj_RL
state_before: R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ⇑(algebraMap R L)
inj_RS : Function.Injective ⇑(algebraMap R S)
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * f P = finrank K L
state_after: case calc_1
R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ⇑(algebraMap R L)
inj_RS : Function.Injective ⇑(algebraMap R S)
⊢ ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * f P =
    ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset.attach, finrank (R ⧸ p) (S ⧸ ↑P ^ e ↑P)

case calc_2
R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ⇑(algebraMap R L)
inj_RS : Function.Injective ⇑(algebraMap R S)
⊢ finrank (R ⧸ p) ((P : { x // x ∈ (factors (map (algebraMap R S) p)).toFinset }) → S ⧸ ↑P ^ e ↑P) =
    finrank (R ⧸ p) (S ⧸ map (algebraMap R S) p)

case calc_3
R : Type u
inst✝¹⁷ : CommRing R
S : Type v
inst✝¹⁶ : CommRing S
f✝ : R →+* S
p : Ideal R
P : Ideal S
inst✝¹⁵ : IsDedekindDomain S
inst✝¹⁴ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹³ : Field K
inst✝¹² : Field L
inst✝¹¹ : IsDedekindDomain R
inst✝¹⁰ : Algebra R K
inst✝⁹ : IsFractionRing R K
inst✝⁸ : Algebra S L
inst✝⁷ : IsFractionRing S L
inst✝⁶ : Algebra K L
inst✝⁵ : Algebra R L
inst✝⁴ : IsScalarTower R S L
inst✝³ : IsScalarTower R K L
inst✝² : IsNoetherian R S
inst✝¹ : IsIntegralClosure S R L
inst✝ : p.IsMaximal
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : p.IsMaximal] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ⇑(algebraMap R L)
inj_RS : Function.Injective ⇑(algebraMap R S)
⊢ finrank (R ⧸ p) (S ⧸ map (algebraMap R S) p) = finrank K L
tactic: calc
    (∑ P ∈ (factors (map (algebraMap R S) p)).toFinset, e P * f P) =
        ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset.attach,
          finrank (R ⧸ p) (S ⧸ (P : Ideal S) ^ e P) := ?_
    _ = finrank (R ⧸ p)
          (∀ P : (factors (map (algebraMap R S) p)).toFinset, S ⧸ (P : Ideal S) ^ e P) :=
      (finrank_pi_fintype (R ⧸ p)).symm
    _ = finrank (R ⧸ p) (S ⧸ map (algebraMap R S) p) := ?_
    _ = finrank K L := ?_