@@ -318,11 +318,40 @@ theorem IsBaseChange.comp {f : M →ₗ[R] N} (hf : IsBaseChange S f) {g : N →
318
318
ext
319
319
rfl
320
320
321
+ /-- If `N` is the base change of `M` to `S` and `O` the base change of `M` to `T`, then
322
+ `O` is the base change of `N` to `T`. -/
323
+ lemma IsBaseChange.of_comp {f : M →ₗ[R] N} (hf : IsBaseChange S f) {h : N →ₗ[S] O}
324
+ (hc : IsBaseChange T ((h : N →ₗ[R] O) ∘ₗ f)) :
325
+ IsBaseChange T h := by
326
+ apply IsBaseChange.of_lift_unique
327
+ intro Q _ _ _ _ r
328
+ letI : Module R Q := inferInstanceAs (Module R (RestrictScalars R S Q))
329
+ haveI : IsScalarTower R S Q := IsScalarTower.of_algebraMap_smul fun r ↦ congrFun rfl
330
+ haveI : IsScalarTower R T Q := IsScalarTower.of_algebraMap_smul fun r x ↦ by
331
+ simp [IsScalarTower.algebraMap_apply R S T]
332
+ let r' : M →ₗ[R] Q := r ∘ₗ f
333
+ let q : O →ₗ[T] Q := hc.lift r'
334
+ refine ⟨q, ?_, ?_⟩
335
+ · apply hf.algHom_ext'
336
+ simp [LinearMap.comp_assoc, hc.lift_comp]
337
+ · intro q' hq'
338
+ apply hc.algHom_ext'
339
+ apply_fun LinearMap.restrictScalars R at hq'
340
+ rw [← LinearMap.comp_assoc]
341
+ rw [show q'.restrictScalars R ∘ₗ h.restrictScalars R = _ from hq', hc.lift_comp]
342
+
343
+ /-- If `N` is the base change `M` to `S`, then `O` is the base change of `M` to `T` if and
344
+ only if `O` is the base change of `N` to `T`. -/
345
+ lemma IsBaseChange.comp_iff {f : M →ₗ[R] N} (hf : IsBaseChange S f) {h : N →ₗ[S] O} :
346
+ IsBaseChange T ((h : N →ₗ[R] O) ∘ₗ f) ↔ IsBaseChange T h :=
347
+ ⟨fun hc ↦ IsBaseChange.of_comp hf hc, fun hh ↦ IsBaseChange.comp hf hh⟩
348
+
321
349
variable {R' S' : Type *} [CommSemiring R'] [CommSemiring S']
322
350
variable [Algebra R R'] [Algebra S S'] [Algebra R' S'] [Algebra R S']
323
351
variable [IsScalarTower R R' S'] [IsScalarTower R S S']
324
352
325
353
open IsScalarTower (toAlgHom)
354
+ open IsScalarTower (algebraMap_apply)
326
355
327
356
variable (R S R' S')
328
357
@@ -471,4 +500,33 @@ theorem Algebra.IsPushout.algHom_ext [H : Algebra.IsPushout R S R' S'] {A : Type
471
500
· intro s₁ s₂ e₁ e₂
472
501
rw [map_add, map_add, e₁, e₂]
473
502
503
+ /--
504
+ Let the following be a commutative diagram of rings
505
+ ```
506
+ R → S → T
507
+ ↓ ↓ ↓
508
+ R' → S' → T'
509
+ ```
510
+ where the left-hand square is a pushout. Then the following are equivalent:
511
+ - the big rectangle is a pushout.
512
+ - the right-hand square is a pushout.
513
+
514
+ Note that this is essentially the isomorphism `T ⊗[S] (S ⊗[R] R') ≃ₐ[T] T ⊗[R] R'`.
515
+ -/
516
+ lemma Algebra.IsPushout.comp_iff {T' : Type *} [CommRing T'] [Algebra R T']
517
+ [Algebra S' T'] [Algebra S T'] [Algebra T T'] [Algebra R' T']
518
+ [IsScalarTower R T T'] [IsScalarTower S T T'] [IsScalarTower S S' T']
519
+ [IsScalarTower R R' T'] [IsScalarTower R S' T'] [IsScalarTower R' S' T']
520
+ [Algebra.IsPushout R S R' S'] :
521
+ Algebra.IsPushout R T R' T' ↔ Algebra.IsPushout S T S' T' := by
522
+ let f : R' →ₗ[R] S' := (IsScalarTower.toAlgHom R R' S').toLinearMap
523
+ haveI : IsScalarTower R S T' := IsScalarTower.of_algebraMap_eq <| fun x ↦ by
524
+ rw [algebraMap_apply R S' T', algebraMap_apply R S S', ← algebraMap_apply S S' T']
525
+ have heq : (toAlgHom S S' T').toLinearMap.restrictScalars R ∘ₗ f =
526
+ (toAlgHom R R' T').toLinearMap := by
527
+ ext x
528
+ simp [f, ← IsScalarTower.algebraMap_apply]
529
+ rw [isPushout_iff, isPushout_iff, ← heq, IsBaseChange.comp_iff]
530
+ exact Algebra.IsPushout.out
531
+
474
532
end IsBaseChange
0 commit comments