Skip to content

Commit 2a95018

Browse files
committed
feat: Define intNorm and intTrace. (#9265)
Co-authored-by: Andrew Yang <36414270+erdOne@users.noreply.github.com>
1 parent 420479f commit 2a95018

File tree

3 files changed

+415
-28
lines changed

3 files changed

+415
-28
lines changed

Mathlib/RingTheory/IntegralRestrict.lean

Lines changed: 343 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Andrew Yang
55
-/
66
import Mathlib.RingTheory.IntegrallyClosed
7-
import Mathlib.RingTheory.Norm
7+
import Mathlib.RingTheory.LocalProperties
8+
import Mathlib.RingTheory.Localization.NormTrace
9+
import Mathlib.RingTheory.Localization.LocalizationLocalization
810
import Mathlib.RingTheory.DedekindDomain.IntegralClosure
911
/-!
1012
# Restriction of various maps between fields to integrally closed subrings.
@@ -15,9 +17,10 @@ We call this the AKLB setup.
1517
1618
## Main definition
1719
- `galRestrict`: The restriction `Aut(L/K) → Aut(B/A)` as an `MulEquiv` in an AKLB setup.
18-
19-
## TODO
20-
Define the restriction of norms and traces.
20+
- `Algebra.intTrace`: The trace map of a finite extension of integrally closed domains `B/A` is
21+
defined to be the restriction of the trace map of `Frac(B)/Frac(A)`.
22+
- `Algebra.intNorm`: The norm map of a finite extension of integrally closed domains `B/A` is
23+
defined to be the restriction of the norm map of `Frac(B)/Frac(A)`.
2124
2225
-/
2326
open BigOperators nonZeroDivisors
@@ -27,6 +30,8 @@ variable (A K L B : Type*) [CommRing A] [CommRing B] [Algebra A B] [Field K] [Fi
2730
[Algebra K L] [Algebra A L] [IsScalarTower A B L] [IsScalarTower A K L]
2831
[IsIntegralClosure B A L] [FiniteDimensional K L]
2932

33+
section galois
34+
3035
/-- The lift `End(B/A) → End(L/K)` in an ALKB setup.
3136
This is inverse to the restriction. See `galRestrictHom`. -/
3237
noncomputable
@@ -119,3 +124,337 @@ lemma prod_galRestrict_eq_norm [IsGalois K L] [IsIntegrallyClosed A] (x : B) :
119124
rw [← IsScalarTower.algebraMap_apply, IsScalarTower.algebraMap_eq A K L]
120125
simp only [map_prod, algebraMap_galRestrict_apply, IsIntegralClosure.algebraMap_mk',
121126
Algebra.norm_eq_prod_automorphisms, AlgHom.coe_coe, RingHom.coe_comp, Function.comp_apply]
127+
128+
end galois
129+
130+
attribute [local instance] FractionRing.liftAlgebra FractionRing.isScalarTower_liftAlgebra
131+
132+
noncomputable
133+
instance (priority := 900) [IsDomain A] [IsDomain B] [IsIntegrallyClosed B]
134+
[Module.Finite A B] [NoZeroSMulDivisors A B] : Fintype (B ≃ₐ[A] B) :=
135+
haveI : IsIntegralClosure B A (FractionRing B) :=
136+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
137+
haveI : IsLocalization (Algebra.algebraMapSubmonoid B A⁰) (FractionRing B) :=
138+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
139+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
140+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
141+
Module.Finite_of_isLocalization A B _ _ A⁰
142+
Fintype.ofEquiv _ (galRestrict A (FractionRing A) (FractionRing B) B).toEquiv
143+
144+
variable {Aₘ Bₘ} [CommRing Aₘ] [CommRing Bₘ] [Algebra Aₘ Bₘ] [Algebra A Aₘ] [Algebra B Bₘ]
145+
variable [Algebra A Bₘ] [IsScalarTower A Aₘ Bₘ] [IsScalarTower A B Bₘ]
146+
variable (M : Submonoid A) [IsLocalization M Aₘ]
147+
variable [IsLocalization (Algebra.algebraMapSubmonoid B M) Bₘ]
148+
149+
section trace
150+
151+
/-- The restriction of the trace on `L/K` restricted onto `B/A` in an AKLB setup.
152+
See `Algebra.intTrace` instead. -/
153+
noncomputable
154+
def Algebra.intTraceAux [IsIntegrallyClosed A] :
155+
B →ₗ[A] A :=
156+
(IsIntegralClosure.equiv A (integralClosure A K) K A).toLinearMap.comp
157+
((((Algebra.trace K L).restrictScalars A).comp
158+
(IsScalarTower.toAlgHom A B L).toLinearMap).codRestrict
159+
(Subalgebra.toSubmodule <| integralClosure A K) (fun x ↦ isIntegral_trace
160+
(IsIntegral.algebraMap (IsIntegralClosure.isIntegral A L x))))
161+
162+
variable {A K L B}
163+
164+
lemma Algebra.map_intTraceAux [IsIntegrallyClosed A] (x : B) :
165+
algebraMap A K (Algebra.intTraceAux A K L B x) = Algebra.trace K L (algebraMap B L x) :=
166+
IsIntegralClosure.algebraMap_equiv A (integralClosure A K) K A _
167+
168+
variable (A B)
169+
170+
variable [IsDomain A] [IsIntegrallyClosed A] [IsDomain B] [IsIntegrallyClosed B]
171+
variable [Module.Finite A B] [NoZeroSMulDivisors A B]
172+
173+
/-- The trace of a finite extension of integrally closed domains `B/A` is the restriction of
174+
the trace on `Frac(B)/Frac(A)` onto `B/A`. See `Algebra.algebraMap_intTrace`. -/
175+
noncomputable
176+
def Algebra.intTrace : B →ₗ[A] A :=
177+
haveI : IsIntegralClosure B A (FractionRing B) :=
178+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite _ _)
179+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
180+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
181+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
182+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
183+
Module.Finite_of_isLocalization A B _ _ A⁰
184+
Algebra.intTraceAux A (FractionRing A) (FractionRing B) B
185+
186+
variable {A B}
187+
188+
lemma Algebra.algebraMap_intTrace (x : B) :
189+
algebraMap A K (Algebra.intTrace A B x) = Algebra.trace K L (algebraMap B L x) := by
190+
haveI : IsIntegralClosure B A (FractionRing B) :=
191+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
192+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
193+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
194+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
195+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
196+
Module.Finite_of_isLocalization A B _ _ A⁰
197+
haveI := IsIntegralClosure.isFractionRing_of_finite_extension A K L B
198+
apply (FractionRing.algEquiv A K).symm.injective
199+
rw [AlgEquiv.commutes, Algebra.intTrace, Algebra.map_intTraceAux,
200+
← AlgEquiv.commutes (FractionRing.algEquiv B L)]
201+
apply Algebra.trace_eq_of_equiv_equiv (FractionRing.algEquiv A K).toRingEquiv
202+
(FractionRing.algEquiv B L).toRingEquiv
203+
apply IsLocalization.ringHom_ext A⁰
204+
simp only [AlgEquiv.toRingEquiv_eq_coe, ← AlgEquiv.coe_ringHom_commutes, RingHom.comp_assoc,
205+
AlgHom.comp_algebraMap_of_tower, ← IsScalarTower.algebraMap_eq, RingHom.comp_assoc]
206+
207+
lemma Algebra.algebraMap_intTrace_fractionRing (x : B) :
208+
algebraMap A (FractionRing A) (Algebra.intTrace A B x) =
209+
Algebra.trace (FractionRing A) (FractionRing B) (algebraMap B _ x) := by
210+
haveI : IsIntegralClosure B A (FractionRing B) :=
211+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
212+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
213+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
214+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
215+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
216+
Module.Finite_of_isLocalization A B _ _ A⁰
217+
exact Algebra.map_intTraceAux x
218+
219+
variable (A B)
220+
221+
lemma Algebra.intTrace_eq_trace [Module.Free A B] : Algebra.intTrace A B = Algebra.trace A B := by
222+
ext x
223+
haveI : IsIntegralClosure B A (FractionRing B) :=
224+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
225+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
226+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
227+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
228+
apply IsFractionRing.injective A (FractionRing A)
229+
rw [Algebra.algebraMap_intTrace_fractionRing, Algebra.trace_localization A A⁰]
230+
231+
open nonZeroDivisors
232+
233+
variable [IsDomain Aₘ] [IsIntegrallyClosed Aₘ] [IsDomain Bₘ] [IsIntegrallyClosed Bₘ]
234+
variable [NoZeroSMulDivisors Aₘ Bₘ] [Module.Finite Aₘ Bₘ]
235+
236+
lemma Algebra.intTrace_eq_of_isLocalization
237+
(x : B) :
238+
algebraMap A Aₘ (Algebra.intTrace A B x) = Algebra.intTrace Aₘ Bₘ (algebraMap B Bₘ x) := by
239+
by_cases hM : 0 ∈ M
240+
· have := IsLocalization.uniqueOfZeroMem (S := Aₘ) hM
241+
exact Subsingleton.elim _ _
242+
replace hM : M ≤ A⁰ := fun x hx ↦ mem_nonZeroDivisors_iff_ne_zero.mpr (fun e ↦ hM (e ▸ hx))
243+
let K := FractionRing A
244+
let L := FractionRing B
245+
have : IsIntegralClosure B A L :=
246+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
247+
have : IsLocalization (algebraMapSubmonoid B A⁰) L :=
248+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
249+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
250+
let f : Aₘ →+* K := IsLocalization.map _ (T := A⁰) (RingHom.id A) hM
251+
letI := f.toAlgebra
252+
have : IsScalarTower A Aₘ K := IsScalarTower.of_algebraMap_eq'
253+
(by rw [RingHom.algebraMap_toAlgebra, IsLocalization.map_comp, RingHomCompTriple.comp_eq])
254+
letI := IsFractionRing.isFractionRing_of_isDomain_of_isLocalization M Aₘ K
255+
let g : Bₘ →+* L := IsLocalization.map _
256+
(M := algebraMapSubmonoid B M) (T := algebraMapSubmonoid B A⁰)
257+
(RingHom.id B) (Submonoid.monotone_map hM)
258+
letI := g.toAlgebra
259+
have : IsScalarTower B Bₘ L := IsScalarTower.of_algebraMap_eq'
260+
(by rw [RingHom.algebraMap_toAlgebra, IsLocalization.map_comp, RingHomCompTriple.comp_eq])
261+
letI := ((algebraMap K L).comp f).toAlgebra
262+
have : IsScalarTower Aₘ K L := IsScalarTower.of_algebraMap_eq' rfl
263+
have : IsScalarTower Aₘ Bₘ L := by
264+
apply IsScalarTower.of_algebraMap_eq'
265+
apply IsLocalization.ringHom_ext M
266+
rw [RingHom.algebraMap_toAlgebra, RingHom.algebraMap_toAlgebra (R := Bₘ), RingHom.comp_assoc,
267+
RingHom.comp_assoc, ← IsScalarTower.algebraMap_eq, IsScalarTower.algebraMap_eq A B Bₘ,
268+
IsLocalization.map_comp, RingHom.comp_id, ← RingHom.comp_assoc, IsLocalization.map_comp,
269+
RingHom.comp_id, ← IsScalarTower.algebraMap_eq, ← IsScalarTower.algebraMap_eq]
270+
letI := IsFractionRing.isFractionRing_of_isDomain_of_isLocalization
271+
(algebraMapSubmonoid B M) Bₘ L
272+
have : FiniteDimensional K L := Module.Finite_of_isLocalization A B _ _ A⁰
273+
have : IsIntegralClosure Bₘ Aₘ L :=
274+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite Aₘ Bₘ)
275+
apply IsFractionRing.injective Aₘ K
276+
rw [← IsScalarTower.algebraMap_apply, Algebra.algebraMap_intTrace_fractionRing,
277+
Algebra.algebraMap_intTrace (L := L), ← IsScalarTower.algebraMap_apply]
278+
279+
end trace
280+
281+
section norm
282+
283+
variable [IsIntegrallyClosed A]
284+
285+
/-- The restriction of the norm on `L/K` restricted onto `B/A` in an AKLB setup.
286+
See `Algebra.intNorm` instead. -/
287+
noncomputable
288+
def Algebra.intNormAux [IsIntegrallyClosed A] [IsSeparable K L] :
289+
B →* A where
290+
toFun := fun s ↦ IsIntegralClosure.mk' (R := A) A (Algebra.norm K (algebraMap B L s))
291+
(isIntegral_norm K <| IsIntegral.map (IsScalarTower.toAlgHom A B L)
292+
(IsIntegralClosure.isIntegral A L s))
293+
map_one' := by simp
294+
map_mul' := fun x y ↦ by simpa using IsIntegralClosure.mk'_mul _ _ _ _ _
295+
296+
variable {A K L B}
297+
298+
lemma Algebra.map_intNormAux [IsIntegrallyClosed A] [IsSeparable K L] (x : B) :
299+
algebraMap A K (Algebra.intNormAux A K L B x) = Algebra.norm K (algebraMap B L x) := by
300+
dsimp [Algebra.intNormAux]
301+
exact IsIntegralClosure.algebraMap_mk' _ _ _
302+
303+
variable (A B)
304+
305+
variable [IsDomain A] [IsIntegrallyClosed A] [IsDomain B] [IsIntegrallyClosed B]
306+
variable [Module.Finite A B] [NoZeroSMulDivisors A B]
307+
variable [IsSeparable (FractionRing A) (FractionRing B)] -- TODO: remove this
308+
309+
/-- The norm of a finite extension of integrally closed domains `B/A` is the restriction of
310+
the norm on `Frac(B)/Frac(A)` onto `B/A`. See `Algebra.algebraMap_intNorm`. -/
311+
noncomputable
312+
def Algebra.intNorm : B →* A :=
313+
haveI : IsIntegralClosure B A (FractionRing B) :=
314+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
315+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
316+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
317+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
318+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
319+
Module.Finite_of_isLocalization A B _ _ A⁰
320+
Algebra.intNormAux A (FractionRing A) (FractionRing B) B
321+
322+
variable {A B}
323+
324+
lemma Algebra.algebraMap_intNorm (x : B) :
325+
algebraMap A K (Algebra.intNorm A B x) = Algebra.norm K (algebraMap B L x) := by
326+
haveI : IsIntegralClosure B A (FractionRing B) :=
327+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
328+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
329+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
330+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
331+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
332+
Module.Finite_of_isLocalization A B _ _ A⁰
333+
haveI := IsIntegralClosure.isFractionRing_of_finite_extension A K L B
334+
apply (FractionRing.algEquiv A K).symm.injective
335+
rw [AlgEquiv.commutes, Algebra.intNorm, Algebra.map_intNormAux,
336+
← AlgEquiv.commutes (FractionRing.algEquiv B L)]
337+
apply Algebra.norm_eq_of_equiv_equiv (FractionRing.algEquiv A K).toRingEquiv
338+
(FractionRing.algEquiv B L).toRingEquiv
339+
apply IsLocalization.ringHom_ext A⁰
340+
simp only [AlgEquiv.toRingEquiv_eq_coe, ← AlgEquiv.coe_ringHom_commutes, RingHom.comp_assoc,
341+
AlgHom.comp_algebraMap_of_tower, ← IsScalarTower.algebraMap_eq, RingHom.comp_assoc]
342+
343+
@[simp]
344+
lemma Algebra.algebraMap_intNorm_fractionRing (x : B) :
345+
algebraMap A (FractionRing A) (Algebra.intNorm A B x) =
346+
Algebra.norm (FractionRing A) (algebraMap B (FractionRing B) x) := by
347+
haveI : IsIntegralClosure B A (FractionRing B) :=
348+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
349+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
350+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
351+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
352+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
353+
Module.Finite_of_isLocalization A B _ _ A⁰
354+
exact Algebra.map_intNormAux x
355+
356+
variable (A B)
357+
358+
lemma Algebra.intNorm_eq_norm [Module.Free A B] : Algebra.intNorm A B = Algebra.norm A := by
359+
ext x
360+
haveI : IsIntegralClosure B A (FractionRing B) :=
361+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
362+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
363+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
364+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
365+
apply IsFractionRing.injective A (FractionRing A)
366+
rw [Algebra.algebraMap_intNorm_fractionRing, Algebra.norm_localization A A⁰]
367+
368+
@[simp]
369+
lemma Algebra.intNorm_zero : Algebra.intNorm A B 0 = 0 := by
370+
haveI : IsIntegralClosure B A (FractionRing B) :=
371+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
372+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
373+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
374+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
375+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
376+
Module.Finite_of_isLocalization A B _ _ A⁰
377+
apply (IsFractionRing.injective A (FractionRing A))
378+
simp only [algebraMap_intNorm_fractionRing, map_zero, norm_zero]
379+
380+
variable {A B}
381+
382+
@[simp]
383+
lemma Algebra.intNorm_eq_zero {x : B} : Algebra.intNorm A B x = 0 ↔ x = 0 := by
384+
haveI : IsIntegralClosure B A (FractionRing B) :=
385+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
386+
haveI : IsLocalization (algebraMapSubmonoid B A⁰) (FractionRing B) :=
387+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
388+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
389+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
390+
Module.Finite_of_isLocalization A B _ _ A⁰
391+
rw [← (IsFractionRing.injective A (FractionRing A)).eq_iff,
392+
← (IsFractionRing.injective B (FractionRing B)).eq_iff]
393+
simp only [algebraMap_intNorm_fractionRing, map_zero, norm_eq_zero_iff]
394+
395+
lemma Algebra.intNorm_ne_zero {x : B} : Algebra.intNorm A B x ≠ 0 ↔ x ≠ 0 := by simp
396+
397+
variable [IsDomain Aₘ] [IsIntegrallyClosed Aₘ] [IsDomain Bₘ] [IsIntegrallyClosed Bₘ]
398+
variable [NoZeroSMulDivisors Aₘ Bₘ] [Module.Finite Aₘ Bₘ]
399+
variable [IsSeparable (FractionRing Aₘ) (FractionRing Bₘ)]
400+
401+
lemma Algebra.intNorm_eq_of_isLocalization
402+
[IsSeparable (FractionRing Aₘ) (FractionRing Bₘ)] (x : B) :
403+
algebraMap A Aₘ (Algebra.intNorm A B x) = Algebra.intNorm Aₘ Bₘ (algebraMap B Bₘ x) := by
404+
by_cases hM : 0 ∈ M
405+
· have := IsLocalization.uniqueOfZeroMem (S := Aₘ) hM
406+
exact Subsingleton.elim _ _
407+
replace hM : M ≤ A⁰ := fun x hx ↦ mem_nonZeroDivisors_iff_ne_zero.mpr (fun e ↦ hM (e ▸ hx))
408+
let K := FractionRing A
409+
let L := FractionRing B
410+
have : IsIntegralClosure B A L :=
411+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
412+
have : IsLocalization (algebraMapSubmonoid B A⁰) L :=
413+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
414+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
415+
let f : Aₘ →+* K := IsLocalization.map _ (T := A⁰) (RingHom.id A) hM
416+
letI := f.toAlgebra
417+
have : IsScalarTower A Aₘ K := IsScalarTower.of_algebraMap_eq'
418+
(by rw [RingHom.algebraMap_toAlgebra, IsLocalization.map_comp, RingHomCompTriple.comp_eq])
419+
letI := IsFractionRing.isFractionRing_of_isDomain_of_isLocalization M Aₘ K
420+
let g : Bₘ →+* L := IsLocalization.map _
421+
(M := algebraMapSubmonoid B M) (T := algebraMapSubmonoid B A⁰)
422+
(RingHom.id B) (Submonoid.monotone_map hM)
423+
letI := g.toAlgebra
424+
have : IsScalarTower B Bₘ L := IsScalarTower.of_algebraMap_eq'
425+
(by rw [RingHom.algebraMap_toAlgebra, IsLocalization.map_comp, RingHomCompTriple.comp_eq])
426+
letI := ((algebraMap K L).comp f).toAlgebra
427+
have : IsScalarTower Aₘ K L := IsScalarTower.of_algebraMap_eq' rfl
428+
have : IsScalarTower Aₘ Bₘ L := by
429+
apply IsScalarTower.of_algebraMap_eq'
430+
apply IsLocalization.ringHom_ext M
431+
rw [RingHom.algebraMap_toAlgebra, RingHom.algebraMap_toAlgebra (R := Bₘ), RingHom.comp_assoc,
432+
RingHom.comp_assoc, ← IsScalarTower.algebraMap_eq, IsScalarTower.algebraMap_eq A B Bₘ,
433+
IsLocalization.map_comp, RingHom.comp_id, ← RingHom.comp_assoc, IsLocalization.map_comp,
434+
RingHom.comp_id, ← IsScalarTower.algebraMap_eq, ← IsScalarTower.algebraMap_eq]
435+
letI := IsFractionRing.isFractionRing_of_isDomain_of_isLocalization
436+
(algebraMapSubmonoid B M) Bₘ L
437+
have : FiniteDimensional K L := Module.Finite_of_isLocalization A B _ _ A⁰
438+
have : IsIntegralClosure Bₘ Aₘ L :=
439+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite Aₘ Bₘ)
440+
apply IsFractionRing.injective Aₘ K
441+
rw [← IsScalarTower.algebraMap_apply, Algebra.algebraMap_intNorm_fractionRing,
442+
Algebra.algebraMap_intNorm (L := L), ← IsScalarTower.algebraMap_apply]
443+
444+
end norm
445+
446+
lemma Algebra.algebraMap_intNorm_of_isGalois
447+
[IsDomain A] [IsIntegrallyClosed A] [IsDomain B] [IsIntegrallyClosed B]
448+
[Module.Finite A B] [NoZeroSMulDivisors A B] [IsGalois (FractionRing A) (FractionRing B)]
449+
{x : B} :
450+
algebraMap A B (Algebra.intNorm A B x) = ∏ σ : B ≃ₐ[A] B, σ x := by
451+
haveI : IsIntegralClosure B A (FractionRing B) :=
452+
IsIntegralClosure.of_isIntegrallyClosed _ _ _ (Algebra.IsIntegral.of_finite A B)
453+
haveI : IsLocalization (Algebra.algebraMapSubmonoid B A⁰) (FractionRing B) :=
454+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
455+
(isAlgebraic_of_isFractionRing _ _ (Algebra.IsIntegral.of_finite A B))
456+
haveI : FiniteDimensional (FractionRing A) (FractionRing B) :=
457+
Module.Finite_of_isLocalization A B _ _ A⁰
458+
rw [← (galRestrict A (FractionRing A) (FractionRing B) B).toEquiv.prod_comp]
459+
simp only [MulEquiv.toEquiv_eq_coe, EquivLike.coe_coe]
460+
convert (prod_galRestrict_eq_norm A (FractionRing A) (FractionRing B) B x).symm

0 commit comments

Comments
 (0)