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

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 ≠ ⊥
⊢ ∑ 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 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
⊢ ∑ 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: 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
⊢ ∑ 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_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)
⊢ ∑ 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: 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 := ?_
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: rw [IsScalarTower.algebraMap_eq R K L, RingHom.coe_comp]
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
⊢ Function.Injective ⇑(algebraMap R 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
⊢ Function.Injective (⇑(algebraMap K L) ∘ ⇑(algebraMap R K))

tactic: 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
⊢ Function.Injective (⇑(algebraMap K L) ∘ ⇑(algebraMap R K))
state_after: no goals

tactic: refine Function.Injective.of_comp (show Function.Injective (algebraMap S L ∘ _) from ?_)
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)
⊢ Function.Injective ⇑(algebraMap R S)
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)
⊢ Function.Injective (⇑(algebraMap S L) ∘ ⇑(algebraMap R S))

tactic: rw [← RingHom.coe_comp, ← IsScalarTower.algebraMap_eq]
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)
⊢ Function.Injective (⇑(algebraMap S L) ∘ ⇑(algebraMap R S))
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)
⊢ Function.Injective ⇑(algebraMap R L)

tactic: 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)
⊢ Function.Injective ⇑(algebraMap R L)
state_after: no goals

tactic: rw [← Finset.sum_attach]
state_before: 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)
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)
⊢ ∑ x ∈ (factors (map (algebraMap R S) p)).toFinset.attach, e ↑x * f ↑x =
    ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset.attach, finrank (R ⧸ p) (S ⧸ ↑P ^ e ↑P)

tactic: refine Finset.sum_congr rfl fun P _ => ?_
state_before: 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)
⊢ ∑ x ∈ (factors (map (algebraMap R S) p)).toFinset.attach, e ↑x * f ↑x =
    ∑ P ∈ (factors (map (algebraMap R S) p)).toFinset.attach, finrank (R ⧸ p) (S ⧸ ↑P ^ e ↑P)
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 : { x // x ∈ (factors (map (algebraMap R S) p)).toFinset }
x✝ : P ∈ (factors (map (algebraMap R S) p)).toFinset.attach
⊢ e ↑P * f ↑P = finrank (R ⧸ p) (S ⧸ ↑P ^ e ↑P)

tactic: rw [Factors.finrank_pow_ramificationIdx]
state_before: 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 : { x // x ∈ (factors (map (algebraMap R S) p)).toFinset }
x✝ : P ∈ (factors (map (algebraMap R S) p)).toFinset.attach
⊢ e ↑P * f ↑P = finrank (R ⧸ p) (S ⧸ ↑P ^ e ↑P)
state_after: no goals

tactic: refine LinearEquiv.finrank_eq (Factors.piQuotientLinearEquiv S p ?_).symm
state_before: 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)
state_after: 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)
⊢ map (algebraMap R S) p ≠ ⊥

tactic: rwa [Ne, Ideal.map_eq_bot_iff_le_ker, (RingHom.injective_iff_ker_eq_bot _).mp inj_RS,
  le_bot_iff]
state_before: 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)
⊢ map (algebraMap R S) p ≠ ⊥
state_after: no goals

tactic: exact finrank_quotient_map p K L
state_before: 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
state_after: no goals