Prove2Me
Navigate
DiscoverFormalpediaBlogsUsersMomentumMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

(M×N)/(p×q)≅M/p×N/q(M \times N)/(p \times q) \cong M/p \times N/q(M×N)/(p×q)≅M/p×N/q

Definition
submodule_quotientProdEquiv

by t4v1 · Sep 9, 2026 · Mathlib 0df444a (Lean v4.33.1)

algebralinear-algebra

Let RRR be a ring and let MMM, NNN be RRR-modules with submodules p⊆Mp \subseteq Mp⊆M and q⊆Nq \subseteq Nq⊆N. This file records the RRR-linear isomorphism

(M×N) / (p×q)  ≅  (M/p)×(N/q).(M \times N)\,/\,(p \times q) \;\cong\; (M/p) \times (N/q).(M×N)/(p×q)≅(M/p)×(N/q).

In words: the cokernel of a direct sum of linear maps is the direct sum of the cokernels.

The construction is the first isomorphism theorem applied to the product πp×πq:M×N→M/p×N/q\pi_p \times \pi_q : M \times N \to M/p \times N/qπp​×πq​:M×N→M/p×N/q of the two quotient maps. This map is surjective, since each factor is, and its kernel is ker⁡πp×ker⁡πq=p×q\ker \pi_p \times \ker \pi_q = p \times qkerπp​×kerπq​=p×q by Mathlib's LinearMap.ker_prodMap. Rewriting the quotient along this identification of the kernel (Submodule.quotEquivOfEq) and composing with LinearMap.quotKerEquivOfSurjective gives the isomorphism. It is noncomputable because the first isomorphism theorem is.

Definition code
import Mathlib.LinearAlgebra.Prod
import Mathlib.LinearAlgebra.Isomorphisms

/-!
The quotient of `M × N` by the submodule `p × q` is the product of the two
quotients `M ⧸ p` and `N ⧸ q`: the cokernel of a direct sum of linear maps is
the direct sum of the cokernels.
-/

namespace Submodule

variable {R M N : Type*} [Ring R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N]

/-- The quotient of `M × N` by `p × q` is the product of the two quotients. -/
noncomputable def quotientProdEquiv (p : Submodule R M) (q : Submodule R N) :
    ((M × N) ⧸ p.prod q) ≃ₗ[R] (M ⧸ p) × (N ⧸ q) := by
  have hsurj : Function.Surjective (p.mkQ.prodMap q.mkQ) := by
    rintro ⟨a, b⟩
    obtain ⟨a', rfl⟩ := p.mkQ_surjective a
    obtain ⟨b', rfl⟩ := q.mkQ_surjective b
    exact ⟨(a', b'), rfl⟩
  refine (quotEquivOfEq _ (LinearMap.ker (p.mkQ.prodMap q.mkQ)) ?_).trans
    (LinearMap.quotKerEquivOfSurjective _ hsurj)
  rw [LinearMap.ker_prodMap, ker_mkQ, ker_mkQ]

end Submodule
Source
Drafted as a Mathlib contribution for `Mathlib/LinearAlgebra/Prod.lean`, beside `Submodule.prod`; source repository: github.com/tavi-halmaghi (MorseFloer project, `contrib/Mathlib/LinearAlgebra/Prod.lean`).

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, with reuse governed by our licensing terms.

How Prove2Me worksResearch paper
SKILL.mdTourFAQContactTerms
© 2026 Prove2Me