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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
⊢ ∑ P in Multiset.toFinset (factors (map (algebraMap R S) p)),
      ramificationIdx (algebraMap R S) p 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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
⊢ ∑ P in Multiset.toFinset (factors (map (algebraMap R S) p)), e P * inertiaDeg (algebraMap R S) p 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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
⊢ ∑ P in Multiset.toFinset (factors (map (algebraMap R S) p)), 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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ↑(algebraMap R L)
⊢ ∑ P in Multiset.toFinset (factors (map (algebraMap R S) p)), e P * f P = finrank K L

tactic: calc
  (∑ P in (factors (map (algebraMap R S) p)).toFinset, e P * f P) =
      ∑ P in (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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ↑(algebraMap R L)
inj_RS : Function.Injective ↑(algebraMap R S)
⊢ ∑ P in Multiset.toFinset (factors (map (algebraMap R S) p)), e P * f 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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
⊢ Function.Injective ↑(algebraMap R L)

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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
⊢ Function.Injective (↑(algebraMap K L) ∘ ↑(algebraMap R K))

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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ↑(algebraMap R L)
⊢ Function.Injective ↑(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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ↑(algebraMap R L)
⊢ Function.Injective (↑(algebraMap S L) ∘ ↑(algebraMap R S))

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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ↑(algebraMap R L)
⊢ Function.Injective ↑(algebraMap R L)

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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ↑(algebraMap R L)
inj_RS : Function.Injective ↑(algebraMap R S)
⊢ ∑ P in Multiset.toFinset (factors (map (algebraMap R S) p)), e P * f P =
    ∑ P in Finset.attach (Multiset.toFinset (factors (map (algebraMap R S) p))), 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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ↑(algebraMap R L)
inj_RS : Function.Injective ↑(algebraMap R S)
⊢ ∑ x in Finset.attach (Multiset.toFinset (factors (map (algebraMap R S) p))), e ↑x * f ↑x =
    ∑ P in Finset.attach (Multiset.toFinset (factors (map (algebraMap R S) 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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := inertiaDeg (algebraMap R S) p
inj_RL : Function.Injective ↑(algebraMap R L)
inj_RS : Function.Injective ↑(algebraMap R S)
P : { x // x ∈ Multiset.toFinset (factors (map (algebraMap R S) p)) }
x✝ : P ∈ Finset.attach (Multiset.toFinset (factors (map (algebraMap R S) p)))
⊢ e ↑P * f ↑P = finrank (R ⧸ p) (S ⧸ ↑P ^ e ↑P)

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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := 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 ∈ Multiset.toFinset (factors (map (algebraMap R S) p)) }) → S ⧸ ↑P ^ e ↑P) =
    finrank (R ⧸ p) (S ⧸ map (algebraMap R S) p)

tactic: rwa [Ne.def, 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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := 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: 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✝¹⁷ : IsDomain S
inst✝¹⁶ : IsDedekindDomain S
inst✝¹⁵ : Algebra R S
K : Type u_1
L : Type u_2
inst✝¹⁴ : Field K
inst✝¹³ : Field L
inst✝¹² : IsDomain R
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✝ : IsMaximal p
hp0 : p ≠ ⊥
e : Ideal S → ℕ := ramificationIdx (algebraMap R S) p
f : Ideal S → [inst : IsMaximal p] → ℕ := 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