NoZeroSMulDivisors #
This file defines the NoZeroSMulDivisors class, and includes some tests
for the vanishing of elements (especially in modules over division rings).
Usage notes #
NoZeroSMulDivisors R M is mathematically wrong when R isn't a domain, and one should use
Module.IsTorsionFree R M instead whenever they are equivalent.
In fact, if M is non-trivial, NoZeroSMulDivisors R M implies NoZeroDivisors R
(which in turn implies IsDomain R if R is a non-trivial ring):
Take m : M is non-zero. Assume r s : R are such that r * s = 0.
Then r • s • m = (r * s) • m = 0, so by NoZeroSMulDivisors we get r = 0 ∨ s = 0 ∨ m = 0.
But m ≠ 0, so r = 0 ∨ s = 0, as wanted.
Therefore one should only use NoZeroSMulDivisors R M when R isn't a ring or if the zero
module and ring are somehow relevant.
Note that we might get rid of NoZeroSMulDivisors entirely in the future.
See https://github.com/leanprover-community/mathlib4/pull/33909.
NoZeroSMulDivisors R M states that a scalar multiple is 0 only if either argument is 0.
This is a version of saying that M is torsion free, without assuming R is zero-divisor free.
The main application of NoZeroSMulDivisors R M, when M is a module,
is the result smul_eq_zero: a scalar multiple is 0 iff either argument is 0.
It is a generalization of the NoZeroDivisors class to heterogeneous multiplication.
If scalar multiplication yields zero, either the scalar or the vector was zero.
Instances
Pullback a NoZeroSMulDivisors instance along an injective function.
Alias of the forward direction of noZeroSMulDivisors_nat_iff_isAddTorsionFree.
Alias of the forward direction of noZeroSMulDivisors_int_iff_isAddTorsionFree.