algebra.char_p.algebra
⟷
Mathlib.Algebra.CharP.Algebra
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -61,9 +61,9 @@ theorem charZero_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiri
{
cast_injective := fun x y hxy =>
by
- change algebraMap ℕ A x = algebraMap ℕ A y at hxy
- rw [IsScalarTower.algebraMap_apply ℕ R A x] at hxy
- rw [IsScalarTower.algebraMap_apply ℕ R A y] at hxy
+ change algebraMap ℕ A x = algebraMap ℕ A y at hxy
+ rw [IsScalarTower.algebraMap_apply ℕ R A x] at hxy
+ rw [IsScalarTower.algebraMap_apply ℕ R A y] at hxy
exact CharZero.cast_injective (h hxy) }
#align char_zero_of_injective_algebra_map charZero_of_injective_algebraMap
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2021 Jon Eugster. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jon Eugster, Eric Wieser
-/
-import Mathbin.Algebra.CharP.Basic
-import Mathbin.RingTheory.Localization.FractionRing
-import Mathbin.Algebra.FreeAlgebra
+import Algebra.CharP.Basic
+import RingTheory.Localization.FractionRing
+import Algebra.FreeAlgebra
#align_import algebra.char_p.algebra from "leanprover-community/mathlib"@"97eab48559068f3d6313da387714ef25768fb730"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2021 Jon Eugster. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jon Eugster, Eric Wieser
-
-! This file was ported from Lean 3 source module algebra.char_p.algebra
-! leanprover-community/mathlib commit 97eab48559068f3d6313da387714ef25768fb730
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.CharP.Basic
import Mathbin.RingTheory.Localization.FractionRing
import Mathbin.Algebra.FreeAlgebra
+#align_import algebra.char_p.algebra from "leanprover-community/mathlib"@"97eab48559068f3d6313da387714ef25768fb730"
+
/-!
# Characteristics of algebras
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -36,6 +36,7 @@ Instances constructed from this result:
-/
+#print charP_of_injective_algebraMap /-
/-- If the algebra map `R →+* A` is injective then `A` has the same characteristic as `R`. -/
theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) (p : ℕ) [CharP R p] : CharP A p :=
@@ -47,12 +48,16 @@ theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring
refine' Iff.trans _ h.eq_iff
rw [RingHom.map_zero] }
#align char_p_of_injective_algebra_map charP_of_injective_algebraMap
+-/
+#print charP_of_injective_algebraMap' /-
theorem charP_of_injective_algebraMap' (R A : Type _) [Field R] [Semiring A] [Algebra R A]
[Nontrivial A] (p : ℕ) [CharP R p] : CharP A p :=
charP_of_injective_algebraMap (algebraMap R A).Injective p
#align char_p_of_injective_algebra_map' charP_of_injective_algebraMap'
+-/
+#print charZero_of_injective_algebraMap /-
/-- If the algebra map `R →+* A` is injective and `R` has characteristic zero then so does `A`. -/
theorem charZero_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) [CharZero R] : CharZero A :=
@@ -64,6 +69,7 @@ theorem charZero_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiri
rw [IsScalarTower.algebraMap_apply ℕ R A y] at hxy
exact CharZero.cast_injective (h hxy) }
#align char_zero_of_injective_algebra_map charZero_of_injective_algebraMap
+-/
/-!
As an application, a `ℚ`-algebra has characteristic zero.
@@ -88,6 +94,7 @@ theorem algebraRat.charP_zero [Semiring R] [Algebra ℚ R] : CharP R 0 :=
#align algebra_rat.char_p_zero algebraRat.charP_zero
-/
+#print algebraRat.charZero /-
/-- A nontrivial `ℚ`-algebra has characteristic zero.
This cannot be a (local) instance because it would immediately form a loop with the
@@ -97,6 +104,7 @@ automatically receive an `algebra ℚ R` instance.
theorem algebraRat.charZero [Ring R] [Algebra ℚ R] : CharZero R :=
@CharP.charP_to_charZero R _ (algebraRat.charP_zero R)
#align algebra_rat.char_zero algebraRat.charZero
+-/
end QAlgebra
@@ -109,13 +117,17 @@ section
variable (K L : Type _) [Field K] [CommSemiring L] [Nontrivial L] [Algebra K L]
+#print Algebra.charP_iff /-
theorem Algebra.charP_iff (p : ℕ) : CharP K p ↔ CharP L p :=
(algebraMap K L).charP_iff_charP p
#align algebra.char_p_iff Algebra.charP_iff
+-/
+#print Algebra.ringChar_eq /-
theorem Algebra.ringChar_eq : ringChar K = ringChar L := by
rw [ringChar.eq_iff, Algebra.charP_iff K L]; apply ringChar.charP
#align algebra.ring_char_eq Algebra.ringChar_eq
+-/
end
@@ -123,15 +135,19 @@ namespace FreeAlgebra
variable {R X : Type _} [CommSemiring R] (p : ℕ)
+#print FreeAlgebra.charP /-
/-- If `R` has characteristic `p`, then so does `free_algebra R X`. -/
instance charP [CharP R p] : CharP (FreeAlgebra R X) p :=
charP_of_injective_algebraMap FreeAlgebra.algebraMap_leftInverse.Injective p
#align free_algebra.char_p FreeAlgebra.charP
+-/
+#print FreeAlgebra.charZero /-
/-- If `R` has characteristic `0`, then so does `free_algebra R X`. -/
instance charZero [CharZero R] : CharZero (FreeAlgebra R X) :=
charZero_of_injective_algebraMap FreeAlgebra.algebraMap_leftInverse.Injective
#align free_algebra.char_zero FreeAlgebra.charZero
+-/
end FreeAlgebra
@@ -141,27 +157,35 @@ variable (R : Type _) {K : Type _} [CommRing R] [Field K] [Algebra R K] [IsFract
variable (p : ℕ)
+#print IsFractionRing.charP_of_isFractionRing /-
/-- If `R` has characteristic `p`, then so does Frac(R). -/
theorem charP_of_isFractionRing [CharP R p] : CharP K p :=
charP_of_injective_algebraMap (IsFractionRing.injective R K) p
#align is_fraction_ring.char_p_of_is_fraction_ring IsFractionRing.charP_of_isFractionRing
+-/
+#print IsFractionRing.charZero_of_isFractionRing /-
/-- If `R` has characteristic `0`, then so does Frac(R). -/
theorem charZero_of_isFractionRing [CharZero R] : CharZero K :=
@CharP.charP_to_charZero K _ (charP_of_isFractionRing R 0)
#align is_fraction_ring.char_zero_of_is_fraction_ring IsFractionRing.charZero_of_isFractionRing
+-/
variable [IsDomain R]
+#print IsFractionRing.charP /-
/-- If `R` has characteristic `p`, then so does `fraction_ring R`. -/
instance charP [CharP R p] : CharP (FractionRing R) p :=
charP_of_isFractionRing R p
#align is_fraction_ring.char_p IsFractionRing.charP
+-/
+#print IsFractionRing.charZero /-
/-- If `R` has characteristic `0`, then so does `fraction_ring R`. -/
instance charZero [CharZero R] : CharZero (FractionRing R) :=
charZero_of_isFractionRing R
#align is_fraction_ring.char_zero IsFractionRing.charZero
+-/
end IsFractionRing
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -59,9 +59,9 @@ theorem charZero_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiri
{
cast_injective := fun x y hxy =>
by
- change algebraMap ℕ A x = algebraMap ℕ A y at hxy
- rw [IsScalarTower.algebraMap_apply ℕ R A x] at hxy
- rw [IsScalarTower.algebraMap_apply ℕ R A y] at hxy
+ change algebraMap ℕ A x = algebraMap ℕ A y at hxy
+ rw [IsScalarTower.algebraMap_apply ℕ R A x] at hxy
+ rw [IsScalarTower.algebraMap_apply ℕ R A y] at hxy
exact CharZero.cast_injective (h hxy) }
#align char_zero_of_injective_algebra_map charZero_of_injective_algebraMap
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -36,12 +36,6 @@ Instances constructed from this result:
-/
-/- warning: char_p_of_injective_algebra_map -> charP_of_injective_algebraMap is a dubious translation:
-lean 3 declaration is
- forall {R : Type.{u1}} {A : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A _inst_1 _inst_2], (Function.Injective.{succ u1, succ u2} R A (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (fun (_x : RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) => R -> A) (RingHom.hasCoeToFun.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (algebraMap.{u1, u2} R A _inst_1 _inst_2 _inst_3))) -> (forall (p : Nat) [_inst_4 : CharP.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)))) p], CharP.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))) p)
-but is expected to have type
- forall {R : Type.{u2}} {A : Type.{u1}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A _inst_1 _inst_2], (Function.Injective.{succ u2, succ u1} R A (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : R) => A) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonUnitalNonAssocSemiring.toMul.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) (NonUnitalNonAssocSemiring.toMul.{u1} A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) (NonUnitalRingHomClass.toMulHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2)) (RingHomClass.toNonUnitalRingHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2) (RingHom.instRingHomClassRingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2))))) (algebraMap.{u2, u1} R A _inst_1 _inst_2 _inst_3))) -> (forall (p : Nat) [_inst_4 : CharP.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) p], CharP.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) p)
-Case conversion may be inaccurate. Consider using '#align char_p_of_injective_algebra_map charP_of_injective_algebraMapₓ'. -/
/-- If the algebra map `R →+* A` is injective then `A` has the same characteristic as `R`. -/
theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) (p : ℕ) [CharP R p] : CharP A p :=
@@ -54,23 +48,11 @@ theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring
rw [RingHom.map_zero] }
#align char_p_of_injective_algebra_map charP_of_injective_algebraMap
-/- warning: char_p_of_injective_algebra_map' -> charP_of_injective_algebraMap' is a dubious translation:
-lean 3 declaration is
- forall (R : Type.{u1}) (A : Type.{u2}) [_inst_1 : Field.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A (Semifield.toCommSemiring.{u1} R (Field.toSemifield.{u1} R _inst_1)) _inst_2] [_inst_4 : Nontrivial.{u2} A] (p : Nat) [_inst_5 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (DivisionRing.toRing.{u1} R (Field.toDivisionRing.{u1} R _inst_1))))) p], CharP.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))) p
-but is expected to have type
- forall (R : Type.{u2}) (A : Type.{u1}) [_inst_1 : Field.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A (Semifield.toCommSemiring.{u2} R (Field.toSemifield.{u2} R _inst_1)) _inst_2] [_inst_4 : Nontrivial.{u1} A] (p : Nat) [_inst_5 : CharP.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (DivisionRing.toRing.{u2} R (Field.toDivisionRing.{u2} R _inst_1)))) p], CharP.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) p
-Case conversion may be inaccurate. Consider using '#align char_p_of_injective_algebra_map' charP_of_injective_algebraMap'ₓ'. -/
theorem charP_of_injective_algebraMap' (R A : Type _) [Field R] [Semiring A] [Algebra R A]
[Nontrivial A] (p : ℕ) [CharP R p] : CharP A p :=
charP_of_injective_algebraMap (algebraMap R A).Injective p
#align char_p_of_injective_algebra_map' charP_of_injective_algebraMap'
-/- warning: char_zero_of_injective_algebra_map -> charZero_of_injective_algebraMap is a dubious translation:
-lean 3 declaration is
- forall {R : Type.{u1}} {A : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A _inst_1 _inst_2], (Function.Injective.{succ u1, succ u2} R A (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (fun (_x : RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) => R -> A) (RingHom.hasCoeToFun.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (algebraMap.{u1, u2} R A _inst_1 _inst_2 _inst_3))) -> (forall [_inst_4 : CharZero.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1))))], CharZero.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))))
-but is expected to have type
- forall {R : Type.{u2}} {A : Type.{u1}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A _inst_1 _inst_2], (Function.Injective.{succ u2, succ u1} R A (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : R) => A) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonUnitalNonAssocSemiring.toMul.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) (NonUnitalNonAssocSemiring.toMul.{u1} A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) (NonUnitalRingHomClass.toMulHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2)) (RingHomClass.toNonUnitalRingHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2) (RingHom.instRingHomClassRingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2))))) (algebraMap.{u2, u1} R A _inst_1 _inst_2 _inst_3))) -> (forall [_inst_4 : CharZero.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))))], CharZero.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))))
-Case conversion may be inaccurate. Consider using '#align char_zero_of_injective_algebra_map charZero_of_injective_algebraMapₓ'. -/
/-- If the algebra map `R →+* A` is injective and `R` has characteristic zero then so does `A`. -/
theorem charZero_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) [CharZero R] : CharZero A :=
@@ -106,12 +88,6 @@ theorem algebraRat.charP_zero [Semiring R] [Algebra ℚ R] : CharP R 0 :=
#align algebra_rat.char_p_zero algebraRat.charP_zero
-/
-/- warning: algebra_rat.char_zero -> algebraRat.charZero is a dubious translation:
-lean 3 declaration is
- forall (R : Type.{u1}) [_inst_1 : Nontrivial.{u1} R] [_inst_2 : Ring.{u1} R] [_inst_3 : Algebra.{0, u1} Rat R Rat.commSemiring (Ring.toSemiring.{u1} R _inst_2)], CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R _inst_2)))
-but is expected to have type
- forall (R : Type.{u1}) [_inst_1 : Nontrivial.{u1} R] [_inst_2 : Ring.{u1} R] [_inst_3 : Algebra.{0, u1} Rat R Rat.commSemiring (Ring.toSemiring.{u1} R _inst_2)], CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R _inst_2))
-Case conversion may be inaccurate. Consider using '#align algebra_rat.char_zero algebraRat.charZeroₓ'. -/
/-- A nontrivial `ℚ`-algebra has characteristic zero.
This cannot be a (local) instance because it would immediately form a loop with the
@@ -133,22 +109,10 @@ section
variable (K L : Type _) [Field K] [CommSemiring L] [Nontrivial L] [Algebra K L]
-/- warning: algebra.char_p_iff -> Algebra.charP_iff is a dubious translation:
-lean 3 declaration is
- forall (K : Type.{u1}) (L : Type.{u2}) [_inst_1 : Field.{u1} K] [_inst_2 : CommSemiring.{u2} L] [_inst_3 : Nontrivial.{u2} L] [_inst_4 : Algebra.{u1, u2} K L (Semifield.toCommSemiring.{u1} K (Field.toSemifield.{u1} K _inst_1)) (CommSemiring.toSemiring.{u2} L _inst_2)] (p : Nat), Iff (CharP.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (AddCommGroupWithOne.toAddGroupWithOne.{u1} K (Ring.toAddCommGroupWithOne.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_1))))) p) (CharP.{u2} L (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} L (NonAssocSemiring.toAddCommMonoidWithOne.{u2} L (Semiring.toNonAssocSemiring.{u2} L (CommSemiring.toSemiring.{u2} L _inst_2)))) p)
-but is expected to have type
- forall (K : Type.{u2}) (L : Type.{u1}) [_inst_1 : Field.{u2} K] [_inst_2 : CommSemiring.{u1} L] [_inst_3 : Nontrivial.{u1} L] [_inst_4 : Algebra.{u2, u1} K L (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} L _inst_2)] (p : Nat), Iff (CharP.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (Ring.toAddGroupWithOne.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_1)))) p) (CharP.{u1} L (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} L (NonAssocSemiring.toAddCommMonoidWithOne.{u1} L (Semiring.toNonAssocSemiring.{u1} L (CommSemiring.toSemiring.{u1} L _inst_2)))) p)
-Case conversion may be inaccurate. Consider using '#align algebra.char_p_iff Algebra.charP_iffₓ'. -/
theorem Algebra.charP_iff (p : ℕ) : CharP K p ↔ CharP L p :=
(algebraMap K L).charP_iff_charP p
#align algebra.char_p_iff Algebra.charP_iff
-/- warning: algebra.ring_char_eq -> Algebra.ringChar_eq is a dubious translation:
-lean 3 declaration is
- forall (K : Type.{u1}) (L : Type.{u2}) [_inst_1 : Field.{u1} K] [_inst_2 : CommSemiring.{u2} L] [_inst_3 : Nontrivial.{u2} L] [_inst_4 : Algebra.{u1, u2} K L (Semifield.toCommSemiring.{u1} K (Field.toSemifield.{u1} K _inst_1)) (CommSemiring.toSemiring.{u2} L _inst_2)], Eq.{1} Nat (ringChar.{u1} K (NonAssocRing.toNonAssocSemiring.{u1} K (Ring.toNonAssocRing.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_1))))) (ringChar.{u2} L (Semiring.toNonAssocSemiring.{u2} L (CommSemiring.toSemiring.{u2} L _inst_2)))
-but is expected to have type
- forall (K : Type.{u2}) (L : Type.{u1}) [_inst_1 : Field.{u2} K] [_inst_2 : CommSemiring.{u1} L] [_inst_3 : Nontrivial.{u1} L] [_inst_4 : Algebra.{u2, u1} K L (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} L _inst_2)], Eq.{1} Nat (ringChar.{u2} K (Semiring.toNonAssocSemiring.{u2} K (DivisionSemiring.toSemiring.{u2} K (Semifield.toDivisionSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1))))) (ringChar.{u1} L (Semiring.toNonAssocSemiring.{u1} L (CommSemiring.toSemiring.{u1} L _inst_2)))
-Case conversion may be inaccurate. Consider using '#align algebra.ring_char_eq Algebra.ringChar_eqₓ'. -/
theorem Algebra.ringChar_eq : ringChar K = ringChar L := by
rw [ringChar.eq_iff, Algebra.charP_iff K L]; apply ringChar.charP
#align algebra.ring_char_eq Algebra.ringChar_eq
@@ -159,23 +123,11 @@ namespace FreeAlgebra
variable {R X : Type _} [CommSemiring R] (p : ℕ)
-/- warning: free_algebra.char_p -> FreeAlgebra.charP is a dubious translation:
-lean 3 declaration is
- forall {R : Type.{u1}} {X : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] (p : Nat) [_inst_2 : CharP.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)))) p], CharP.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (AddCommMonoidWithOne.toAddMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (NonAssocSemiring.toAddCommMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (Semiring.toNonAssocSemiring.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (FreeAlgebra.semiring.{u1, u2} R _inst_1 X)))) p
-but is expected to have type
- forall {R : Type.{u1}} {X : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] (p : Nat) [_inst_2 : CharP.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)))) p], CharP.{max u2 u1} (FreeAlgebra.{u1, u2} R _inst_1 X) (AddCommMonoidWithOne.toAddMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (NonAssocSemiring.toAddCommMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (Semiring.toNonAssocSemiring.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (FreeAlgebra.instSemiringFreeAlgebra.{u1, u2} R _inst_1 X)))) p
-Case conversion may be inaccurate. Consider using '#align free_algebra.char_p FreeAlgebra.charPₓ'. -/
/-- If `R` has characteristic `p`, then so does `free_algebra R X`. -/
instance charP [CharP R p] : CharP (FreeAlgebra R X) p :=
charP_of_injective_algebraMap FreeAlgebra.algebraMap_leftInverse.Injective p
#align free_algebra.char_p FreeAlgebra.charP
-/- warning: free_algebra.char_zero -> FreeAlgebra.charZero is a dubious translation:
-lean 3 declaration is
- forall {R : Type.{u1}} {X : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : CharZero.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1))))], CharZero.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (AddCommMonoidWithOne.toAddMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (NonAssocSemiring.toAddCommMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (Semiring.toNonAssocSemiring.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (FreeAlgebra.semiring.{u1, u2} R _inst_1 X))))
-but is expected to have type
- forall {R : Type.{u1}} {X : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : CharZero.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1))))], CharZero.{max u2 u1} (FreeAlgebra.{u1, u2} R _inst_1 X) (AddCommMonoidWithOne.toAddMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (NonAssocSemiring.toAddCommMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (Semiring.toNonAssocSemiring.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (FreeAlgebra.instSemiringFreeAlgebra.{u1, u2} R _inst_1 X))))
-Case conversion may be inaccurate. Consider using '#align free_algebra.char_zero FreeAlgebra.charZeroₓ'. -/
/-- If `R` has characteristic `0`, then so does `free_algebra R X`. -/
instance charZero [CharZero R] : CharZero (FreeAlgebra R X) :=
charZero_of_injective_algebraMap FreeAlgebra.algebraMap_leftInverse.Injective
@@ -189,23 +141,11 @@ variable (R : Type _) {K : Type _} [CommRing R] [Field K] [Algebra R K] [IsFract
variable (p : ℕ)
-/- warning: is_fraction_ring.char_p_of_is_fraction_ring -> IsFractionRing.charP_of_isFractionRing is a dubious translation:
-lean 3 declaration is
- forall (R : Type.{u1}) {K : Type.{u2}} [_inst_1 : CommRing.{u1} R] [_inst_2 : Field.{u2} K] [_inst_3 : Algebra.{u1, u2} R K (CommRing.toCommSemiring.{u1} R _inst_1) (Ring.toSemiring.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))] [_inst_4 : IsFractionRing.{u1, u2} R _inst_1 K (Field.toCommRing.{u2} K _inst_2) _inst_3] (p : Nat) [_inst_5 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (AddCommGroupWithOne.toAddGroupWithOne.{u2} K (Ring.toAddCommGroupWithOne.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2))))) p
-but is expected to have type
- forall (R : Type.{u2}) {K : Type.{u1}} [_inst_1 : CommRing.{u2} R] [_inst_2 : Field.{u1} K] [_inst_3 : Algebra.{u2, u1} R K (CommRing.toCommSemiring.{u2} R _inst_1) (DivisionSemiring.toSemiring.{u1} K (Semifield.toDivisionSemiring.{u1} K (Field.toSemifield.{u1} K _inst_2)))] [_inst_4 : IsFractionRing.{u2, u1} R _inst_1 K (Field.toCommRing.{u1} K _inst_2) _inst_3] (p : Nat) [_inst_5 : CharP.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (CommRing.toRing.{u2} R _inst_1))) p], CharP.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (Ring.toAddGroupWithOne.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_2)))) p
-Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_p_of_is_fraction_ring IsFractionRing.charP_of_isFractionRingₓ'. -/
/-- If `R` has characteristic `p`, then so does Frac(R). -/
theorem charP_of_isFractionRing [CharP R p] : CharP K p :=
charP_of_injective_algebraMap (IsFractionRing.injective R K) p
#align is_fraction_ring.char_p_of_is_fraction_ring IsFractionRing.charP_of_isFractionRing
-/- warning: is_fraction_ring.char_zero_of_is_fraction_ring -> IsFractionRing.charZero_of_isFractionRing is a dubious translation:
-lean 3 declaration is
- forall (R : Type.{u1}) {K : Type.{u2}} [_inst_1 : CommRing.{u1} R] [_inst_2 : Field.{u2} K] [_inst_3 : Algebra.{u1, u2} R K (CommRing.toCommSemiring.{u1} R _inst_1) (Ring.toSemiring.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))] [_inst_4 : IsFractionRing.{u1, u2} R _inst_1 K (Field.toCommRing.{u2} K _inst_2) _inst_3] [_inst_5 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (AddCommGroupWithOne.toAddGroupWithOne.{u2} K (Ring.toAddCommGroupWithOne.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))))
-but is expected to have type
- forall (R : Type.{u2}) {K : Type.{u1}} [_inst_1 : CommRing.{u2} R] [_inst_2 : Field.{u1} K] [_inst_3 : Algebra.{u2, u1} R K (CommRing.toCommSemiring.{u2} R _inst_1) (DivisionSemiring.toSemiring.{u1} K (Semifield.toDivisionSemiring.{u1} K (Field.toSemifield.{u1} K _inst_2)))] [_inst_4 : IsFractionRing.{u2, u1} R _inst_1 K (Field.toCommRing.{u1} K _inst_2) _inst_3] [_inst_5 : CharZero.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (CommRing.toRing.{u2} R _inst_1)))], CharZero.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (Ring.toAddGroupWithOne.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_2))))
-Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_zero_of_is_fraction_ring IsFractionRing.charZero_of_isFractionRingₓ'. -/
/-- If `R` has characteristic `0`, then so does Frac(R). -/
theorem charZero_of_isFractionRing [CharZero R] : CharZero K :=
@CharP.charP_to_charZero K _ (charP_of_isFractionRing R 0)
@@ -213,23 +153,11 @@ theorem charZero_of_isFractionRing [CharZero R] : CharZero K :=
variable [IsDomain R]
-/- warning: is_fraction_ring.char_p -> IsFractionRing.charP is a dubious translation:
-lean 3 declaration is
- forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (AddCommGroupWithOne.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddCommGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5)))))) p
-but is expected to have type
- forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5))))) p
-Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_p IsFractionRing.charPₓ'. -/
/-- If `R` has characteristic `p`, then so does `fraction_ring R`. -/
instance charP [CharP R p] : CharP (FractionRing R) p :=
charP_of_isFractionRing R p
#align is_fraction_ring.char_p IsFractionRing.charP
-/- warning: is_fraction_ring.char_zero -> IsFractionRing.charZero is a dubious translation:
-lean 3 declaration is
- forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (AddCommGroupWithOne.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddCommGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5))))))
-but is expected to have type
- forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5)))))
-Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_zero IsFractionRing.charZeroₓ'. -/
/-- If `R` has characteristic `0`, then so does `fraction_ring R`. -/
instance charZero [CharZero R] : CharZero (FractionRing R) :=
charZero_of_isFractionRing R
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -149,10 +149,8 @@ lean 3 declaration is
but is expected to have type
forall (K : Type.{u2}) (L : Type.{u1}) [_inst_1 : Field.{u2} K] [_inst_2 : CommSemiring.{u1} L] [_inst_3 : Nontrivial.{u1} L] [_inst_4 : Algebra.{u2, u1} K L (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} L _inst_2)], Eq.{1} Nat (ringChar.{u2} K (Semiring.toNonAssocSemiring.{u2} K (DivisionSemiring.toSemiring.{u2} K (Semifield.toDivisionSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1))))) (ringChar.{u1} L (Semiring.toNonAssocSemiring.{u1} L (CommSemiring.toSemiring.{u1} L _inst_2)))
Case conversion may be inaccurate. Consider using '#align algebra.ring_char_eq Algebra.ringChar_eqₓ'. -/
-theorem Algebra.ringChar_eq : ringChar K = ringChar L :=
- by
- rw [ringChar.eq_iff, Algebra.charP_iff K L]
- apply ringChar.charP
+theorem Algebra.ringChar_eq : ringChar K = ringChar L := by
+ rw [ringChar.eq_iff, Algebra.charP_iff K L]; apply ringChar.charP
#align algebra.ring_char_eq Algebra.ringChar_eq
end
mathlib commit https://github.com/leanprover-community/mathlib/commit/95a87616d63b3cb49d3fe678d416fbe9c4217bf4
@@ -40,7 +40,7 @@ Instances constructed from this result:
lean 3 declaration is
forall {R : Type.{u1}} {A : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A _inst_1 _inst_2], (Function.Injective.{succ u1, succ u2} R A (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (fun (_x : RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) => R -> A) (RingHom.hasCoeToFun.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (algebraMap.{u1, u2} R A _inst_1 _inst_2 _inst_3))) -> (forall (p : Nat) [_inst_4 : CharP.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)))) p], CharP.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))) p)
but is expected to have type
- forall {R : Type.{u2}} {A : Type.{u1}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A _inst_1 _inst_2], (Function.Injective.{succ u2, succ u1} R A (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : R) => A) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonUnitalNonAssocSemiring.toMul.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) (NonUnitalNonAssocSemiring.toMul.{u1} A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) (NonUnitalRingHomClass.toMulHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2)) (RingHomClass.toNonUnitalRingHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2) (RingHom.instRingHomClassRingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2))))) (algebraMap.{u2, u1} R A _inst_1 _inst_2 _inst_3))) -> (forall (p : Nat) [_inst_4 : CharP.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) p], CharP.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) p)
+ forall {R : Type.{u2}} {A : Type.{u1}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A _inst_1 _inst_2], (Function.Injective.{succ u2, succ u1} R A (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : R) => A) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonUnitalNonAssocSemiring.toMul.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) (NonUnitalNonAssocSemiring.toMul.{u1} A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) (NonUnitalRingHomClass.toMulHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2)) (RingHomClass.toNonUnitalRingHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2) (RingHom.instRingHomClassRingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2))))) (algebraMap.{u2, u1} R A _inst_1 _inst_2 _inst_3))) -> (forall (p : Nat) [_inst_4 : CharP.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) p], CharP.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) p)
Case conversion may be inaccurate. Consider using '#align char_p_of_injective_algebra_map charP_of_injective_algebraMapₓ'. -/
/-- If the algebra map `R →+* A` is injective then `A` has the same characteristic as `R`. -/
theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
@@ -69,7 +69,7 @@ theorem charP_of_injective_algebraMap' (R A : Type _) [Field R] [Semiring A] [Al
lean 3 declaration is
forall {R : Type.{u1}} {A : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A _inst_1 _inst_2], (Function.Injective.{succ u1, succ u2} R A (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (fun (_x : RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) => R -> A) (RingHom.hasCoeToFun.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (algebraMap.{u1, u2} R A _inst_1 _inst_2 _inst_3))) -> (forall [_inst_4 : CharZero.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1))))], CharZero.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))))
but is expected to have type
- forall {R : Type.{u2}} {A : Type.{u1}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A _inst_1 _inst_2], (Function.Injective.{succ u2, succ u1} R A (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : R) => A) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonUnitalNonAssocSemiring.toMul.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) (NonUnitalNonAssocSemiring.toMul.{u1} A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) (NonUnitalRingHomClass.toMulHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2)) (RingHomClass.toNonUnitalRingHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2) (RingHom.instRingHomClassRingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2))))) (algebraMap.{u2, u1} R A _inst_1 _inst_2 _inst_3))) -> (forall [_inst_4 : CharZero.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))))], CharZero.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))))
+ forall {R : Type.{u2}} {A : Type.{u1}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A _inst_1 _inst_2], (Function.Injective.{succ u2, succ u1} R A (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : R) => A) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonUnitalNonAssocSemiring.toMul.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) (NonUnitalNonAssocSemiring.toMul.{u1} A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) (NonUnitalRingHomClass.toMulHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2)) (RingHomClass.toNonUnitalRingHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2) (RingHom.instRingHomClassRingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2))))) (algebraMap.{u2, u1} R A _inst_1 _inst_2 _inst_3))) -> (forall [_inst_4 : CharZero.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))))], CharZero.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))))
Case conversion may be inaccurate. Consider using '#align char_zero_of_injective_algebra_map charZero_of_injective_algebraMapₓ'. -/
/-- If the algebra map `R →+* A` is injective and `R` has characteristic zero then so does `A`. -/
theorem charZero_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
mathlib commit https://github.com/leanprover-community/mathlib/commit/08e1d8d4d989df3a6df86f385e9053ec8a372cc1
@@ -147,7 +147,7 @@ theorem Algebra.charP_iff (p : ℕ) : CharP K p ↔ CharP L p :=
lean 3 declaration is
forall (K : Type.{u1}) (L : Type.{u2}) [_inst_1 : Field.{u1} K] [_inst_2 : CommSemiring.{u2} L] [_inst_3 : Nontrivial.{u2} L] [_inst_4 : Algebra.{u1, u2} K L (Semifield.toCommSemiring.{u1} K (Field.toSemifield.{u1} K _inst_1)) (CommSemiring.toSemiring.{u2} L _inst_2)], Eq.{1} Nat (ringChar.{u1} K (NonAssocRing.toNonAssocSemiring.{u1} K (Ring.toNonAssocRing.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_1))))) (ringChar.{u2} L (Semiring.toNonAssocSemiring.{u2} L (CommSemiring.toSemiring.{u2} L _inst_2)))
but is expected to have type
- forall (K : Type.{u2}) (L : Type.{u1}) [_inst_1 : Field.{u2} K] [_inst_2 : CommSemiring.{u1} L] [_inst_3 : Nontrivial.{u1} L] [_inst_4 : Algebra.{u2, u1} K L (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} L _inst_2)], Eq.{1} Nat (ringChar.{u2} K (NonAssocRing.toNonAssocSemiring.{u2} K (Ring.toNonAssocRing.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_1))))) (ringChar.{u1} L (Semiring.toNonAssocSemiring.{u1} L (CommSemiring.toSemiring.{u1} L _inst_2)))
+ forall (K : Type.{u2}) (L : Type.{u1}) [_inst_1 : Field.{u2} K] [_inst_2 : CommSemiring.{u1} L] [_inst_3 : Nontrivial.{u1} L] [_inst_4 : Algebra.{u2, u1} K L (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} L _inst_2)], Eq.{1} Nat (ringChar.{u2} K (Semiring.toNonAssocSemiring.{u2} K (DivisionSemiring.toSemiring.{u2} K (Semifield.toDivisionSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1))))) (ringChar.{u1} L (Semiring.toNonAssocSemiring.{u1} L (CommSemiring.toSemiring.{u1} L _inst_2)))
Case conversion may be inaccurate. Consider using '#align algebra.ring_char_eq Algebra.ringChar_eqₓ'. -/
theorem Algebra.ringChar_eq : ringChar K = ringChar L :=
by
@@ -219,7 +219,7 @@ variable [IsDomain R]
lean 3 declaration is
forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (AddCommGroupWithOne.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddCommGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5)))))) p
but is expected to have type
- forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5))))) p
+ forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5))))) p
Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_p IsFractionRing.charPₓ'. -/
/-- If `R` has characteristic `p`, then so does `fraction_ring R`. -/
instance charP [CharP R p] : CharP (FractionRing R) p :=
@@ -230,7 +230,7 @@ instance charP [CharP R p] : CharP (FractionRing R) p :=
lean 3 declaration is
forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (AddCommGroupWithOne.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddCommGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5))))))
but is expected to have type
- forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5)))))
+ forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5)))))
Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_zero IsFractionRing.charZeroₓ'. -/
/-- If `R` has characteristic `0`, then so does `fraction_ring R`. -/
instance charZero [CharZero R] : CharZero (FractionRing R) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce86f4e05e9a9b8da5e316b22c76ce76440c56a1
@@ -56,7 +56,7 @@ theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring
/- warning: char_p_of_injective_algebra_map' -> charP_of_injective_algebraMap' is a dubious translation:
lean 3 declaration is
- forall (R : Type.{u1}) (A : Type.{u2}) [_inst_1 : Field.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A (Semifield.toCommSemiring.{u1} R (Field.toSemifield.{u1} R _inst_1)) _inst_2] [_inst_4 : Nontrivial.{u2} A] (p : Nat) [_inst_5 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (DivisionRing.toRing.{u1} R (Field.toDivisionRing.{u1} R _inst_1))))) p], CharP.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))) p
+ forall (R : Type.{u1}) (A : Type.{u2}) [_inst_1 : Field.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A (Semifield.toCommSemiring.{u1} R (Field.toSemifield.{u1} R _inst_1)) _inst_2] [_inst_4 : Nontrivial.{u2} A] (p : Nat) [_inst_5 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (DivisionRing.toRing.{u1} R (Field.toDivisionRing.{u1} R _inst_1))))) p], CharP.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))) p
but is expected to have type
forall (R : Type.{u2}) (A : Type.{u1}) [_inst_1 : Field.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A (Semifield.toCommSemiring.{u2} R (Field.toSemifield.{u2} R _inst_1)) _inst_2] [_inst_4 : Nontrivial.{u1} A] (p : Nat) [_inst_5 : CharP.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (DivisionRing.toRing.{u2} R (Field.toDivisionRing.{u2} R _inst_1)))) p], CharP.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) p
Case conversion may be inaccurate. Consider using '#align char_p_of_injective_algebra_map' charP_of_injective_algebraMap'ₓ'. -/
@@ -108,7 +108,7 @@ theorem algebraRat.charP_zero [Semiring R] [Algebra ℚ R] : CharP R 0 :=
/- warning: algebra_rat.char_zero -> algebraRat.charZero is a dubious translation:
lean 3 declaration is
- forall (R : Type.{u1}) [_inst_1 : Nontrivial.{u1} R] [_inst_2 : Ring.{u1} R] [_inst_3 : Algebra.{0, u1} Rat R Rat.commSemiring (Ring.toSemiring.{u1} R _inst_2)], CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R _inst_2)))
+ forall (R : Type.{u1}) [_inst_1 : Nontrivial.{u1} R] [_inst_2 : Ring.{u1} R] [_inst_3 : Algebra.{0, u1} Rat R Rat.commSemiring (Ring.toSemiring.{u1} R _inst_2)], CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R _inst_2)))
but is expected to have type
forall (R : Type.{u1}) [_inst_1 : Nontrivial.{u1} R] [_inst_2 : Ring.{u1} R] [_inst_3 : Algebra.{0, u1} Rat R Rat.commSemiring (Ring.toSemiring.{u1} R _inst_2)], CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R _inst_2))
Case conversion may be inaccurate. Consider using '#align algebra_rat.char_zero algebraRat.charZeroₓ'. -/
@@ -135,7 +135,7 @@ variable (K L : Type _) [Field K] [CommSemiring L] [Nontrivial L] [Algebra K L]
/- warning: algebra.char_p_iff -> Algebra.charP_iff is a dubious translation:
lean 3 declaration is
- forall (K : Type.{u1}) (L : Type.{u2}) [_inst_1 : Field.{u1} K] [_inst_2 : CommSemiring.{u2} L] [_inst_3 : Nontrivial.{u2} L] [_inst_4 : Algebra.{u1, u2} K L (Semifield.toCommSemiring.{u1} K (Field.toSemifield.{u1} K _inst_1)) (CommSemiring.toSemiring.{u2} L _inst_2)] (p : Nat), Iff (CharP.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (NonAssocRing.toAddGroupWithOne.{u1} K (Ring.toNonAssocRing.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_1))))) p) (CharP.{u2} L (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} L (NonAssocSemiring.toAddCommMonoidWithOne.{u2} L (Semiring.toNonAssocSemiring.{u2} L (CommSemiring.toSemiring.{u2} L _inst_2)))) p)
+ forall (K : Type.{u1}) (L : Type.{u2}) [_inst_1 : Field.{u1} K] [_inst_2 : CommSemiring.{u2} L] [_inst_3 : Nontrivial.{u2} L] [_inst_4 : Algebra.{u1, u2} K L (Semifield.toCommSemiring.{u1} K (Field.toSemifield.{u1} K _inst_1)) (CommSemiring.toSemiring.{u2} L _inst_2)] (p : Nat), Iff (CharP.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (AddCommGroupWithOne.toAddGroupWithOne.{u1} K (Ring.toAddCommGroupWithOne.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_1))))) p) (CharP.{u2} L (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} L (NonAssocSemiring.toAddCommMonoidWithOne.{u2} L (Semiring.toNonAssocSemiring.{u2} L (CommSemiring.toSemiring.{u2} L _inst_2)))) p)
but is expected to have type
forall (K : Type.{u2}) (L : Type.{u1}) [_inst_1 : Field.{u2} K] [_inst_2 : CommSemiring.{u1} L] [_inst_3 : Nontrivial.{u1} L] [_inst_4 : Algebra.{u2, u1} K L (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} L _inst_2)] (p : Nat), Iff (CharP.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (Ring.toAddGroupWithOne.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_1)))) p) (CharP.{u1} L (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} L (NonAssocSemiring.toAddCommMonoidWithOne.{u1} L (Semiring.toNonAssocSemiring.{u1} L (CommSemiring.toSemiring.{u1} L _inst_2)))) p)
Case conversion may be inaccurate. Consider using '#align algebra.char_p_iff Algebra.charP_iffₓ'. -/
@@ -193,7 +193,7 @@ variable (p : ℕ)
/- warning: is_fraction_ring.char_p_of_is_fraction_ring -> IsFractionRing.charP_of_isFractionRing is a dubious translation:
lean 3 declaration is
- forall (R : Type.{u1}) {K : Type.{u2}} [_inst_1 : CommRing.{u1} R] [_inst_2 : Field.{u2} K] [_inst_3 : Algebra.{u1, u2} R K (CommRing.toCommSemiring.{u1} R _inst_1) (Ring.toSemiring.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))] [_inst_4 : IsFractionRing.{u1, u2} R _inst_1 K (Field.toCommRing.{u2} K _inst_2) _inst_3] (p : Nat) [_inst_5 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (NonAssocRing.toAddGroupWithOne.{u2} K (Ring.toNonAssocRing.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2))))) p
+ forall (R : Type.{u1}) {K : Type.{u2}} [_inst_1 : CommRing.{u1} R] [_inst_2 : Field.{u2} K] [_inst_3 : Algebra.{u1, u2} R K (CommRing.toCommSemiring.{u1} R _inst_1) (Ring.toSemiring.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))] [_inst_4 : IsFractionRing.{u1, u2} R _inst_1 K (Field.toCommRing.{u2} K _inst_2) _inst_3] (p : Nat) [_inst_5 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (AddCommGroupWithOne.toAddGroupWithOne.{u2} K (Ring.toAddCommGroupWithOne.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2))))) p
but is expected to have type
forall (R : Type.{u2}) {K : Type.{u1}} [_inst_1 : CommRing.{u2} R] [_inst_2 : Field.{u1} K] [_inst_3 : Algebra.{u2, u1} R K (CommRing.toCommSemiring.{u2} R _inst_1) (DivisionSemiring.toSemiring.{u1} K (Semifield.toDivisionSemiring.{u1} K (Field.toSemifield.{u1} K _inst_2)))] [_inst_4 : IsFractionRing.{u2, u1} R _inst_1 K (Field.toCommRing.{u1} K _inst_2) _inst_3] (p : Nat) [_inst_5 : CharP.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (CommRing.toRing.{u2} R _inst_1))) p], CharP.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (Ring.toAddGroupWithOne.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_2)))) p
Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_p_of_is_fraction_ring IsFractionRing.charP_of_isFractionRingₓ'. -/
@@ -204,7 +204,7 @@ theorem charP_of_isFractionRing [CharP R p] : CharP K p :=
/- warning: is_fraction_ring.char_zero_of_is_fraction_ring -> IsFractionRing.charZero_of_isFractionRing is a dubious translation:
lean 3 declaration is
- forall (R : Type.{u1}) {K : Type.{u2}} [_inst_1 : CommRing.{u1} R] [_inst_2 : Field.{u2} K] [_inst_3 : Algebra.{u1, u2} R K (CommRing.toCommSemiring.{u1} R _inst_1) (Ring.toSemiring.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))] [_inst_4 : IsFractionRing.{u1, u2} R _inst_1 K (Field.toCommRing.{u2} K _inst_2) _inst_3] [_inst_5 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (NonAssocRing.toAddGroupWithOne.{u2} K (Ring.toNonAssocRing.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))))
+ forall (R : Type.{u1}) {K : Type.{u2}} [_inst_1 : CommRing.{u1} R] [_inst_2 : Field.{u2} K] [_inst_3 : Algebra.{u1, u2} R K (CommRing.toCommSemiring.{u1} R _inst_1) (Ring.toSemiring.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))] [_inst_4 : IsFractionRing.{u1, u2} R _inst_1 K (Field.toCommRing.{u2} K _inst_2) _inst_3] [_inst_5 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (AddCommGroupWithOne.toAddGroupWithOne.{u2} K (Ring.toAddCommGroupWithOne.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))))
but is expected to have type
forall (R : Type.{u2}) {K : Type.{u1}} [_inst_1 : CommRing.{u2} R] [_inst_2 : Field.{u1} K] [_inst_3 : Algebra.{u2, u1} R K (CommRing.toCommSemiring.{u2} R _inst_1) (DivisionSemiring.toSemiring.{u1} K (Semifield.toDivisionSemiring.{u1} K (Field.toSemifield.{u1} K _inst_2)))] [_inst_4 : IsFractionRing.{u2, u1} R _inst_1 K (Field.toCommRing.{u1} K _inst_2) _inst_3] [_inst_5 : CharZero.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (CommRing.toRing.{u2} R _inst_1)))], CharZero.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (Ring.toAddGroupWithOne.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_2))))
Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_zero_of_is_fraction_ring IsFractionRing.charZero_of_isFractionRingₓ'. -/
@@ -217,7 +217,7 @@ variable [IsDomain R]
/- warning: is_fraction_ring.char_p -> IsFractionRing.charP is a dubious translation:
lean 3 declaration is
- forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (NonAssocRing.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toNonAssocRing.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5)))))) p
+ forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (AddCommGroupWithOne.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddCommGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5)))))) p
but is expected to have type
forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5))))) p
Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_p IsFractionRing.charPₓ'. -/
@@ -228,7 +228,7 @@ instance charP [CharP R p] : CharP (FractionRing R) p :=
/- warning: is_fraction_ring.char_zero -> IsFractionRing.charZero is a dubious translation:
lean 3 declaration is
- forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (NonAssocRing.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toNonAssocRing.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5))))))
+ forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (AddCommGroupWithOne.toAddGroupWithOne.{u1} R (Ring.toAddCommGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (AddCommGroupWithOne.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddCommGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5))))))
but is expected to have type
forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5)))))
Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_zero IsFractionRing.charZeroₓ'. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/d11893b411025250c8e61ff2f12ccbd7ee35ab15
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jon Eugster, Eric Wieser
! This file was ported from Lean 3 source module algebra.char_p.algebra
-! leanprover-community/mathlib commit 96782a2d6dcded92116d8ac9ae48efb41d46a27c
+! leanprover-community/mathlib commit 97eab48559068f3d6313da387714ef25768fb730
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -15,6 +15,9 @@ import Mathbin.Algebra.FreeAlgebra
/-!
# Characteristics of algebras
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
In this file we describe the characteristic of `R`-algebras.
In particular we are interested in the characteristic of free algebras over `R`
mathlib commit https://github.com/leanprover-community/mathlib/commit/b19481deb571022990f1baa9cbf9172e6757a479
@@ -103,7 +103,12 @@ theorem algebraRat.charP_zero [Semiring R] [Algebra ℚ R] : CharP R 0 :=
#align algebra_rat.char_p_zero algebraRat.charP_zero
-/
-#print algebraRat.charZero /-
+/- warning: algebra_rat.char_zero -> algebraRat.charZero is a dubious translation:
+lean 3 declaration is
+ forall (R : Type.{u1}) [_inst_1 : Nontrivial.{u1} R] [_inst_2 : Ring.{u1} R] [_inst_3 : Algebra.{0, u1} Rat R Rat.commSemiring (Ring.toSemiring.{u1} R _inst_2)], CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R _inst_2)))
+but is expected to have type
+ forall (R : Type.{u1}) [_inst_1 : Nontrivial.{u1} R] [_inst_2 : Ring.{u1} R] [_inst_3 : Algebra.{0, u1} Rat R Rat.commSemiring (Ring.toSemiring.{u1} R _inst_2)], CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R _inst_2))
+Case conversion may be inaccurate. Consider using '#align algebra_rat.char_zero algebraRat.charZeroₓ'. -/
/-- A nontrivial `ℚ`-algebra has characteristic zero.
This cannot be a (local) instance because it would immediately form a loop with the
@@ -113,7 +118,6 @@ automatically receive an `algebra ℚ R` instance.
theorem algebraRat.charZero [Ring R] [Algebra ℚ R] : CharZero R :=
@CharP.charP_to_charZero R _ (algebraRat.charP_zero R)
#align algebra_rat.char_zero algebraRat.charZero
--/
end QAlgebra
mathlib commit https://github.com/leanprover-community/mathlib/commit/57e09a1296bfb4330ddf6624f1028ba186117d82
@@ -33,6 +33,12 @@ Instances constructed from this result:
-/
+/- warning: char_p_of_injective_algebra_map -> charP_of_injective_algebraMap is a dubious translation:
+lean 3 declaration is
+ forall {R : Type.{u1}} {A : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A _inst_1 _inst_2], (Function.Injective.{succ u1, succ u2} R A (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (fun (_x : RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) => R -> A) (RingHom.hasCoeToFun.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (algebraMap.{u1, u2} R A _inst_1 _inst_2 _inst_3))) -> (forall (p : Nat) [_inst_4 : CharP.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)))) p], CharP.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))) p)
+but is expected to have type
+ forall {R : Type.{u2}} {A : Type.{u1}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A _inst_1 _inst_2], (Function.Injective.{succ u2, succ u1} R A (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : R) => A) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonUnitalNonAssocSemiring.toMul.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) (NonUnitalNonAssocSemiring.toMul.{u1} A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) (NonUnitalRingHomClass.toMulHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2)) (RingHomClass.toNonUnitalRingHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2) (RingHom.instRingHomClassRingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2))))) (algebraMap.{u2, u1} R A _inst_1 _inst_2 _inst_3))) -> (forall (p : Nat) [_inst_4 : CharP.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) p], CharP.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) p)
+Case conversion may be inaccurate. Consider using '#align char_p_of_injective_algebra_map charP_of_injective_algebraMapₓ'. -/
/-- If the algebra map `R →+* A` is injective then `A` has the same characteristic as `R`. -/
theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) (p : ℕ) [CharP R p] : CharP A p :=
@@ -45,11 +51,23 @@ theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring
rw [RingHom.map_zero] }
#align char_p_of_injective_algebra_map charP_of_injective_algebraMap
-theorem charP_of_injective_algebra_map' (R A : Type _) [Field R] [Semiring A] [Algebra R A]
+/- warning: char_p_of_injective_algebra_map' -> charP_of_injective_algebraMap' is a dubious translation:
+lean 3 declaration is
+ forall (R : Type.{u1}) (A : Type.{u2}) [_inst_1 : Field.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A (Semifield.toCommSemiring.{u1} R (Field.toSemifield.{u1} R _inst_1)) _inst_2] [_inst_4 : Nontrivial.{u2} A] (p : Nat) [_inst_5 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (DivisionRing.toRing.{u1} R (Field.toDivisionRing.{u1} R _inst_1))))) p], CharP.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))) p
+but is expected to have type
+ forall (R : Type.{u2}) (A : Type.{u1}) [_inst_1 : Field.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A (Semifield.toCommSemiring.{u2} R (Field.toSemifield.{u2} R _inst_1)) _inst_2] [_inst_4 : Nontrivial.{u1} A] (p : Nat) [_inst_5 : CharP.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (DivisionRing.toRing.{u2} R (Field.toDivisionRing.{u2} R _inst_1)))) p], CharP.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) p
+Case conversion may be inaccurate. Consider using '#align char_p_of_injective_algebra_map' charP_of_injective_algebraMap'ₓ'. -/
+theorem charP_of_injective_algebraMap' (R A : Type _) [Field R] [Semiring A] [Algebra R A]
[Nontrivial A] (p : ℕ) [CharP R p] : CharP A p :=
charP_of_injective_algebraMap (algebraMap R A).Injective p
-#align char_p_of_injective_algebra_map' charP_of_injective_algebra_map'
-
+#align char_p_of_injective_algebra_map' charP_of_injective_algebraMap'
+
+/- warning: char_zero_of_injective_algebra_map -> charZero_of_injective_algebraMap is a dubious translation:
+lean 3 declaration is
+ forall {R : Type.{u1}} {A : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : Semiring.{u2} A] [_inst_3 : Algebra.{u1, u2} R A _inst_1 _inst_2], (Function.Injective.{succ u1, succ u2} R A (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (fun (_x : RingHom.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) => R -> A) (RingHom.hasCoeToFun.{u1, u2} R A (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)) (Semiring.toNonAssocSemiring.{u2} A _inst_2)) (algebraMap.{u1, u2} R A _inst_1 _inst_2 _inst_3))) -> (forall [_inst_4 : CharZero.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1))))], CharZero.{u2} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} A (NonAssocSemiring.toAddCommMonoidWithOne.{u2} A (Semiring.toNonAssocSemiring.{u2} A _inst_2))))
+but is expected to have type
+ forall {R : Type.{u2}} {A : Type.{u1}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Semiring.{u1} A] [_inst_3 : Algebra.{u2, u1} R A _inst_1 _inst_2], (Function.Injective.{succ u2, succ u1} R A (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : R) => A) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonUnitalNonAssocSemiring.toMul.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)))) (NonUnitalNonAssocSemiring.toMul.{u1} A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))) (NonUnitalRingHomClass.toMulHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2)) (RingHomClass.toNonUnitalRingHomClass.{max u2 u1, u2, u1} (RingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2)) R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2) (RingHom.instRingHomClassRingHom.{u2, u1} R A (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1)) (Semiring.toNonAssocSemiring.{u1} A _inst_2))))) (algebraMap.{u2, u1} R A _inst_1 _inst_2 _inst_3))) -> (forall [_inst_4 : CharZero.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (CommSemiring.toSemiring.{u2} R _inst_1))))], CharZero.{u1} A (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} A (NonAssocSemiring.toAddCommMonoidWithOne.{u1} A (Semiring.toNonAssocSemiring.{u1} A _inst_2))))
+Case conversion may be inaccurate. Consider using '#align char_zero_of_injective_algebra_map charZero_of_injective_algebraMapₓ'. -/
/-- If the algebra map `R →+* A` is injective and `R` has characteristic zero then so does `A`. -/
theorem charZero_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) [CharZero R] : CharZero A :=
@@ -73,6 +91,7 @@ section QAlgebra
variable (R : Type _) [Nontrivial R]
+#print algebraRat.charP_zero /-
/-- A nontrivial `ℚ`-algebra has `char_p` equal to zero.
This cannot be a (local) instance because it would immediately form a loop with the
@@ -82,7 +101,9 @@ automatically receive an `algebra ℚ R` instance.
theorem algebraRat.charP_zero [Semiring R] [Algebra ℚ R] : CharP R 0 :=
charP_of_injective_algebraMap (algebraMap ℚ R).Injective 0
#align algebra_rat.char_p_zero algebraRat.charP_zero
+-/
+#print algebraRat.charZero /-
/-- A nontrivial `ℚ`-algebra has characteristic zero.
This cannot be a (local) instance because it would immediately form a loop with the
@@ -92,6 +113,7 @@ automatically receive an `algebra ℚ R` instance.
theorem algebraRat.charZero [Ring R] [Algebra ℚ R] : CharZero R :=
@CharP.charP_to_charZero R _ (algebraRat.charP_zero R)
#align algebra_rat.char_zero algebraRat.charZero
+-/
end QAlgebra
@@ -104,10 +126,22 @@ section
variable (K L : Type _) [Field K] [CommSemiring L] [Nontrivial L] [Algebra K L]
+/- warning: algebra.char_p_iff -> Algebra.charP_iff is a dubious translation:
+lean 3 declaration is
+ forall (K : Type.{u1}) (L : Type.{u2}) [_inst_1 : Field.{u1} K] [_inst_2 : CommSemiring.{u2} L] [_inst_3 : Nontrivial.{u2} L] [_inst_4 : Algebra.{u1, u2} K L (Semifield.toCommSemiring.{u1} K (Field.toSemifield.{u1} K _inst_1)) (CommSemiring.toSemiring.{u2} L _inst_2)] (p : Nat), Iff (CharP.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (NonAssocRing.toAddGroupWithOne.{u1} K (Ring.toNonAssocRing.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_1))))) p) (CharP.{u2} L (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} L (NonAssocSemiring.toAddCommMonoidWithOne.{u2} L (Semiring.toNonAssocSemiring.{u2} L (CommSemiring.toSemiring.{u2} L _inst_2)))) p)
+but is expected to have type
+ forall (K : Type.{u2}) (L : Type.{u1}) [_inst_1 : Field.{u2} K] [_inst_2 : CommSemiring.{u1} L] [_inst_3 : Nontrivial.{u1} L] [_inst_4 : Algebra.{u2, u1} K L (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} L _inst_2)] (p : Nat), Iff (CharP.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (Ring.toAddGroupWithOne.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_1)))) p) (CharP.{u1} L (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} L (NonAssocSemiring.toAddCommMonoidWithOne.{u1} L (Semiring.toNonAssocSemiring.{u1} L (CommSemiring.toSemiring.{u1} L _inst_2)))) p)
+Case conversion may be inaccurate. Consider using '#align algebra.char_p_iff Algebra.charP_iffₓ'. -/
theorem Algebra.charP_iff (p : ℕ) : CharP K p ↔ CharP L p :=
(algebraMap K L).charP_iff_charP p
#align algebra.char_p_iff Algebra.charP_iff
+/- warning: algebra.ring_char_eq -> Algebra.ringChar_eq is a dubious translation:
+lean 3 declaration is
+ forall (K : Type.{u1}) (L : Type.{u2}) [_inst_1 : Field.{u1} K] [_inst_2 : CommSemiring.{u2} L] [_inst_3 : Nontrivial.{u2} L] [_inst_4 : Algebra.{u1, u2} K L (Semifield.toCommSemiring.{u1} K (Field.toSemifield.{u1} K _inst_1)) (CommSemiring.toSemiring.{u2} L _inst_2)], Eq.{1} Nat (ringChar.{u1} K (NonAssocRing.toNonAssocSemiring.{u1} K (Ring.toNonAssocRing.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_1))))) (ringChar.{u2} L (Semiring.toNonAssocSemiring.{u2} L (CommSemiring.toSemiring.{u2} L _inst_2)))
+but is expected to have type
+ forall (K : Type.{u2}) (L : Type.{u1}) [_inst_1 : Field.{u2} K] [_inst_2 : CommSemiring.{u1} L] [_inst_3 : Nontrivial.{u1} L] [_inst_4 : Algebra.{u2, u1} K L (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} L _inst_2)], Eq.{1} Nat (ringChar.{u2} K (NonAssocRing.toNonAssocSemiring.{u2} K (Ring.toNonAssocRing.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_1))))) (ringChar.{u1} L (Semiring.toNonAssocSemiring.{u1} L (CommSemiring.toSemiring.{u1} L _inst_2)))
+Case conversion may be inaccurate. Consider using '#align algebra.ring_char_eq Algebra.ringChar_eqₓ'. -/
theorem Algebra.ringChar_eq : ringChar K = ringChar L :=
by
rw [ringChar.eq_iff, Algebra.charP_iff K L]
@@ -120,11 +154,23 @@ namespace FreeAlgebra
variable {R X : Type _} [CommSemiring R] (p : ℕ)
+/- warning: free_algebra.char_p -> FreeAlgebra.charP is a dubious translation:
+lean 3 declaration is
+ forall {R : Type.{u1}} {X : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] (p : Nat) [_inst_2 : CharP.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)))) p], CharP.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (AddCommMonoidWithOne.toAddMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (NonAssocSemiring.toAddCommMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (Semiring.toNonAssocSemiring.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (FreeAlgebra.semiring.{u1, u2} R _inst_1 X)))) p
+but is expected to have type
+ forall {R : Type.{u1}} {X : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] (p : Nat) [_inst_2 : CharP.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1)))) p], CharP.{max u2 u1} (FreeAlgebra.{u1, u2} R _inst_1 X) (AddCommMonoidWithOne.toAddMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (NonAssocSemiring.toAddCommMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (Semiring.toNonAssocSemiring.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (FreeAlgebra.instSemiringFreeAlgebra.{u1, u2} R _inst_1 X)))) p
+Case conversion may be inaccurate. Consider using '#align free_algebra.char_p FreeAlgebra.charPₓ'. -/
/-- If `R` has characteristic `p`, then so does `free_algebra R X`. -/
instance charP [CharP R p] : CharP (FreeAlgebra R X) p :=
charP_of_injective_algebraMap FreeAlgebra.algebraMap_leftInverse.Injective p
#align free_algebra.char_p FreeAlgebra.charP
+/- warning: free_algebra.char_zero -> FreeAlgebra.charZero is a dubious translation:
+lean 3 declaration is
+ forall {R : Type.{u1}} {X : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : CharZero.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1))))], CharZero.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (AddCommMonoidWithOne.toAddMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (NonAssocSemiring.toAddCommMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (Semiring.toNonAssocSemiring.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (FreeAlgebra.semiring.{u1, u2} R _inst_1 X))))
+but is expected to have type
+ forall {R : Type.{u1}} {X : Type.{u2}} [_inst_1 : CommSemiring.{u1} R] [_inst_2 : CharZero.{u1} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u1} R (NonAssocSemiring.toAddCommMonoidWithOne.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R _inst_1))))], CharZero.{max u2 u1} (FreeAlgebra.{u1, u2} R _inst_1 X) (AddCommMonoidWithOne.toAddMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (NonAssocSemiring.toAddCommMonoidWithOne.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (Semiring.toNonAssocSemiring.{max u1 u2} (FreeAlgebra.{u1, u2} R _inst_1 X) (FreeAlgebra.instSemiringFreeAlgebra.{u1, u2} R _inst_1 X))))
+Case conversion may be inaccurate. Consider using '#align free_algebra.char_zero FreeAlgebra.charZeroₓ'. -/
/-- If `R` has characteristic `0`, then so does `free_algebra R X`. -/
instance charZero [CharZero R] : CharZero (FreeAlgebra R X) :=
charZero_of_injective_algebraMap FreeAlgebra.algebraMap_leftInverse.Injective
@@ -138,11 +184,23 @@ variable (R : Type _) {K : Type _} [CommRing R] [Field K] [Algebra R K] [IsFract
variable (p : ℕ)
+/- warning: is_fraction_ring.char_p_of_is_fraction_ring -> IsFractionRing.charP_of_isFractionRing is a dubious translation:
+lean 3 declaration is
+ forall (R : Type.{u1}) {K : Type.{u2}} [_inst_1 : CommRing.{u1} R] [_inst_2 : Field.{u2} K] [_inst_3 : Algebra.{u1, u2} R K (CommRing.toCommSemiring.{u1} R _inst_1) (Ring.toSemiring.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))] [_inst_4 : IsFractionRing.{u1, u2} R _inst_1 K (Field.toCommRing.{u2} K _inst_2) _inst_3] (p : Nat) [_inst_5 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (NonAssocRing.toAddGroupWithOne.{u2} K (Ring.toNonAssocRing.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2))))) p
+but is expected to have type
+ forall (R : Type.{u2}) {K : Type.{u1}} [_inst_1 : CommRing.{u2} R] [_inst_2 : Field.{u1} K] [_inst_3 : Algebra.{u2, u1} R K (CommRing.toCommSemiring.{u2} R _inst_1) (DivisionSemiring.toSemiring.{u1} K (Semifield.toDivisionSemiring.{u1} K (Field.toSemifield.{u1} K _inst_2)))] [_inst_4 : IsFractionRing.{u2, u1} R _inst_1 K (Field.toCommRing.{u1} K _inst_2) _inst_3] (p : Nat) [_inst_5 : CharP.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (CommRing.toRing.{u2} R _inst_1))) p], CharP.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (Ring.toAddGroupWithOne.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_2)))) p
+Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_p_of_is_fraction_ring IsFractionRing.charP_of_isFractionRingₓ'. -/
/-- If `R` has characteristic `p`, then so does Frac(R). -/
theorem charP_of_isFractionRing [CharP R p] : CharP K p :=
charP_of_injective_algebraMap (IsFractionRing.injective R K) p
#align is_fraction_ring.char_p_of_is_fraction_ring IsFractionRing.charP_of_isFractionRing
+/- warning: is_fraction_ring.char_zero_of_is_fraction_ring -> IsFractionRing.charZero_of_isFractionRing is a dubious translation:
+lean 3 declaration is
+ forall (R : Type.{u1}) {K : Type.{u2}} [_inst_1 : CommRing.{u1} R] [_inst_2 : Field.{u2} K] [_inst_3 : Algebra.{u1, u2} R K (CommRing.toCommSemiring.{u1} R _inst_1) (Ring.toSemiring.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))] [_inst_4 : IsFractionRing.{u1, u2} R _inst_1 K (Field.toCommRing.{u2} K _inst_2) _inst_3] [_inst_5 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u2} K (AddGroupWithOne.toAddMonoidWithOne.{u2} K (NonAssocRing.toAddGroupWithOne.{u2} K (Ring.toNonAssocRing.{u2} K (DivisionRing.toRing.{u2} K (Field.toDivisionRing.{u2} K _inst_2)))))
+but is expected to have type
+ forall (R : Type.{u2}) {K : Type.{u1}} [_inst_1 : CommRing.{u2} R] [_inst_2 : Field.{u1} K] [_inst_3 : Algebra.{u2, u1} R K (CommRing.toCommSemiring.{u2} R _inst_1) (DivisionSemiring.toSemiring.{u1} K (Semifield.toDivisionSemiring.{u1} K (Field.toSemifield.{u1} K _inst_2)))] [_inst_4 : IsFractionRing.{u2, u1} R _inst_1 K (Field.toCommRing.{u1} K _inst_2) _inst_3] [_inst_5 : CharZero.{u2} R (AddGroupWithOne.toAddMonoidWithOne.{u2} R (Ring.toAddGroupWithOne.{u2} R (CommRing.toRing.{u2} R _inst_1)))], CharZero.{u1} K (AddGroupWithOne.toAddMonoidWithOne.{u1} K (Ring.toAddGroupWithOne.{u1} K (DivisionRing.toRing.{u1} K (Field.toDivisionRing.{u1} K _inst_2))))
+Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_zero_of_is_fraction_ring IsFractionRing.charZero_of_isFractionRingₓ'. -/
/-- If `R` has characteristic `0`, then so does Frac(R). -/
theorem charZero_of_isFractionRing [CharZero R] : CharZero K :=
@CharP.charP_to_charZero K _ (charP_of_isFractionRing R 0)
@@ -150,11 +208,23 @@ theorem charZero_of_isFractionRing [CharZero R] : CharZero K :=
variable [IsDomain R]
+/- warning: is_fraction_ring.char_p -> IsFractionRing.charP is a dubious translation:
+lean 3 declaration is
+ forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (CommRing.toRing.{u1} R _inst_1)))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (NonAssocRing.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toNonAssocRing.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5)))))) p
+but is expected to have type
+ forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] (p : Nat) [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharP.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1))) p], CharP.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5))))) p
+Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_p IsFractionRing.charPₓ'. -/
/-- If `R` has characteristic `p`, then so does `fraction_ring R`. -/
instance charP [CharP R p] : CharP (FractionRing R) p :=
charP_of_isFractionRing R p
#align is_fraction_ring.char_p IsFractionRing.charP
+/- warning: is_fraction_ring.char_zero -> IsFractionRing.charZero is a dubious translation:
+lean 3 declaration is
+ forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (NonAssocRing.toAddGroupWithOne.{u1} R (Ring.toNonAssocRing.{u1} R (CommRing.toRing.{u1} R _inst_1))))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (NonAssocRing.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toNonAssocRing.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.field.{u1} R _inst_1 _inst_5))))))
+but is expected to have type
+ forall (R : Type.{u1}) [_inst_1 : CommRing.{u1} R] [_inst_5 : IsDomain.{u1} R (Ring.toSemiring.{u1} R (CommRing.toRing.{u1} R _inst_1))] [_inst_6 : CharZero.{u1} R (AddGroupWithOne.toAddMonoidWithOne.{u1} R (Ring.toAddGroupWithOne.{u1} R (CommRing.toRing.{u1} R _inst_1)))], CharZero.{u1} (FractionRing.{u1} R _inst_1) (AddGroupWithOne.toAddMonoidWithOne.{u1} (FractionRing.{u1} R _inst_1) (Ring.toAddGroupWithOne.{u1} (FractionRing.{u1} R _inst_1) (DivisionRing.toRing.{u1} (FractionRing.{u1} R _inst_1) (Field.toDivisionRing.{u1} (FractionRing.{u1} R _inst_1) (FractionRing.instFieldFractionRing.{u1} R _inst_1 _inst_5)))))
+Case conversion may be inaccurate. Consider using '#align is_fraction_ring.char_zero IsFractionRing.charZeroₓ'. -/
/-- If `R` has characteristic `0`, then so does `fraction_ring R`. -/
instance charZero [CharZero R] : CharZero (FractionRing R) :=
charZero_of_isFractionRing R
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -144,7 +144,6 @@ end FreeAlgebra
namespace IsFractionRing
variable (R : Type*) {K : Type*} [CommRing R] [Field K] [Algebra R K] [IsFractionRing R K]
-
variable (p : ℕ)
/-- If `R` has characteristic `p`, then so does Frac(R). -/
RingHom.(charP|expChar)[_iff]
(#10574)
similar to RingHom.charZero[_iff]
@@ -31,8 +31,8 @@ Instances constructed from this result:
/-- If a ring homomorphism `R →+* A` is injective then `A` has the same characteristic as `R`. -/
-theorem charP_of_injective_ringHom {R A : Type*} [Semiring R] [Semiring A] {f : R →+* A}
- (h : Function.Injective f) (p : ℕ) [CharP R p] : CharP A p where
+theorem charP_of_injective_ringHom {R A : Type*} [NonAssocSemiring R] [NonAssocSemiring A]
+ {f : R →+* A} (h : Function.Injective f) (p : ℕ) [CharP R p] : CharP A p where
cast_eq_zero_iff' x := by
rw [← CharP.cast_eq_zero_iff R p x, ← map_natCast f x, map_eq_zero_iff f h]
@@ -49,8 +49,8 @@ theorem charP_of_injective_algebraMap' (R A : Type*) [Field R] [Semiring A] [Alg
/-- If a ring homomorphism `R →+* A` is injective and `R` has characteristic zero
then so does `A`. -/
-theorem charZero_of_injective_ringHom {R A : Type*} [Semiring R] [Semiring A] {f : R →+* A}
- (h : Function.Injective f) [CharZero R] : CharZero A where
+theorem charZero_of_injective_ringHom {R A : Type*} [NonAssocSemiring R] [NonAssocSemiring A]
+ {f : R →+* A} (h : Function.Injective f) [CharZero R] : CharZero A where
cast_injective _ _ _ := CharZero.cast_injective <| h <| by simpa only [map_natCast f]
/-- If the algebra map `R →+* A` is injective and `R` has characteristic zero then so does `A`. -/
@@ -59,6 +59,19 @@ theorem charZero_of_injective_algebraMap {R A : Type*} [CommSemiring R] [Semirin
charZero_of_injective_ringHom h
#align char_zero_of_injective_algebra_map charZero_of_injective_algebraMap
+/-- If `R →+* A` is injective, and `A` is of characteristic `p`, then `R` is also of
+characteristic `p`. Similar to `RingHom.charZero`. -/
+theorem RingHom.charP {R A : Type*} [NonAssocSemiring R] [NonAssocSemiring A] (f : R →+* A)
+ (H : Function.Injective f) (p : ℕ) [CharP A p] : CharP R p := by
+ obtain ⟨q, h⟩ := CharP.exists R
+ exact CharP.eq _ (charP_of_injective_ringHom H q) ‹CharP A p› ▸ h
+
+/-- If `R →+* A` is injective, then `R` is of characteristic `p` if and only if `A` is also of
+characteristic `p`. Similar to `RingHom.charZero_iff`. -/
+theorem RingHom.charP_iff {R A : Type*} [NonAssocSemiring R] [NonAssocSemiring A] (f : R →+* A)
+ (H : Function.Injective f) (p : ℕ) : CharP R p ↔ CharP A p :=
+ ⟨fun _ ↦ charP_of_injective_ringHom H p, fun _ ↦ f.charP H p⟩
+
/-!
As an application, a `ℚ`-algebra has characteristic zero.
-/
CharP
(#8860)
CharP.neg_one_pow_char
and CharP.neg_one_pow_char_pow
from CommRing
to Ring
ExpChar.exists
, expChar_of_injective_algebraMap
add_pow_expChar
and 9 similar functions parallel to that of CharP
{charP|charZero|expChar}_of_injective_ringHom
@@ -30,15 +30,16 @@ Instances constructed from this result:
-/
+/-- If a ring homomorphism `R →+* A` is injective then `A` has the same characteristic as `R`. -/
+theorem charP_of_injective_ringHom {R A : Type*} [Semiring R] [Semiring A] {f : R →+* A}
+ (h : Function.Injective f) (p : ℕ) [CharP R p] : CharP A p where
+ cast_eq_zero_iff' x := by
+ rw [← CharP.cast_eq_zero_iff R p x, ← map_natCast f x, map_eq_zero_iff f h]
+
/-- If the algebra map `R →+* A` is injective then `A` has the same characteristic as `R`. -/
theorem charP_of_injective_algebraMap {R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) (p : ℕ) [CharP R p] : CharP A p :=
- { cast_eq_zero_iff' := fun x => by
- rw [← CharP.cast_eq_zero_iff R p x]
- change algebraMap ℕ A x = 0 ↔ algebraMap ℕ R x = 0
- rw [IsScalarTower.algebraMap_apply ℕ R A x]
- refine' Iff.trans _ h.eq_iff
- rw [RingHom.map_zero] }
+ charP_of_injective_ringHom h p
#align char_p_of_injective_algebra_map charP_of_injective_algebraMap
theorem charP_of_injective_algebraMap' (R A : Type*) [Field R] [Semiring A] [Algebra R A]
@@ -46,14 +47,16 @@ theorem charP_of_injective_algebraMap' (R A : Type*) [Field R] [Semiring A] [Alg
charP_of_injective_algebraMap (algebraMap R A).injective p
#align char_p_of_injective_algebra_map' charP_of_injective_algebraMap'
+/-- If a ring homomorphism `R →+* A` is injective and `R` has characteristic zero
+then so does `A`. -/
+theorem charZero_of_injective_ringHom {R A : Type*} [Semiring R] [Semiring A] {f : R →+* A}
+ (h : Function.Injective f) [CharZero R] : CharZero A where
+ cast_injective _ _ _ := CharZero.cast_injective <| h <| by simpa only [map_natCast f]
+
/-- If the algebra map `R →+* A` is injective and `R` has characteristic zero then so does `A`. -/
theorem charZero_of_injective_algebraMap {R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) [CharZero R] : CharZero A :=
- { cast_injective := fun x y hxy => by
- change algebraMap ℕ A x = algebraMap ℕ A y at hxy
- rw [IsScalarTower.algebraMap_apply ℕ R A x] at hxy
- rw [IsScalarTower.algebraMap_apply ℕ R A y] at hxy
- exact CharZero.cast_injective (h hxy) }
+ charZero_of_injective_ringHom h
#align char_zero_of_injective_algebra_map charZero_of_injective_algebraMap
/-!
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -31,7 +31,7 @@ Instances constructed from this result:
/-- If the algebra map `R →+* A` is injective then `A` has the same characteristic as `R`. -/
-theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
+theorem charP_of_injective_algebraMap {R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) (p : ℕ) [CharP R p] : CharP A p :=
{ cast_eq_zero_iff' := fun x => by
rw [← CharP.cast_eq_zero_iff R p x]
@@ -41,13 +41,13 @@ theorem charP_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring
rw [RingHom.map_zero] }
#align char_p_of_injective_algebra_map charP_of_injective_algebraMap
-theorem charP_of_injective_algebraMap' (R A : Type _) [Field R] [Semiring A] [Algebra R A]
+theorem charP_of_injective_algebraMap' (R A : Type*) [Field R] [Semiring A] [Algebra R A]
[Nontrivial A] (p : ℕ) [CharP R p] : CharP A p :=
charP_of_injective_algebraMap (algebraMap R A).injective p
#align char_p_of_injective_algebra_map' charP_of_injective_algebraMap'
/-- If the algebra map `R →+* A` is injective and `R` has characteristic zero then so does `A`. -/
-theorem charZero_of_injective_algebraMap {R A : Type _} [CommSemiring R] [Semiring A] [Algebra R A]
+theorem charZero_of_injective_algebraMap {R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A]
(h : Function.Injective (algebraMap R A)) [CharZero R] : CharZero A :=
{ cast_injective := fun x y hxy => by
change algebraMap ℕ A x = algebraMap ℕ A y at hxy
@@ -65,7 +65,7 @@ As an application, a `ℚ`-algebra has characteristic zero.
-- here as it would require `Ring A`.
section QAlgebra
-variable (R : Type _) [Nontrivial R]
+variable (R : Type*) [Nontrivial R]
/-- A nontrivial `ℚ`-algebra has `CharP` equal to zero.
@@ -96,7 +96,7 @@ An algebra over a field has the same characteristic as the field.
section
-variable (K L : Type _) [Field K] [CommSemiring L] [Nontrivial L] [Algebra K L]
+variable (K L : Type*) [Field K] [CommSemiring L] [Nontrivial L] [Algebra K L]
theorem Algebra.charP_iff (p : ℕ) : CharP K p ↔ CharP L p :=
(algebraMap K L).charP_iff_charP p
@@ -111,7 +111,7 @@ end
namespace FreeAlgebra
-variable {R X : Type _} [CommSemiring R] (p : ℕ)
+variable {R X : Type*} [CommSemiring R] (p : ℕ)
/-- If `R` has characteristic `p`, then so does `FreeAlgebra R X`. -/
instance charP [CharP R p] : CharP (FreeAlgebra R X) p :=
@@ -127,7 +127,7 @@ end FreeAlgebra
namespace IsFractionRing
-variable (R : Type _) {K : Type _} [CommRing R] [Field K] [Algebra R K] [IsFractionRing R K]
+variable (R : Type*) {K : Type*} [CommRing R] [Field K] [Algebra R K] [IsFractionRing R K]
variable (p : ℕ)
@@ -2,16 +2,13 @@
Copyright (c) 2021 Jon Eugster. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jon Eugster, Eric Wieser
-
-! This file was ported from Lean 3 source module algebra.char_p.algebra
-! leanprover-community/mathlib commit 96782a2d6dcded92116d8ac9ae48efb41d46a27c
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.CharP.Basic
import Mathlib.RingTheory.Localization.FractionRing
import Mathlib.Algebra.FreeAlgebra
+#align_import algebra.char_p.algebra from "leanprover-community/mathlib"@"96782a2d6dcded92116d8ac9ae48efb41d46a27c"
+
/-!
# Characteristics of algebras
fix-comments.py
on all files.@@ -65,7 +65,7 @@ As an application, a `ℚ`-algebra has characteristic zero.
-- `CharP.charP_to_charZero A _ (charP_of_injective_algebraMap h 0)` does not work
--- here as it would require `ring A`.
+-- here as it would require `Ring A`.
section QAlgebra
variable (R : Type _) [Nontrivial R]
The unported dependencies are