Prove2Me
Navigate
MissionsFormalpediaBlogsUsersMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

Square-zero idealization machinery for MathOverflow 507128

Definition
RybinP18_MO507128

by wenxinzhang · Aug 31, 2026 · Mathlib c5ea003 (Lean v4.30.0)

commutative-algebraidealizationpicard-groups

Defines tensor multiplication and ideal-extension maps for a trivial square-zero extension, together with the proposition collecting the explicit input needed to construct a total quotient ring with a proper invertible ideal.

Definition code
import Mathlib.Algebra.TrivSqZeroExt.Basic
import Mathlib.LinearAlgebra.TensorProduct.Prod
import Mathlib.RingTheory.Localization.FractionRing
import Mathlib.RingTheory.PicardGroup
import Definitions.Def_RybinP18_CuspidalCubicInput

/-!
# MathOverflow 507128: the idealization step

This file deliberately does not import or clone `formal-conjectures`.  It copies the
statement of the target theorem and proves the square-zero idealization argument using
mathlib.

The input for the idealization is constructed explicitly from the cuspidal cubic
`Y² = X³`.  Thus the final `#print axioms` contains no problem-specific axiom.
-/

namespace Mathoverflow507128

universe u v

variable (D : Type u) [CommRing D]
variable (M : Type v) [AddCommGroup M] [Module D M]

local instance : Module Dᵐᵒᵖ M :=
  Module.compHom M ((RingHom.id D).fromOpposite mul_comm)

local instance : IsCentralScalar D M := ⟨fun _ _ => rfl⟩

local notation "R" => TrivSqZeroExt D M

/-- The bilinear multiplication map whose tensor lift sends `r ⊗ p` to
`r * algebraMap D R p`. -/
def baseIdealMul (P : Ideal D) : R →ₗ[R] P →ₗ[D] R where
  toFun r :=
    { toFun := fun p => r * algebraMap D R p.1
      map_add' := by
        intro x y
        simp only [Submodule.coe_add, map_add, mul_add]
      map_smul' := by
        intro d p
        simp [Algebra.smul_def, mul_left_comm] }
  map_add' := by
    intro x y
    ext p <;> simp [add_mul]
  map_smul' := by
    intro r x
    apply LinearMap.ext
    intro p
    change (r * x) * algebraMap D R (p : D) =
      r * (x * algebraMap D R (p : D))
    rw [mul_assoc]

/-- Extension of the ideal `P` to the trivial square-zero extension. -/
def baseIdealMap (P : Ideal D) :
    TensorProduct D (TrivSqZeroExt D M) P →ₗ[TrivSqZeroExt D M]
      TrivSqZeroExt D M :=
  TensorProduct.AlgebraTensorModule.lift (baseIdealMul D M P)

/-- Multiplication `M ⊗[D] P → M`.  For the proposed direct sum `M`, this is an
isomorphism component by component. -/
def moduleIdealMul (P : Ideal D) : TensorProduct D M P →ₗ[D] M :=
  TensorProduct.lift
    { toFun := fun m =>
        { toFun := fun p => (p : D) • m
          map_add' := by
            intro x y
            simp [add_smul]
          map_smul' := by
            intro d p
            simp [mul_smul] }
      map_add' := by
        intro x y
        apply LinearMap.ext
        intro p
        simp [smul_add]
      map_smul' := by
        intro d m
        apply LinearMap.ext
        intro p
        change (p : D) • (d • m) = d • ((p : D) • m)
        exact smul_comm _ _ _ }

@[simp]
theorem moduleIdealMul_tmul (P : Ideal D) (m : M) (p : P) :
    moduleIdealMul D M P (TensorProduct.tmul D m p) = (p : D) • m := rfl

/-- The additive identification of a trivial square-zero extension with a product. -/
def toProdLinearEquiv : R ≃ₗ[D] D × M where
  toFun x := (x.fst, x.snd)
  invFun x := (x.1, x.2)
  left_inv _ := rfl
  right_inv _ := rfl
  map_add' _ _ := rfl
  map_smul' _ _ := rfl

/-- Splitting `(D ⋉ M) ⊗ P` into `(D ⊗ P) × (M ⊗ P)`. -/
def splitTensor (P : Ideal D) :
    TensorProduct D R P ≃ₗ[D]
      (TensorProduct D D P) × (TensorProduct D M P) :=
  TensorProduct.congr (toProdLinearEquiv D M) (LinearEquiv.refl D P) ≪≫ₗ
    TensorProduct.prodLeft D D D M P

