@@ -6,6 +6,7 @@ Authors: Nicolò Cavalleri, Andrew Yang
6
6
7
7
import ring_theory.adjoin.basic
8
8
import algebra.lie.of_associative
9
+ import ring_theory.ideal.cotangent
9
10
import ring_theory.tensor_product
10
11
import ring_theory.ideal.cotangent
11
12
@@ -211,7 +212,7 @@ section push_forward
211
212
212
213
variables {N : Type *} [add_comm_monoid N] [module A N] [module R N] [is_scalar_tower R A M]
213
214
[is_scalar_tower R A N]
214
- variables (f : M →ₗ[A] N)
215
+ variables (f : M →ₗ[A] N) (e : M ≃ₗ[A] N)
215
216
216
217
/-- We can push forward derivations using linear maps, i.e., the composition of a derivation with a
217
218
linear map is a derivation. Furthermore, this operation is linear on the spaces of derivations. -/
@@ -233,11 +234,20 @@ rfl
233
234
rfl
234
235
235
236
/-- The composition of a derivation with a linear map as a bilinear map -/
237
+ @[simps]
236
238
def llcomp : (M →ₗ[A] N) →ₗ[A] derivation R A M →ₗ[R] derivation R A N :=
237
239
{ to_fun := λ f, f.comp_der,
238
240
map_add' := λ f₁ f₂, by { ext, refl },
239
241
map_smul' := λ r D, by { ext, refl } }
240
242
243
+ /-- Pushing a derivation foward through a linear equivalence is an equivalence. -/
244
+ def _root_.linear_equiv.comp_der : derivation R A M ≃ₗ[R] derivation R A N :=
245
+ { inv_fun := e.symm.to_linear_map.comp_der,
246
+ left_inv := λ D, by { ext a, exact e.symm_apply_apply (D a) },
247
+ right_inv := λ D, by { ext a, exact e.apply_symm_apply (D a) },
248
+ ..e.to_linear_map.comp_der }
249
+
250
+
241
251
end push_forward
242
252
243
253
end
@@ -356,7 +366,7 @@ section to_square_zero
356
366
357
367
universes u v w
358
368
359
- variables {R : Type u} {A : Type u } {B : Type w} [comm_semiring R] [comm_semiring A] [comm_ring B]
369
+ variables {R : Type u} {A : Type v } {B : Type w} [comm_semiring R] [comm_semiring A] [comm_ring B]
360
370
variables [algebra R A] [algebra R B] (I : ideal B) (hI : I ^ 2 = ⊥)
361
371
362
372
/-- If `f₁ f₂ : A →ₐ[R] B` are two lifts of the same `A →ₐ[R] B ⧸ I`,
@@ -721,4 +731,81 @@ def kaehler_differential.linear_map_equiv_derivation : (Ω[S⁄R] →ₗ[S] M)
721
731
right_inv := derivation.lift_kaehler_differential_comp,
722
732
..(derivation.llcomp.flip $ kaehler_differential.D R S) }
723
733
734
+ /-- The quotient ring of `S ⊗ S ⧸ J ^ 2` by `Ω[S⁄R]` is isomorphic to `S`. -/
735
+ def kaehler_differential.quotient_cotangent_ideal_ring_equiv :
736
+ (S ⊗ S ⧸ kaehler_differential.ideal R S ^ 2 ) ⧸
737
+ (kaehler_differential.ideal R S).cotangent_ideal ≃+* S :=
738
+ begin
739
+ have : function.right_inverse tensor_product.include_left
740
+ (↑(tensor_product.lmul' R : S ⊗[R] S →ₐ[R] S) : S ⊗[R] S →+* S),
741
+ { intro x, rw [alg_hom.coe_to_ring_hom, ← alg_hom.comp_apply,
742
+ tensor_product.lmul'_comp_include_left], refl },
743
+ refine (ideal.quot_cotangent _).trans _,
744
+ refine (ideal.quot_equiv_of_eq _).trans (ring_hom.quotient_ker_equiv_of_right_inverse this ),
745
+ ext, refl,
746
+ end
747
+
748
+ /-- The quotient ring of `S ⊗ S ⧸ J ^ 2` by `Ω[S⁄R]` is isomorphic to `S` as an `S`-algebra. -/
749
+ def kaehler_differential.quotient_cotangent_ideal :
750
+ ((S ⊗ S ⧸ kaehler_differential.ideal R S ^ 2 ) ⧸
751
+ (kaehler_differential.ideal R S).cotangent_ideal) ≃ₐ[S] S :=
752
+ { commutes' := (kaehler_differential.quotient_cotangent_ideal_ring_equiv R S).apply_symm_apply,
753
+ ..kaehler_differential.quotient_cotangent_ideal_ring_equiv R S }
754
+
755
+ lemma kaehler_differential.End_equiv_aux (f : S →ₐ[R] S ⊗ S ⧸ kaehler_differential.ideal R S ^ 2 ) :
756
+ (ideal.quotient.mkₐ R (kaehler_differential.ideal R S).cotangent_ideal).comp f =
757
+ is_scalar_tower.to_alg_hom R S _ ↔
758
+ (tensor_product.lmul' R : S ⊗[R] S →ₐ[R] S).ker_square_lift.comp f = alg_hom.id R S :=
759
+ begin
760
+ rw [alg_hom.ext_iff, alg_hom.ext_iff],
761
+ apply forall_congr,
762
+ intro x,
763
+ have e₁ : (tensor_product.lmul' R : S ⊗[R] S →ₐ[R] S).ker_square_lift (f x) =
764
+ kaehler_differential.quotient_cotangent_ideal_ring_equiv R S
765
+ (ideal.quotient.mk (kaehler_differential.ideal R S).cotangent_ideal $ f x),
766
+ { generalize : f x = y, obtain ⟨y, rfl⟩ := ideal.quotient.mk_surjective y, refl },
767
+ have e₂ : x = kaehler_differential.quotient_cotangent_ideal_ring_equiv
768
+ R S (is_scalar_tower.to_alg_hom R S _ x),
769
+ { exact ((tensor_product.lmul'_apply_tmul x 1 ).trans (mul_one x)).symm },
770
+ split,
771
+ { intro e,
772
+ exact (e₁.trans (@ring_equiv.congr_arg _ _ _ _ _ _
773
+ (kaehler_differential.quotient_cotangent_ideal_ring_equiv R S) _ _ e)).trans e₂.symm },
774
+ { intro e, apply (kaehler_differential.quotient_cotangent_ideal_ring_equiv R S).injective,
775
+ exact e₁.symm.trans (e.trans e₂) }
776
+ end
777
+
778
+ /-- Derivations into `Ω[S⁄R]` is equivalent to derivations
779
+ into `(kaehler_differential.ideal R S).cotangent_ideal` -/
780
+ -- This has type
781
+ -- `derivation R S Ω[ S / R ] ≃ₗ[R] derivation R S (kaehler_differential.ideal R S).cotangent_ideal`
782
+ -- But lean times-out if this is given explicitly.
783
+ noncomputable
784
+ def kaehler_differential.End_equiv_derivation' :=
785
+ @linear_equiv.comp_der R _ _ _ _ Ω[S⁄R] _ _ _ _ _ _ _ _ _
786
+ ((kaehler_differential.ideal R S).cotangent_equiv_ideal.restrict_scalars S)
787
+
788
+ /-- (Implementation) An `equiv` version of `kaehler_differential.End_equiv_aux`.
789
+ Used in `kaehler_differential.End_equiv`. -/
790
+ def kaehler_differential.End_equiv_aux_equiv :
791
+ {f // (ideal.quotient.mkₐ R (kaehler_differential.ideal R S).cotangent_ideal).comp f =
792
+ is_scalar_tower.to_alg_hom R S _ } ≃
793
+ { f // (tensor_product.lmul' R : S ⊗[R] S →ₐ[R] S).ker_square_lift.comp f = alg_hom.id R S } :=
794
+ (equiv.refl _).subtype_equiv (kaehler_differential.End_equiv_aux R S)
795
+
796
+ /--
797
+ The endomorphisms of `Ω[S⁄R]` corresponds to sections of the surjection `S ⊗[R] S ⧸ J ^ 2 →ₐ[R] S`,
798
+ with `J` being the kernel of the multiplication map `S ⊗[R] S →ₐ[R] S`.
799
+ -/
800
+ noncomputable
801
+ def kaehler_differential.End_equiv :
802
+ module.End S Ω[S⁄R] ≃
803
+ { f // (tensor_product.lmul' R : S ⊗[R] S →ₐ[R] S).ker_square_lift.comp f = alg_hom.id R S } :=
804
+ (kaehler_differential.linear_map_equiv_derivation R S).to_equiv.trans $
805
+ (kaehler_differential.End_equiv_derivation' R S).to_equiv.trans $
806
+ (derivation_to_square_zero_equiv_lift
807
+ (kaehler_differential.ideal R S).cotangent_ideal
808
+ (kaehler_differential.ideal R S).cotangent_ideal_square).trans $
809
+ kaehler_differential.End_equiv_aux_equiv R S
810
+
724
811
end kaehler_differential
0 commit comments