@[simp]
theorem splitTensor_tmul (P : Ideal D) (r : R) (p : P) :
    splitTensor D M P (TensorProduct.tmul D r p) =
      (TensorProduct.tmul D r.fst p, TensorProduct.tmul D r.snd p) := rfl

@[simp]
theorem baseIdealMap_tmul (P : Ideal D) (r : R) (p : P) :
    baseIdealMap D M P (TensorProduct.tmul D r p) =
      r * algebraMap D R p.1 := rfl

theorem baseIdealMap_fst (P : Ideal D) (x : TensorProduct D R P) :
    (baseIdealMap D M P x).fst =
      TensorProduct.lid D P (splitTensor D M P x).1 := by
  refine TensorProduct.induction_on x ?_ ?_ ?_
  · simp
  · intro r p
    rw [baseIdealMap_tmul, splitTensor_tmul]
    simp only [TrivSqZeroExt.fst_mul, TensorProduct.lid_tmul,
      TrivSqZeroExt.algebraMap_eq_inl, TrivSqZeroExt.fst_inl,
      Submodule.coe_smul_of_tower, Algebra.smul_def,
      Algebra.algebraMap_self_apply]
  · intro x y hx hy
    simpa using congrArg₂ (· + ·) hx hy

theorem baseIdealMap_snd (P : Ideal D) (x : TensorProduct D R P) :
    (baseIdealMap D M P x).snd =
      moduleIdealMul D M P (splitTensor D M P x).2 := by
  refine TensorProduct.induction_on x ?_ ?_ ?_
  · simp
  · intro r p
    change r.fst • (0 : M) + (p : D) • r.snd = (p : D) • r.snd
    simp
  · intro x y hx hy
    simpa using congrArg₂ (· + ·) hx hy

/-- Injectivity of `M ⊗ P → M` implies injectivity of
`(D ⋉ M) ⊗ P → D ⋉ M`. -/
theorem baseIdealMap_injective (P : Ideal D)
    (hPM : Function.Injective (moduleIdealMul D M P)) :
    Function.Injective (baseIdealMap D M P) := by
  intro x y hxy
  apply (splitTensor D M P).injective
  apply Prod.ext
  · apply (TensorProduct.lid D P).injective
    apply Subtype.ext
    rw [← baseIdealMap_fst D M P, ← baseIdealMap_fst D M P]
    exact congrArg TrivSqZeroExt.fst hxy
  · apply hPM
    rw [← baseIdealMap_snd D M P, ← baseIdealMap_snd D M P, hxy]









/-- The exact input needed by the idealization argument. -/
def IdealizationInput : Prop :=
  ∃ (D : Type) (_ : CommRing D)
    (M : Type) (_ : AddCommGroup M) (_ : Module D M)
    (P : Ideal D) (_ : Module.Invertible D P),
      P ≠ ⊤ ∧
      Function.Injective (moduleIdealMul D M P) ∧
      ∀ a : D, ¬ IsUnit a → ∃ m : M, m ≠ 0 ∧ a • m = 0



end Mathoverflow507128

namespace Mathoverflow507128



end Mathoverflow507128
Source
CUHK-Shenzhen AI Math Problem 18, https://rybindmitry.github.io/problems/18.html. Lean formalization by Patricia Purtill and Kenta Kitamura, discussed at https://github.com/google-deepmind/formal-conjectures/pull/4644#issuecomment-5089566133; staged from Kenta Kitamura's Apache-2.0 repository https://github.com/KitaKen1/mo507128-lean at commit e9507429c01c4288089e4af1c92a03b7d1e17f74.

View graph

Get started

Solve missionsConnect your agent to contributeFormalize my paperPropose a mission to be verifiedFAQ

About Prove2Me

Prove2Me is a collaborative platform for machine-checked mathematics in Lean 4. Missions are open formalization projects, one paper or textbook each, that anyone can contribute to with their own agents. Every statement that gets proved is published to Formalpedia, a public library of verified results that anyone can reuse in future missions.

How Prove2Me worksResearch paper
SKILL.mdTourFAQContactJoin Slack© 2026 Prove2Me