group_theory.complement
⟷
Mathlib.GroupTheory.Complement
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)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -729,7 +729,7 @@ theorem quotientEquivSigmaZMod_symm_apply (q : orbitRel.Quotient (zpowers g) (G
#print Subgroup.quotientEquivSigmaZMod_apply /-
theorem quotientEquivSigmaZMod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H)) (k : ℤ) :
quotientEquivSigmaZMod H g (g ^ k • q.out') = ⟨q, k⟩ := by
- rw [apply_eq_iff_eq_symm_apply, quotient_equiv_sigma_zmod_symm_apply, ZMod.coe_int_cast,
+ rw [apply_eq_iff_eq_symm_apply, quotient_equiv_sigma_zmod_symm_apply, ZMod.coe_intCast,
zpow_smul_mod_minimal_period]
#align subgroup.quotient_equiv_sigma_zmod_apply Subgroup.quotientEquivSigmaZMod_apply
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -3,7 +3,7 @@ Copyright (c) 2021 Thomas Browning. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning
-/
-import Data.Zmod.Quotient
+import Data.ZMod.Quotient
#align_import group_theory.complement from "leanprover-community/mathlib"@"f60c6087a7275b72d5db3c5a1d0e19e35a429c0a"
@@ -806,9 +806,9 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
rw [smul_apply_eq_smul_apply_inv_smul, transfer_transversal_apply, transfer_function_apply, ←
mul_smul, ← zpow_neg_one, ← zpow_add, quotient_equiv_sigma_zmod_apply, smul_eq_mul, ← mul_assoc,
← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id.def, ←
- sub_eq_neg_add, cast_sub_one, add_sub_cancel'_right]
+ sub_eq_neg_add, cast_sub_one, add_sub_cancel]
by_cases hk : k = 0
- · rw [if_pos hk, if_pos hk, zpow_coe_nat]
+ · rw [if_pos hk, if_pos hk, zpow_natCast]
· rw [if_neg hk, if_neg hk]
#align subgroup.transfer_transversal_apply'' Subgroup.transferTransversal_apply''
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -695,7 +695,7 @@ theorem isComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
rintro ⟨h', g, hg : g • a = a⟩ rfl
specialize h1 (h * h') (by rwa [mul_smul, smul_def h', ← hg, ← mul_smul, hg])
refine' Prod.ext (eq_inv_of_mul_eq_one_right h1) (Subtype.ext _)
- rwa [Subtype.ext_iff, coe_one, coe_mul, ← self_eq_mul_left, mul_assoc (↑h) (↑h') g] at h1
+ rwa [Subtype.ext_iff, coe_one, coe_mul, ← self_eq_mul_left, mul_assoc (↑h) (↑h') g] at h1
#align subgroup.is_complement'_stabilizer Subgroup.isComplement'_stabilizer
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -808,7 +808,7 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id.def, ←
sub_eq_neg_add, cast_sub_one, add_sub_cancel'_right]
by_cases hk : k = 0
- · rw [if_pos hk, if_pos hk, zpow_ofNat]
+ · rw [if_pos hk, if_pos hk, zpow_coe_nat]
· rw [if_neg hk, if_neg hk]
#align subgroup.transfer_transversal_apply'' Subgroup.transferTransversal_apply''
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -384,7 +384,14 @@ theorem range_mem_rightTransversals {f : Quotient (QuotientGroup.rightRel H) →
#print Subgroup.exists_left_transversal /-
@[to_additive]
-theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G), g ∈ S := by classical
+theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G), g ∈ S := by
+ classical
+ refine'
+ ⟨Set.range (Function.update Quotient.out' (↑g) g), range_mem_left_transversals fun q => _, g,
+ Function.update_same g g Quotient.out'⟩
+ by_cases hq : q = g
+ · exact hq.symm ▸ congr_arg _ (Function.update_same g g Quotient.out')
+ · exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
#align subgroup.exists_left_transversal Subgroup.exists_left_transversal
#align add_subgroup.exists_left_transversal AddSubgroup.exists_left_transversal
-/
@@ -393,6 +400,12 @@ theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G)
@[to_additive]
theorem exists_right_transversal (g : G) : ∃ S ∈ rightTransversals (H : Set G), g ∈ S := by
classical
+ refine'
+ ⟨Set.range (Function.update Quotient.out' _ g), range_mem_right_transversals fun q => _,
+ Quotient.mk'' g, Function.update_same (Quotient.mk'' g) g Quotient.out'⟩
+ by_cases hq : q = Quotient.mk'' g
+ · exact hq.symm ▸ congr_arg _ (Function.update_same (Quotient.mk'' g) g Quotient.out')
+ · exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
#align subgroup.exists_right_transversal Subgroup.exists_right_transversal
#align add_subgroup.exists_right_transversal AddSubgroup.exists_right_transversal
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -384,14 +384,7 @@ theorem range_mem_rightTransversals {f : Quotient (QuotientGroup.rightRel H) →
#print Subgroup.exists_left_transversal /-
@[to_additive]
-theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G), g ∈ S := by
- classical
- refine'
- ⟨Set.range (Function.update Quotient.out' (↑g) g), range_mem_left_transversals fun q => _, g,
- Function.update_same g g Quotient.out'⟩
- by_cases hq : q = g
- · exact hq.symm ▸ congr_arg _ (Function.update_same g g Quotient.out')
- · exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
+theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G), g ∈ S := by classical
#align subgroup.exists_left_transversal Subgroup.exists_left_transversal
#align add_subgroup.exists_left_transversal AddSubgroup.exists_left_transversal
-/
@@ -400,12 +393,6 @@ theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G)
@[to_additive]
theorem exists_right_transversal (g : G) : ∃ S ∈ rightTransversals (H : Set G), g ∈ S := by
classical
- refine'
- ⟨Set.range (Function.update Quotient.out' _ g), range_mem_right_transversals fun q => _,
- Quotient.mk'' g, Function.update_same (Quotient.mk'' g) g Quotient.out'⟩
- by_cases hq : q = Quotient.mk'' g
- · exact hq.symm ▸ congr_arg _ (Function.update_same (Quotient.mk'' g) g Quotient.out')
- · exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
#align subgroup.exists_right_transversal Subgroup.exists_right_transversal
#align add_subgroup.exists_right_transversal AddSubgroup.exists_right_transversal
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -714,7 +714,7 @@ variable {G : Type u} [Group G] (H : Subgroup G) (g : G)
noncomputable def quotientEquivSigmaZMod :
G ⧸ H ≃ Σ q : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod ((· • ·) g) q.out') :=
(selfEquivSigmaOrbits (zpowers g) (G ⧸ H)).trans
- (sigmaCongrRight fun q => orbitZpowersEquiv g q.out')
+ (sigmaCongrRight fun q => orbitZPowersEquiv g q.out')
#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZMod
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -126,22 +126,22 @@ theorem isComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
#align add_subgroup.is_complement'_comm AddSubgroup.isComplement'_comm
-/
-#print Subgroup.isComplement_top_singleton /-
+#print Subgroup.isComplement_univ_singleton /-
@[to_additive]
-theorem isComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
+theorem isComplement_univ_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
⟨fun ⟨x, _, rfl⟩ ⟨y, _, rfl⟩ h => Prod.ext (Subtype.ext (mul_right_cancel h)) rfl, fun x =>
⟨⟨⟨x * g⁻¹, ⟨⟩⟩, g, rfl⟩, inv_mul_cancel_right x g⟩⟩
-#align subgroup.is_complement_top_singleton Subgroup.isComplement_top_singleton
-#align add_subgroup.is_complement_top_singleton AddSubgroup.isComplement_top_singleton
+#align subgroup.is_complement_top_singleton Subgroup.isComplement_univ_singleton
+#align add_subgroup.is_complement_top_singleton AddSubgroup.isComplement_univ_singleton
-/
-#print Subgroup.isComplement_singleton_top /-
+#print Subgroup.isComplement_singleton_univ /-
@[to_additive]
-theorem isComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
+theorem isComplement_singleton_univ {g : G} : IsComplement ({g} : Set G) ⊤ :=
⟨fun ⟨⟨_, rfl⟩, x⟩ ⟨⟨_, rfl⟩, y⟩ h => Prod.ext rfl (Subtype.ext (mul_left_cancel h)), fun x =>
⟨⟨⟨g, rfl⟩, g⁻¹ * x, ⟨⟩⟩, mul_inv_cancel_left g x⟩⟩
-#align subgroup.is_complement_singleton_top Subgroup.isComplement_singleton_top
-#align add_subgroup.is_complement_singleton_top AddSubgroup.isComplement_singleton_top
+#align subgroup.is_complement_singleton_top Subgroup.isComplement_singleton_univ
+#align add_subgroup.is_complement_singleton_top AddSubgroup.isComplement_singleton_univ
-/
#print Subgroup.isComplement_singleton_left /-
@@ -170,9 +170,9 @@ theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
#align add_subgroup.is_complement_singleton_right AddSubgroup.isComplement_singleton_right
-/
-#print Subgroup.isComplement_top_left /-
+#print Subgroup.isComplement_univ_left /-
@[to_additive]
-theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
+theorem isComplement_univ_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
by
refine'
⟨fun h => set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
@@ -183,13 +183,13 @@ theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
exact subtype.ext_iff.mp (prod.ext_iff.mp this).2
· rintro ⟨g, rfl⟩
exact is_complement_top_singleton
-#align subgroup.is_complement_top_left Subgroup.isComplement_top_left
-#align add_subgroup.is_complement_top_left AddSubgroup.isComplement_top_left
+#align subgroup.is_complement_top_left Subgroup.isComplement_univ_left
+#align add_subgroup.is_complement_top_left AddSubgroup.isComplement_univ_left
-/
-#print Subgroup.isComplement_top_right /-
+#print Subgroup.isComplement_univ_right /-
@[to_additive]
-theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
+theorem isComplement_univ_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
by
refine'
⟨fun h => set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
@@ -200,14 +200,14 @@ theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
exact subtype.ext_iff.mp (prod.ext_iff.mp this).1
· rintro ⟨g, rfl⟩
exact is_complement_singleton_top
-#align subgroup.is_complement_top_right Subgroup.isComplement_top_right
-#align add_subgroup.is_complement_top_right AddSubgroup.isComplement_top_right
+#align subgroup.is_complement_top_right Subgroup.isComplement_univ_right
+#align add_subgroup.is_complement_top_right AddSubgroup.isComplement_univ_right
-/
#print Subgroup.isComplement'_top_bot /-
@[to_additive]
theorem isComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
- isComplement_top_singleton
+ isComplement_univ_singleton
#align subgroup.is_complement'_top_bot Subgroup.isComplement'_top_bot
#align add_subgroup.is_complement'_top_bot AddSubgroup.isComplement'_top_bot
-/
@@ -215,7 +215,7 @@ theorem isComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
#print Subgroup.isComplement'_bot_top /-
@[to_additive]
theorem isComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
- isComplement_singleton_top
+ isComplement_singleton_univ
#align subgroup.is_complement'_bot_top Subgroup.isComplement'_bot_top
#align add_subgroup.is_complement'_bot_top AddSubgroup.isComplement'_bot_top
-/
@@ -239,7 +239,7 @@ theorem isComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
#print Subgroup.isComplement'_top_left /-
@[simp, to_additive]
theorem isComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
- isComplement_top_left.trans coe_eq_singleton
+ isComplement_univ_left.trans coe_eq_singleton
#align subgroup.is_complement'_top_left Subgroup.isComplement'_top_left
#align add_subgroup.is_complement'_top_left AddSubgroup.isComplement'_top_left
-/
@@ -247,7 +247,7 @@ theorem isComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
#print Subgroup.isComplement'_top_right /-
@[simp, to_additive]
theorem isComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
- isComplement_top_right.trans coe_eq_singleton
+ isComplement_univ_right.trans coe_eq_singleton
#align subgroup.is_complement'_top_right Subgroup.isComplement'_top_right
#align add_subgroup.is_complement'_top_right AddSubgroup.isComplement'_top_right
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,7 +3,7 @@ Copyright (c) 2021 Thomas Browning. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning
-/
-import Mathbin.Data.Zmod.Quotient
+import Data.Zmod.Quotient
#align_import group_theory.complement from "leanprover-community/mathlib"@"f60c6087a7275b72d5db3c5a1d0e19e35a429c0a"
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -678,7 +678,7 @@ theorem isComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype
#print Subgroup.isComplement'_of_coprime /-
theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G)
- (h2 : Nat.coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
+ (h2 : Nat.Coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -558,7 +558,7 @@ instance : MulAction F (leftTransversals (H : Set G))
simp only [Subtype.ext_iff, Subtype.coe_mk, smul_left_cancel_iff, inv_smul_smul] at h ⊢
exact subtype.ext_iff.mp (ht2 ⟨t', ht'⟩ h)⟩
one_smul T := Subtype.ext (one_smul F T)
- mul_smul f₁ f₂ T := Subtype.ext (mul_smul f₁ f₂ T)
+ hMul_smul f₁ f₂ T := Subtype.ext (hMul_smul f₁ f₂ T)
#print Subgroup.smul_toFun /-
@[to_additive]
@@ -568,7 +568,8 @@ theorem smul_toFun (f : F) (T : leftTransversals (H : Set G)) (g : G) :
@ExistsUnique.unique (↥(f • T)) (fun s => (↑s)⁻¹ * f • g ∈ H)
(mem_leftTransversals_iff_existsUnique_inv_mul_mem.mp (f • T).2 (f • g))
⟨f • toFun T.2 g, Set.smul_mem_smul_set (Subtype.coe_prop _)⟩ (toFun (f • T).2 (f • g))
- (QuotientAction.inv_mul_mem f (inv_toFun_mul_mem T.2 g)) (inv_toFun_mul_mem (f • T).2 (f • g))
+ (QuotientAction.inv_hMul_mem f (inv_toFun_mul_mem T.2 g))
+ (inv_toFun_mul_mem (f • T).2 (f • g))
#align subgroup.smul_to_fun Subgroup.smul_toFun
#align add_subgroup.vadd_to_fun AddSubgroup.vadd_toFun
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,14 +2,11 @@
Copyright (c) 2021 Thomas Browning. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning
-
-! This file was ported from Lean 3 source module group_theory.complement
-! leanprover-community/mathlib commit f60c6087a7275b72d5db3c5a1d0e19e35a429c0a
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Data.Zmod.Quotient
+#align_import group_theory.complement from "leanprover-community/mathlib"@"f60c6087a7275b72d5db3c5a1d0e19e35a429c0a"
+
/-!
# Complements
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -80,25 +80,31 @@ def rightTransversals : Set (Set G) :=
variable {H K S T}
+#print Subgroup.isComplement'_def /-
@[to_additive]
theorem isComplement'_def : IsComplement' H K ↔ IsComplement (H : Set G) (K : Set G) :=
Iff.rfl
#align subgroup.is_complement'_def Subgroup.isComplement'_def
#align add_subgroup.is_complement'_def AddSubgroup.isComplement'_def
+-/
+#print Subgroup.isComplement_iff_existsUnique /-
@[to_additive]
theorem isComplement_iff_existsUnique :
IsComplement S T ↔ ∀ g : G, ∃! x : S × T, x.1.1 * x.2.1 = g :=
Function.bijective_iff_existsUnique _
#align subgroup.is_complement_iff_exists_unique Subgroup.isComplement_iff_existsUnique
#align add_subgroup.is_complement_iff_exists_unique AddSubgroup.isComplement_iff_existsUnique
+-/
+#print Subgroup.IsComplement.existsUnique /-
@[to_additive]
theorem IsComplement.existsUnique (h : IsComplement S T) (g : G) :
∃! x : S × T, x.1.1 * x.2.1 = g :=
isComplement_iff_existsUnique.mp h g
#align subgroup.is_complement.exists_unique Subgroup.IsComplement.existsUnique
#align add_subgroup.is_complement.exists_unique AddSubgroup.IsComplement.existsUnique
+-/
#print Subgroup.IsComplement'.symm /-
@[to_additive]
@@ -123,20 +129,25 @@ theorem isComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
#align add_subgroup.is_complement'_comm AddSubgroup.isComplement'_comm
-/
+#print Subgroup.isComplement_top_singleton /-
@[to_additive]
theorem isComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
⟨fun ⟨x, _, rfl⟩ ⟨y, _, rfl⟩ h => Prod.ext (Subtype.ext (mul_right_cancel h)) rfl, fun x =>
⟨⟨⟨x * g⁻¹, ⟨⟩⟩, g, rfl⟩, inv_mul_cancel_right x g⟩⟩
#align subgroup.is_complement_top_singleton Subgroup.isComplement_top_singleton
#align add_subgroup.is_complement_top_singleton AddSubgroup.isComplement_top_singleton
+-/
+#print Subgroup.isComplement_singleton_top /-
@[to_additive]
theorem isComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
⟨fun ⟨⟨_, rfl⟩, x⟩ ⟨⟨_, rfl⟩, y⟩ h => Prod.ext rfl (Subtype.ext (mul_left_cancel h)), fun x =>
⟨⟨⟨g, rfl⟩, g⁻¹ * x, ⟨⟩⟩, mul_inv_cancel_left g x⟩⟩
#align subgroup.is_complement_singleton_top Subgroup.isComplement_singleton_top
#align add_subgroup.is_complement_singleton_top AddSubgroup.isComplement_singleton_top
+-/
+#print Subgroup.isComplement_singleton_left /-
@[to_additive]
theorem isComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ :=
by
@@ -146,7 +157,9 @@ theorem isComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ :=
rwa [← mul_left_cancel hy]
#align subgroup.is_complement_singleton_left Subgroup.isComplement_singleton_left
#align add_subgroup.is_complement_singleton_left AddSubgroup.isComplement_singleton_left
+-/
+#print Subgroup.isComplement_singleton_right /-
@[to_additive]
theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
by
@@ -158,7 +171,9 @@ theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
exact y.1.2
#align subgroup.is_complement_singleton_right Subgroup.isComplement_singleton_right
#align add_subgroup.is_complement_singleton_right AddSubgroup.isComplement_singleton_right
+-/
+#print Subgroup.isComplement_top_left /-
@[to_additive]
theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
by
@@ -173,7 +188,9 @@ theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
exact is_complement_top_singleton
#align subgroup.is_complement_top_left Subgroup.isComplement_top_left
#align add_subgroup.is_complement_top_left AddSubgroup.isComplement_top_left
+-/
+#print Subgroup.isComplement_top_right /-
@[to_additive]
theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
by
@@ -188,43 +205,57 @@ theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
exact is_complement_singleton_top
#align subgroup.is_complement_top_right Subgroup.isComplement_top_right
#align add_subgroup.is_complement_top_right AddSubgroup.isComplement_top_right
+-/
+#print Subgroup.isComplement'_top_bot /-
@[to_additive]
theorem isComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
isComplement_top_singleton
#align subgroup.is_complement'_top_bot Subgroup.isComplement'_top_bot
#align add_subgroup.is_complement'_top_bot AddSubgroup.isComplement'_top_bot
+-/
+#print Subgroup.isComplement'_bot_top /-
@[to_additive]
theorem isComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
isComplement_singleton_top
#align subgroup.is_complement'_bot_top Subgroup.isComplement'_bot_top
#align add_subgroup.is_complement'_bot_top AddSubgroup.isComplement'_bot_top
+-/
+#print Subgroup.isComplement'_bot_left /-
@[simp, to_additive]
theorem isComplement'_bot_left : IsComplement' ⊥ H ↔ H = ⊤ :=
isComplement_singleton_left.trans coe_eq_univ
#align subgroup.is_complement'_bot_left Subgroup.isComplement'_bot_left
#align add_subgroup.is_complement'_bot_left AddSubgroup.isComplement'_bot_left
+-/
+#print Subgroup.isComplement'_bot_right /-
@[simp, to_additive]
theorem isComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
isComplement_singleton_right.trans coe_eq_univ
#align subgroup.is_complement'_bot_right Subgroup.isComplement'_bot_right
#align add_subgroup.is_complement'_bot_right AddSubgroup.isComplement'_bot_right
+-/
+#print Subgroup.isComplement'_top_left /-
@[simp, to_additive]
theorem isComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
isComplement_top_left.trans coe_eq_singleton
#align subgroup.is_complement'_top_left Subgroup.isComplement'_top_left
#align add_subgroup.is_complement'_top_left AddSubgroup.isComplement'_top_left
+-/
+#print Subgroup.isComplement'_top_right /-
@[simp, to_additive]
theorem isComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
isComplement_top_right.trans coe_eq_singleton
#align subgroup.is_complement'_top_right Subgroup.isComplement'_top_right
#align add_subgroup.is_complement'_top_right AddSubgroup.isComplement'_top_right
+-/
+#print Subgroup.mem_leftTransversals_iff_existsUnique_inv_mul_mem /-
@[to_additive]
theorem mem_leftTransversals_iff_existsUnique_inv_mul_mem :
S ∈ leftTransversals T ↔ ∀ g : G, ∃! s : S, (s : G)⁻¹ * g ∈ T :=
@@ -241,7 +272,9 @@ theorem mem_leftTransversals_iff_existsUnique_inv_mul_mem :
exact Prod.ext this (Subtype.ext (eq_inv_mul_of_mul_eq ((congr_arg _ this).mp hy)))
#align subgroup.mem_left_transversals_iff_exists_unique_inv_mul_mem Subgroup.mem_leftTransversals_iff_existsUnique_inv_mul_mem
#align add_subgroup.mem_left_transversals_iff_exists_unique_neg_add_mem AddSubgroup.mem_leftTransversals_iff_existsUnique_neg_add_mem
+-/
+#print Subgroup.mem_rightTransversals_iff_existsUnique_mul_inv_mem /-
@[to_additive]
theorem mem_rightTransversals_iff_existsUnique_mul_inv_mem :
S ∈ rightTransversals T ↔ ∀ g : G, ∃! s : S, g * (s : G)⁻¹ ∈ T :=
@@ -258,7 +291,9 @@ theorem mem_rightTransversals_iff_existsUnique_mul_inv_mem :
exact Prod.ext (Subtype.ext (eq_mul_inv_of_mul_eq ((congr_arg _ this).mp hy))) this
#align subgroup.mem_right_transversals_iff_exists_unique_mul_inv_mem Subgroup.mem_rightTransversals_iff_existsUnique_mul_inv_mem
#align add_subgroup.mem_right_transversals_iff_exists_unique_add_neg_mem AddSubgroup.mem_rightTransversals_iff_existsUnique_add_neg_mem
+-/
+#print Subgroup.mem_leftTransversals_iff_existsUnique_quotient_mk''_eq /-
@[to_additive]
theorem mem_leftTransversals_iff_existsUnique_quotient_mk''_eq :
S ∈ leftTransversals (H : Set G) ↔
@@ -269,7 +304,9 @@ theorem mem_leftTransversals_iff_existsUnique_quotient_mk''_eq :
exact ⟨fun h q => Quotient.inductionOn' q h, fun h g => h (Quotient.mk'' g)⟩
#align subgroup.mem_left_transversals_iff_exists_unique_quotient_mk'_eq Subgroup.mem_leftTransversals_iff_existsUnique_quotient_mk''_eq
#align add_subgroup.mem_left_transversals_iff_exists_unique_quotient_mk'_eq AddSubgroup.mem_leftTransversals_iff_existsUnique_quotient_mk''_eq
+-/
+#print Subgroup.mem_rightTransversals_iff_existsUnique_quotient_mk''_eq /-
@[to_additive]
theorem mem_rightTransversals_iff_existsUnique_quotient_mk''_eq :
S ∈ rightTransversals (H : Set G) ↔
@@ -280,7 +317,9 @@ theorem mem_rightTransversals_iff_existsUnique_quotient_mk''_eq :
exact ⟨fun h q => Quotient.inductionOn' q h, fun h g => h (Quotient.mk'' g)⟩
#align subgroup.mem_right_transversals_iff_exists_unique_quotient_mk'_eq Subgroup.mem_rightTransversals_iff_existsUnique_quotient_mk''_eq
#align add_subgroup.mem_right_transversals_iff_exists_unique_quotient_mk'_eq AddSubgroup.mem_rightTransversals_iff_existsUnique_quotient_mk''_eq
+-/
+#print Subgroup.mem_leftTransversals_iff_bijective /-
@[to_additive]
theorem mem_leftTransversals_iff_bijective :
S ∈ leftTransversals (H : Set G) ↔
@@ -289,7 +328,9 @@ theorem mem_leftTransversals_iff_bijective :
(Function.bijective_iff_existsUnique (S.restrict Quotient.mk'')).symm
#align subgroup.mem_left_transversals_iff_bijective Subgroup.mem_leftTransversals_iff_bijective
#align add_subgroup.mem_left_transversals_iff_bijective AddSubgroup.mem_leftTransversals_iff_bijective
+-/
+#print Subgroup.mem_rightTransversals_iff_bijective /-
@[to_additive]
theorem mem_rightTransversals_iff_bijective :
S ∈ rightTransversals (H : Set G) ↔
@@ -298,13 +339,17 @@ theorem mem_rightTransversals_iff_bijective :
(Function.bijective_iff_existsUnique (S.restrict Quotient.mk'')).symm
#align subgroup.mem_right_transversals_iff_bijective Subgroup.mem_rightTransversals_iff_bijective
#align add_subgroup.mem_right_transversals_iff_bijective AddSubgroup.mem_rightTransversals_iff_bijective
+-/
+#print Subgroup.card_left_transversal /-
@[to_additive]
theorem card_left_transversal (h : S ∈ leftTransversals (H : Set G)) : Nat.card S = H.index :=
Nat.card_congr <| Equiv.ofBijective _ <| mem_leftTransversals_iff_bijective.mp h
#align subgroup.card_left_transversal Subgroup.card_left_transversal
#align add_subgroup.card_left_transversal AddSubgroup.card_left_transversal
+-/
+#print Subgroup.card_right_transversal /-
@[to_additive]
theorem card_right_transversal (h : S ∈ rightTransversals (H : Set G)) : Nat.card S = H.index :=
Nat.card_congr <|
@@ -312,7 +357,9 @@ theorem card_right_transversal (h : S ∈ rightTransversals (H : Set G)) : Nat.c
QuotientGroup.quotientRightRelEquivQuotientLeftRel H
#align subgroup.card_right_transversal Subgroup.card_right_transversal
#align add_subgroup.card_right_transversal AddSubgroup.card_right_transversal
+-/
+#print Subgroup.range_mem_leftTransversals /-
@[to_additive]
theorem range_mem_leftTransversals {f : G ⧸ H → G} (hf : ∀ q, ↑(f q) = q) :
Set.range f ∈ leftTransversals (H : Set G) :=
@@ -323,7 +370,9 @@ theorem range_mem_leftTransversals {f : G ⧸ H → G} (hf : ∀ q, ↑(f q) = q
fun q => ⟨⟨f q, q, rfl⟩, hf q⟩⟩
#align subgroup.range_mem_left_transversals Subgroup.range_mem_leftTransversals
#align add_subgroup.range_mem_left_transversals AddSubgroup.range_mem_leftTransversals
+-/
+#print Subgroup.range_mem_rightTransversals /-
@[to_additive]
theorem range_mem_rightTransversals {f : Quotient (QuotientGroup.rightRel H) → G}
(hf : ∀ q, Quotient.mk'' (f q) = q) : Set.range f ∈ rightTransversals (H : Set G) :=
@@ -334,7 +383,9 @@ theorem range_mem_rightTransversals {f : Quotient (QuotientGroup.rightRel H) →
fun q => ⟨⟨f q, q, rfl⟩, hf q⟩⟩
#align subgroup.range_mem_right_transversals Subgroup.range_mem_rightTransversals
#align add_subgroup.range_mem_right_transversals AddSubgroup.range_mem_rightTransversals
+-/
+#print Subgroup.exists_left_transversal /-
@[to_additive]
theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G), g ∈ S := by
classical
@@ -346,7 +397,9 @@ theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G)
· exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
#align subgroup.exists_left_transversal Subgroup.exists_left_transversal
#align add_subgroup.exists_left_transversal AddSubgroup.exists_left_transversal
+-/
+#print Subgroup.exists_right_transversal /-
@[to_additive]
theorem exists_right_transversal (g : G) : ∃ S ∈ rightTransversals (H : Set G), g ∈ S := by
classical
@@ -358,22 +411,27 @@ theorem exists_right_transversal (g : G) : ∃ S ∈ rightTransversals (H : Set
· exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
#align subgroup.exists_right_transversal Subgroup.exists_right_transversal
#align add_subgroup.exists_right_transversal AddSubgroup.exists_right_transversal
+-/
namespace MemLeftTransversals
+#print Subgroup.MemLeftTransversals.toEquiv /-
/-- A left transversal is in bijection with left cosets. -/
@[to_additive "A left transversal is in bijection with left cosets."]
noncomputable def toEquiv (hS : S ∈ Subgroup.leftTransversals (H : Set G)) : G ⧸ H ≃ S :=
(Equiv.ofBijective _ (Subgroup.mem_leftTransversals_iff_bijective.mp hS)).symm
#align subgroup.mem_left_transversals.to_equiv Subgroup.MemLeftTransversals.toEquiv
#align add_subgroup.mem_left_transversals.to_equiv AddSubgroup.MemLeftTransversals.toEquiv
+-/
+#print Subgroup.MemLeftTransversals.mk''_toEquiv /-
@[to_additive]
theorem mk''_toEquiv (hS : S ∈ Subgroup.leftTransversals (H : Set G)) (q : G ⧸ H) :
Quotient.mk'' (toEquiv hS q : G) = q :=
(toEquiv hS).symm_apply_apply q
#align subgroup.mem_left_transversals.mk'_to_equiv Subgroup.MemLeftTransversals.mk''_toEquiv
#align add_subgroup.mem_left_transversals.mk'_to_equiv AddSubgroup.MemLeftTransversals.mk''_toEquiv
+-/
#print Subgroup.MemLeftTransversals.toEquiv_apply /-
@[to_additive]
@@ -386,6 +444,7 @@ theorem toEquiv_apply {f : G ⧸ H → G} (hf : ∀ q, (f q : G ⧸ H) = q) (q :
#align add_subgroup.mem_left_transversals.to_equiv_apply AddSubgroup.MemLeftTransversals.toEquiv_apply
-/
+#print Subgroup.MemLeftTransversals.toFun /-
/-- A left transversal can be viewed as a function mapping each element of the group
to the chosen representative from that left coset. -/
@[to_additive
@@ -394,25 +453,31 @@ noncomputable def toFun (hS : S ∈ Subgroup.leftTransversals (H : Set G)) : G
toEquiv hS ∘ Quotient.mk''
#align subgroup.mem_left_transversals.to_fun Subgroup.MemLeftTransversals.toFun
#align add_subgroup.mem_left_transversals.to_fun AddSubgroup.MemLeftTransversals.toFun
+-/
+#print Subgroup.MemLeftTransversals.inv_toFun_mul_mem /-
@[to_additive]
theorem inv_toFun_mul_mem (hS : S ∈ Subgroup.leftTransversals (H : Set G)) (g : G) :
(toFun hS g : G)⁻¹ * g ∈ H :=
QuotientGroup.leftRel_apply.mp <| Quotient.exact' <| mk''_toEquiv _ _
#align subgroup.mem_left_transversals.inv_to_fun_mul_mem Subgroup.MemLeftTransversals.inv_toFun_mul_mem
#align add_subgroup.mem_left_transversals.neg_to_fun_add_mem AddSubgroup.MemLeftTransversals.neg_toFun_add_mem
+-/
+#print Subgroup.MemLeftTransversals.inv_mul_toFun_mem /-
@[to_additive]
theorem inv_mul_toFun_mem (hS : S ∈ Subgroup.leftTransversals (H : Set G)) (g : G) :
g⁻¹ * toFun hS g ∈ H :=
(congr_arg (· ∈ H) (by rw [mul_inv_rev, inv_inv])).mp (H.inv_mem (inv_toFun_mul_mem hS g))
#align subgroup.mem_left_transversals.inv_mul_to_fun_mem Subgroup.MemLeftTransversals.inv_mul_toFun_mem
#align add_subgroup.mem_left_transversals.neg_add_to_fun_mem AddSubgroup.MemLeftTransversals.neg_add_toFun_mem
+-/
end MemLeftTransversals
namespace MemRightTransversals
+#print Subgroup.MemRightTransversals.toEquiv /-
/-- A right transversal is in bijection with right cosets. -/
@[to_additive "A right transversal is in bijection with right cosets."]
noncomputable def toEquiv (hS : S ∈ Subgroup.rightTransversals (H : Set G)) :
@@ -420,13 +485,16 @@ noncomputable def toEquiv (hS : S ∈ Subgroup.rightTransversals (H : Set G)) :
(Equiv.ofBijective _ (Subgroup.mem_rightTransversals_iff_bijective.mp hS)).symm
#align subgroup.mem_right_transversals.to_equiv Subgroup.MemRightTransversals.toEquiv
#align add_subgroup.mem_right_transversals.to_equiv AddSubgroup.MemRightTransversals.toEquiv
+-/
+#print Subgroup.MemRightTransversals.mk''_toEquiv /-
@[to_additive]
theorem mk''_toEquiv (hS : S ∈ Subgroup.rightTransversals (H : Set G))
(q : Quotient (QuotientGroup.rightRel H)) : Quotient.mk'' (toEquiv hS q : G) = q :=
(toEquiv hS).symm_apply_apply q
#align subgroup.mem_right_transversals.mk'_to_equiv Subgroup.MemRightTransversals.mk''_toEquiv
#align add_subgroup.mem_right_transversals.mk'_to_equiv AddSubgroup.MemRightTransversals.mk''_toEquiv
+-/
#print Subgroup.MemRightTransversals.toEquiv_apply /-
@[to_additive]
@@ -440,6 +508,7 @@ theorem toEquiv_apply {f : Quotient (QuotientGroup.rightRel H) → G}
#align add_subgroup.mem_right_transversals.to_equiv_apply AddSubgroup.MemRightTransversals.toEquiv_apply
-/
+#print Subgroup.MemRightTransversals.toFun /-
/-- A right transversal can be viewed as a function mapping each element of the group
to the chosen representative from that right coset. -/
@[to_additive
@@ -448,20 +517,25 @@ noncomputable def toFun (hS : S ∈ Subgroup.rightTransversals (H : Set G)) : G
toEquiv hS ∘ Quotient.mk''
#align subgroup.mem_right_transversals.to_fun Subgroup.MemRightTransversals.toFun
#align add_subgroup.mem_right_transversals.to_fun AddSubgroup.MemRightTransversals.toFun
+-/
+#print Subgroup.MemRightTransversals.mul_inv_toFun_mem /-
@[to_additive]
theorem mul_inv_toFun_mem (hS : S ∈ Subgroup.rightTransversals (H : Set G)) (g : G) :
g * (toFun hS g : G)⁻¹ ∈ H :=
QuotientGroup.rightRel_apply.mp <| Quotient.exact' <| mk''_toEquiv _ _
#align subgroup.mem_right_transversals.mul_inv_to_fun_mem Subgroup.MemRightTransversals.mul_inv_toFun_mem
#align add_subgroup.mem_right_transversals.add_neg_to_fun_mem AddSubgroup.MemRightTransversals.add_neg_toFun_mem
+-/
+#print Subgroup.MemRightTransversals.toFun_mul_inv_mem /-
@[to_additive]
theorem toFun_mul_inv_mem (hS : S ∈ Subgroup.rightTransversals (H : Set G)) (g : G) :
(toFun hS g : G) * g⁻¹ ∈ H :=
(congr_arg (· ∈ H) (by rw [mul_inv_rev, inv_inv])).mp (H.inv_mem (mul_inv_toFun_mem hS g))
#align subgroup.mem_right_transversals.to_fun_mul_inv_mem Subgroup.MemRightTransversals.toFun_mul_inv_mem
#align add_subgroup.mem_right_transversals.to_fun_add_neg_mem AddSubgroup.MemRightTransversals.toFun_add_neg_mem
+-/
end MemRightTransversals
@@ -489,6 +563,7 @@ instance : MulAction F (leftTransversals (H : Set G))
one_smul T := Subtype.ext (one_smul F T)
mul_smul f₁ f₂ T := Subtype.ext (mul_smul f₁ f₂ T)
+#print Subgroup.smul_toFun /-
@[to_additive]
theorem smul_toFun (f : F) (T : leftTransversals (H : Set G)) (g : G) :
(f • toFun T.2 g : G) = toFun (f • T).2 (f • g) :=
@@ -499,20 +574,25 @@ theorem smul_toFun (f : F) (T : leftTransversals (H : Set G)) (g : G) :
(QuotientAction.inv_mul_mem f (inv_toFun_mul_mem T.2 g)) (inv_toFun_mul_mem (f • T).2 (f • g))
#align subgroup.smul_to_fun Subgroup.smul_toFun
#align add_subgroup.vadd_to_fun AddSubgroup.vadd_toFun
+-/
+#print Subgroup.smul_toEquiv /-
@[to_additive]
theorem smul_toEquiv (f : F) (T : leftTransversals (H : Set G)) (q : G ⧸ H) :
f • (toEquiv T.2 q : G) = toEquiv (f • T).2 (f • q) :=
Quotient.inductionOn' q fun g => smul_toFun f T g
#align subgroup.smul_to_equiv Subgroup.smul_toEquiv
#align add_subgroup.vadd_to_equiv AddSubgroup.vadd_toEquiv
+-/
+#print Subgroup.smul_apply_eq_smul_apply_inv_smul /-
@[to_additive]
theorem smul_apply_eq_smul_apply_inv_smul (f : F) (T : leftTransversals (H : Set G)) (q : G ⧸ H) :
(toEquiv (f • T).2 q : G) = f • (toEquiv T.2 (f⁻¹ • q) : G) := by
rw [smul_to_equiv, smul_inv_smul]
#align subgroup.smul_apply_eq_smul_apply_inv_smul Subgroup.smul_apply_eq_smul_apply_inv_smul
#align add_subgroup.vadd_apply_eq_vadd_apply_neg_vadd AddSubgroup.vadd_apply_eq_vadd_apply_neg_vadd
+-/
end Action
@@ -524,6 +604,7 @@ instance : Inhabited (leftTransversals (H : Set G)) :=
instance : Inhabited (rightTransversals (H : Set G)) :=
⟨⟨Set.range Quotient.out', range_mem_rightTransversals Quotient.out_eq'⟩⟩
+#print Subgroup.IsComplement'.isCompl /-
theorem IsComplement'.isCompl (h : IsComplement' H K) : IsCompl H K :=
by
refine'
@@ -536,18 +617,25 @@ theorem IsComplement'.isCompl (h : IsComplement' H K) : IsCompl H K :=
obtain ⟨⟨h, k⟩, rfl⟩ := h.2 g
exact Subgroup.mul_mem_sup h.2 k.2
#align subgroup.is_complement'.is_compl Subgroup.IsComplement'.isCompl
+-/
+#print Subgroup.IsComplement'.sup_eq_top /-
theorem IsComplement'.sup_eq_top (h : IsComplement' H K) : H ⊔ K = ⊤ :=
h.IsCompl.sup_eq_top
#align subgroup.is_complement'.sup_eq_top Subgroup.IsComplement'.sup_eq_top
+-/
+#print Subgroup.IsComplement'.disjoint /-
theorem IsComplement'.disjoint (h : IsComplement' H K) : Disjoint H K :=
h.IsCompl.Disjoint
#align subgroup.is_complement'.disjoint Subgroup.IsComplement'.disjoint
+-/
+#print Subgroup.IsComplement'.index_eq_card /-
theorem IsComplement'.index_eq_card (h : IsComplement' H K) : K.index = Nat.card H :=
(card_left_transversal h).symm
#align subgroup.is_complement'.index_eq_card Subgroup.IsComplement'.index_eq_card
+-/
#print Subgroup.IsComplement.card_mul /-
theorem IsComplement.card_mul [Fintype G] [Fintype S] [Fintype T] (h : IsComplement S T) :
@@ -556,11 +644,14 @@ theorem IsComplement.card_mul [Fintype G] [Fintype S] [Fintype T] (h : IsComplem
#align subgroup.is_complement.card_mul Subgroup.IsComplement.card_mul
-/
+#print Subgroup.IsComplement'.card_mul /-
theorem IsComplement'.card_mul [Fintype G] [Fintype H] [Fintype K] (h : IsComplement' H K) :
Fintype.card H * Fintype.card K = Fintype.card G :=
h.card_mul
#align subgroup.is_complement'.card_mul Subgroup.IsComplement'.card_mul
+-/
+#print Subgroup.isComplement'_of_disjoint_and_mul_eq_univ /-
theorem isComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
(h2 : ↑H * ↑K = (Set.univ : Set G)) : IsComplement' H K :=
by
@@ -568,25 +659,33 @@ theorem isComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
obtain ⟨h, k, hh, hk, hg⟩ := set.eq_univ_iff_forall.mp h2 g
exact ⟨(⟨h, hh⟩, ⟨k, hk⟩), hg⟩
#align subgroup.is_complement'_of_disjoint_and_mul_eq_univ Subgroup.isComplement'_of_disjoint_and_mul_eq_univ
+-/
+#print Subgroup.isComplement'_of_card_mul_and_disjoint /-
theorem isComplement'_of_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G) (h2 : Disjoint H K) :
IsComplement' H K :=
(Fintype.bijective_iff_injective_and_card _).mpr
⟨mul_injective_of_disjoint h2, (Fintype.card_prod H K).trans h1⟩
#align subgroup.is_complement'_of_card_mul_and_disjoint Subgroup.isComplement'_of_card_mul_and_disjoint
+-/
+#print Subgroup.isComplement'_iff_card_mul_and_disjoint /-
theorem isComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K] :
IsComplement' H K ↔ Fintype.card H * Fintype.card K = Fintype.card G ∧ Disjoint H K :=
⟨fun h => ⟨h.card_mul, h.Disjoint⟩, fun h => isComplement'_of_card_mul_and_disjoint h.1 h.2⟩
#align subgroup.is_complement'_iff_card_mul_and_disjoint Subgroup.isComplement'_iff_card_mul_and_disjoint
+-/
+#print Subgroup.isComplement'_of_coprime /-
theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G)
(h2 : Nat.coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
+-/
+#print Subgroup.isComplement'_stabilizer /-
theorem isComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
(h1 : ∀ h : H, h • a = a → h = 1) (h2 : ∀ g : G, ∃ h : H, h • g • a = a) :
IsComplement' H (MulAction.stabilizer G a) :=
@@ -600,6 +699,7 @@ theorem isComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
refine' Prod.ext (eq_inv_of_mul_eq_one_right h1) (Subtype.ext _)
rwa [Subtype.ext_iff, coe_one, coe_mul, ← self_eq_mul_left, mul_assoc (↑h) (↑h') g] at h1
#align subgroup.is_complement'_stabilizer Subgroup.isComplement'_stabilizer
+-/
end Subgroup
@@ -611,24 +711,30 @@ universe u
variable {G : Type u} [Group G] (H : Subgroup G) (g : G)
+#print Subgroup.quotientEquivSigmaZMod /-
/-- Partition `G ⧸ H` into orbits of the action of `g : G`. -/
noncomputable def quotientEquivSigmaZMod :
G ⧸ H ≃ Σ q : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod ((· • ·) g) q.out') :=
(selfEquivSigmaOrbits (zpowers g) (G ⧸ H)).trans
(sigmaCongrRight fun q => orbitZpowersEquiv g q.out')
#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZMod
+-/
+#print Subgroup.quotientEquivSigmaZMod_symm_apply /-
theorem quotientEquivSigmaZMod_symm_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
(quotientEquivSigmaZMod H g).symm ⟨q, k⟩ = g ^ (k : ℤ) • q.out' :=
rfl
#align subgroup.quotient_equiv_sigma_zmod_symm_apply Subgroup.quotientEquivSigmaZMod_symm_apply
+-/
+#print Subgroup.quotientEquivSigmaZMod_apply /-
theorem quotientEquivSigmaZMod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H)) (k : ℤ) :
quotientEquivSigmaZMod H g (g ^ k • q.out') = ⟨q, k⟩ := by
rw [apply_eq_iff_eq_symm_apply, quotient_equiv_sigma_zmod_symm_apply, ZMod.coe_int_cast,
zpow_smul_mod_minimal_period]
#align subgroup.quotient_equiv_sigma_zmod_apply Subgroup.quotientEquivSigmaZMod_apply
+-/
#print Subgroup.transferFunction /-
/-- The transfer transversal as a function. Given a `⟨g⟩`-orbit `q₀, g • q₀, ..., g ^ (m - 1) • q₀`
@@ -639,11 +745,13 @@ noncomputable def transferFunction : G ⧸ H → G := fun q =>
#align subgroup.transfer_function Subgroup.transferFunction
-/
+#print Subgroup.transferFunction_apply /-
theorem transferFunction_apply (q : G ⧸ H) :
transferFunction H g q =
g ^ ((quotientEquivSigmaZMod H g q).2 : ℤ) * (quotientEquivSigmaZMod H g q).1.out'.out' :=
rfl
#align subgroup.transfer_function_apply Subgroup.transferFunction_apply
+-/
#print Subgroup.coe_transferFunction /-
theorem coe_transferFunction (q : G ⧸ H) : ↑(transferFunction H g q) = q := by
@@ -666,11 +774,13 @@ theorem mem_transferSet (q : G ⧸ H) : transferFunction H g q ∈ transferSet H
#align subgroup.mem_transfer_set Subgroup.mem_transferSet
-/
+#print Subgroup.transferTransversal /-
/-- The transfer transversal. Contains elements of the form `g ^ k • g₀` for fixed choices
of representatives `g₀` of fixed choices of representatives `q₀` of `⟨g⟩`-orbits in `G ⧸ H`. -/
def transferTransversal : leftTransversals (H : Set G) :=
⟨transferSet H g, range_mem_leftTransversals (coe_transferFunction H g)⟩
#align subgroup.transfer_transversal Subgroup.transferTransversal
+-/
#print Subgroup.transferTransversal_apply /-
theorem transferTransversal_apply (q : G ⧸ H) :
@@ -679,13 +789,16 @@ theorem transferTransversal_apply (q : G ⧸ H) :
#align subgroup.transfer_transversal_apply Subgroup.transferTransversal_apply
-/
+#print Subgroup.transferTransversal_apply' /-
theorem transferTransversal_apply' (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
↑(toEquiv (transferTransversal H g).2 (g ^ (k : ℤ) • q.out')) = g ^ (k : ℤ) * q.out'.out' := by
rw [transfer_transversal_apply, transfer_function_apply, ← quotient_equiv_sigma_zmod_symm_apply,
apply_symm_apply]
#align subgroup.transfer_transversal_apply' Subgroup.transferTransversal_apply'
+-/
+#print Subgroup.transferTransversal_apply'' /-
theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
↑(toEquiv (g • transferTransversal H g).2 (g ^ (k : ℤ) • q.out')) =
@@ -700,6 +813,7 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
· rw [if_pos hk, if_pos hk, zpow_ofNat]
· rw [if_neg hk, if_neg hk]
#align subgroup.transfer_transversal_apply'' Subgroup.transferTransversal_apply''
+-/
end Subgroup
mathlib commit https://github.com/leanprover-community/mathlib/commit/31c24aa72e7b3e5ed97a8412470e904f82b81004
@@ -81,22 +81,22 @@ def rightTransversals : Set (Set G) :=
variable {H K S T}
@[to_additive]
-theorem IsComplement'_def : IsComplement' H K ↔ IsComplement (H : Set G) (K : Set G) :=
+theorem isComplement'_def : IsComplement' H K ↔ IsComplement (H : Set G) (K : Set G) :=
Iff.rfl
-#align subgroup.is_complement'_def Subgroup.IsComplement'_def
-#align add_subgroup.is_complement'_def AddSubgroup.IsComplement'_def
+#align subgroup.is_complement'_def Subgroup.isComplement'_def
+#align add_subgroup.is_complement'_def AddSubgroup.isComplement'_def
@[to_additive]
-theorem IsComplement_iff_existsUnique :
+theorem isComplement_iff_existsUnique :
IsComplement S T ↔ ∀ g : G, ∃! x : S × T, x.1.1 * x.2.1 = g :=
Function.bijective_iff_existsUnique _
-#align subgroup.is_complement_iff_exists_unique Subgroup.IsComplement_iff_existsUnique
-#align add_subgroup.is_complement_iff_exists_unique AddSubgroup.IsComplement_iff_existsUnique
+#align subgroup.is_complement_iff_exists_unique Subgroup.isComplement_iff_existsUnique
+#align add_subgroup.is_complement_iff_exists_unique AddSubgroup.isComplement_iff_existsUnique
@[to_additive]
theorem IsComplement.existsUnique (h : IsComplement S T) (g : G) :
∃! x : S × T, x.1.1 * x.2.1 = g :=
- IsComplement_iff_existsUnique.mp h g
+ isComplement_iff_existsUnique.mp h g
#align subgroup.is_complement.exists_unique Subgroup.IsComplement.existsUnique
#align add_subgroup.is_complement.exists_unique AddSubgroup.IsComplement.existsUnique
@@ -115,40 +115,40 @@ theorem IsComplement'.symm (h : IsComplement' H K) : IsComplement' K H :=
#align add_subgroup.is_complement'.symm AddSubgroup.IsComplement'.symm
-/
-#print Subgroup.IsComplement'_comm /-
+#print Subgroup.isComplement'_comm /-
@[to_additive]
-theorem IsComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
+theorem isComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
⟨IsComplement'.symm, IsComplement'.symm⟩
-#align subgroup.is_complement'_comm Subgroup.IsComplement'_comm
-#align add_subgroup.is_complement'_comm AddSubgroup.IsComplement'_comm
+#align subgroup.is_complement'_comm Subgroup.isComplement'_comm
+#align add_subgroup.is_complement'_comm AddSubgroup.isComplement'_comm
-/
@[to_additive]
-theorem IsComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
+theorem isComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
⟨fun ⟨x, _, rfl⟩ ⟨y, _, rfl⟩ h => Prod.ext (Subtype.ext (mul_right_cancel h)) rfl, fun x =>
⟨⟨⟨x * g⁻¹, ⟨⟩⟩, g, rfl⟩, inv_mul_cancel_right x g⟩⟩
-#align subgroup.is_complement_top_singleton Subgroup.IsComplement_top_singleton
-#align add_subgroup.is_complement_top_singleton AddSubgroup.IsComplement_top_singleton
+#align subgroup.is_complement_top_singleton Subgroup.isComplement_top_singleton
+#align add_subgroup.is_complement_top_singleton AddSubgroup.isComplement_top_singleton
@[to_additive]
-theorem IsComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
+theorem isComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
⟨fun ⟨⟨_, rfl⟩, x⟩ ⟨⟨_, rfl⟩, y⟩ h => Prod.ext rfl (Subtype.ext (mul_left_cancel h)), fun x =>
⟨⟨⟨g, rfl⟩, g⁻¹ * x, ⟨⟩⟩, mul_inv_cancel_left g x⟩⟩
-#align subgroup.is_complement_singleton_top Subgroup.IsComplement_singleton_top
-#align add_subgroup.is_complement_singleton_top AddSubgroup.IsComplement_singleton_top
+#align subgroup.is_complement_singleton_top Subgroup.isComplement_singleton_top
+#align add_subgroup.is_complement_singleton_top AddSubgroup.isComplement_singleton_top
@[to_additive]
-theorem IsComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ :=
+theorem isComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ :=
by
refine'
⟨fun h => top_le_iff.mp fun x hx => _, fun h => (congr_arg _ h).mpr is_complement_singleton_top⟩
obtain ⟨⟨⟨z, rfl : z = g⟩, y, _⟩, hy⟩ := h.2 (g * x)
rwa [← mul_left_cancel hy]
-#align subgroup.is_complement_singleton_left Subgroup.IsComplement_singleton_left
-#align add_subgroup.is_complement_singleton_left AddSubgroup.IsComplement_singleton_left
+#align subgroup.is_complement_singleton_left Subgroup.isComplement_singleton_left
+#align add_subgroup.is_complement_singleton_left AddSubgroup.isComplement_singleton_left
@[to_additive]
-theorem IsComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
+theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
by
refine'
⟨fun h => top_le_iff.mp fun x hx => _, fun h => (congr_arg _ h).mpr is_complement_top_singleton⟩
@@ -156,11 +156,11 @@ theorem IsComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
conv_rhs at hy => rw [← show y.2.1 = g from y.2.2]
rw [← mul_right_cancel hy]
exact y.1.2
-#align subgroup.is_complement_singleton_right Subgroup.IsComplement_singleton_right
-#align add_subgroup.is_complement_singleton_right AddSubgroup.IsComplement_singleton_right
+#align subgroup.is_complement_singleton_right Subgroup.isComplement_singleton_right
+#align add_subgroup.is_complement_singleton_right AddSubgroup.isComplement_singleton_right
@[to_additive]
-theorem IsComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
+theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
by
refine'
⟨fun h => set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
@@ -171,11 +171,11 @@ theorem IsComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
exact subtype.ext_iff.mp (prod.ext_iff.mp this).2
· rintro ⟨g, rfl⟩
exact is_complement_top_singleton
-#align subgroup.is_complement_top_left Subgroup.IsComplement_top_left
-#align add_subgroup.is_complement_top_left AddSubgroup.IsComplement_top_left
+#align subgroup.is_complement_top_left Subgroup.isComplement_top_left
+#align add_subgroup.is_complement_top_left AddSubgroup.isComplement_top_left
@[to_additive]
-theorem IsComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
+theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
by
refine'
⟨fun h => set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
@@ -186,44 +186,44 @@ theorem IsComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
exact subtype.ext_iff.mp (prod.ext_iff.mp this).1
· rintro ⟨g, rfl⟩
exact is_complement_singleton_top
-#align subgroup.is_complement_top_right Subgroup.IsComplement_top_right
-#align add_subgroup.is_complement_top_right AddSubgroup.IsComplement_top_right
+#align subgroup.is_complement_top_right Subgroup.isComplement_top_right
+#align add_subgroup.is_complement_top_right AddSubgroup.isComplement_top_right
@[to_additive]
-theorem IsComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
- IsComplement_top_singleton
-#align subgroup.is_complement'_top_bot Subgroup.IsComplement'_top_bot
-#align add_subgroup.is_complement'_top_bot AddSubgroup.IsComplement'_top_bot
+theorem isComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
+ isComplement_top_singleton
+#align subgroup.is_complement'_top_bot Subgroup.isComplement'_top_bot
+#align add_subgroup.is_complement'_top_bot AddSubgroup.isComplement'_top_bot
@[to_additive]
-theorem IsComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
- IsComplement_singleton_top
-#align subgroup.is_complement'_bot_top Subgroup.IsComplement'_bot_top
-#align add_subgroup.is_complement'_bot_top AddSubgroup.IsComplement'_bot_top
+theorem isComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
+ isComplement_singleton_top
+#align subgroup.is_complement'_bot_top Subgroup.isComplement'_bot_top
+#align add_subgroup.is_complement'_bot_top AddSubgroup.isComplement'_bot_top
@[simp, to_additive]
-theorem IsComplement'_bot_left : IsComplement' ⊥ H ↔ H = ⊤ :=
- IsComplement_singleton_left.trans coe_eq_univ
-#align subgroup.is_complement'_bot_left Subgroup.IsComplement'_bot_left
-#align add_subgroup.is_complement'_bot_left AddSubgroup.IsComplement'_bot_left
+theorem isComplement'_bot_left : IsComplement' ⊥ H ↔ H = ⊤ :=
+ isComplement_singleton_left.trans coe_eq_univ
+#align subgroup.is_complement'_bot_left Subgroup.isComplement'_bot_left
+#align add_subgroup.is_complement'_bot_left AddSubgroup.isComplement'_bot_left
@[simp, to_additive]
-theorem IsComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
- IsComplement_singleton_right.trans coe_eq_univ
-#align subgroup.is_complement'_bot_right Subgroup.IsComplement'_bot_right
-#align add_subgroup.is_complement'_bot_right AddSubgroup.IsComplement'_bot_right
+theorem isComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
+ isComplement_singleton_right.trans coe_eq_univ
+#align subgroup.is_complement'_bot_right Subgroup.isComplement'_bot_right
+#align add_subgroup.is_complement'_bot_right AddSubgroup.isComplement'_bot_right
@[simp, to_additive]
-theorem IsComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
- IsComplement_top_left.trans coe_eq_singleton
-#align subgroup.is_complement'_top_left Subgroup.IsComplement'_top_left
-#align add_subgroup.is_complement'_top_left AddSubgroup.IsComplement'_top_left
+theorem isComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
+ isComplement_top_left.trans coe_eq_singleton
+#align subgroup.is_complement'_top_left Subgroup.isComplement'_top_left
+#align add_subgroup.is_complement'_top_left AddSubgroup.isComplement'_top_left
@[simp, to_additive]
-theorem IsComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
- IsComplement_top_right.trans coe_eq_singleton
-#align subgroup.is_complement'_top_right Subgroup.IsComplement'_top_right
-#align add_subgroup.is_complement'_top_right AddSubgroup.IsComplement'_top_right
+theorem isComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
+ isComplement_top_right.trans coe_eq_singleton
+#align subgroup.is_complement'_top_right Subgroup.isComplement'_top_right
+#align add_subgroup.is_complement'_top_right AddSubgroup.isComplement'_top_right
@[to_additive]
theorem mem_leftTransversals_iff_existsUnique_inv_mul_mem :
@@ -561,33 +561,33 @@ theorem IsComplement'.card_mul [Fintype G] [Fintype H] [Fintype K] (h : IsComple
h.card_mul
#align subgroup.is_complement'.card_mul Subgroup.IsComplement'.card_mul
-theorem IsComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
+theorem isComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
(h2 : ↑H * ↑K = (Set.univ : Set G)) : IsComplement' H K :=
by
refine' ⟨mul_injective_of_disjoint h1, fun g => _⟩
obtain ⟨h, k, hh, hk, hg⟩ := set.eq_univ_iff_forall.mp h2 g
exact ⟨(⟨h, hh⟩, ⟨k, hk⟩), hg⟩
-#align subgroup.is_complement'_of_disjoint_and_mul_eq_univ Subgroup.IsComplement'_of_disjoint_and_mul_eq_univ
+#align subgroup.is_complement'_of_disjoint_and_mul_eq_univ Subgroup.isComplement'_of_disjoint_and_mul_eq_univ
-theorem IsComplement'_of_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K]
+theorem isComplement'_of_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G) (h2 : Disjoint H K) :
IsComplement' H K :=
(Fintype.bijective_iff_injective_and_card _).mpr
⟨mul_injective_of_disjoint h2, (Fintype.card_prod H K).trans h1⟩
-#align subgroup.is_complement'_of_card_mul_and_disjoint Subgroup.IsComplement'_of_card_mul_and_disjoint
+#align subgroup.is_complement'_of_card_mul_and_disjoint Subgroup.isComplement'_of_card_mul_and_disjoint
-theorem IsComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K] :
+theorem isComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K] :
IsComplement' H K ↔ Fintype.card H * Fintype.card K = Fintype.card G ∧ Disjoint H K :=
- ⟨fun h => ⟨h.card_mul, h.Disjoint⟩, fun h => IsComplement'_of_card_mul_and_disjoint h.1 h.2⟩
-#align subgroup.is_complement'_iff_card_mul_and_disjoint Subgroup.IsComplement'_iff_card_mul_and_disjoint
+ ⟨fun h => ⟨h.card_mul, h.Disjoint⟩, fun h => isComplement'_of_card_mul_and_disjoint h.1 h.2⟩
+#align subgroup.is_complement'_iff_card_mul_and_disjoint Subgroup.isComplement'_iff_card_mul_and_disjoint
-theorem IsComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
+theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G)
(h2 : Nat.coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
- IsComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
-#align subgroup.is_complement'_of_coprime Subgroup.IsComplement'_of_coprime
+ isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
+#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
-theorem IsComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
+theorem isComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
(h1 : ∀ h : H, h • a = a → h = 1) (h2 : ∀ g : G, ∃ h : H, h • g • a = a) :
IsComplement' H (MulAction.stabilizer G a) :=
by
@@ -599,7 +599,7 @@ theorem IsComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
specialize h1 (h * h') (by rwa [mul_smul, smul_def h', ← hg, ← mul_smul, hg])
refine' Prod.ext (eq_inv_of_mul_eq_one_right h1) (Subtype.ext _)
rwa [Subtype.ext_iff, coe_one, coe_mul, ← self_eq_mul_left, mul_assoc (↑h) (↑h') g] at h1
-#align subgroup.is_complement'_stabilizer Subgroup.IsComplement'_stabilizer
+#align subgroup.is_complement'_stabilizer Subgroup.isComplement'_stabilizer
end Subgroup
@@ -612,36 +612,36 @@ universe u
variable {G : Type u} [Group G] (H : Subgroup G) (g : G)
/-- Partition `G ⧸ H` into orbits of the action of `g : G`. -/
-noncomputable def quotientEquivSigmaZmod :
+noncomputable def quotientEquivSigmaZMod :
G ⧸ H ≃ Σ q : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod ((· • ·) g) q.out') :=
(selfEquivSigmaOrbits (zpowers g) (G ⧸ H)).trans
(sigmaCongrRight fun q => orbitZpowersEquiv g q.out')
-#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZmod
+#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZMod
-theorem quotientEquivSigmaZmod_symm_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
+theorem quotientEquivSigmaZMod_symm_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
- (quotientEquivSigmaZmod H g).symm ⟨q, k⟩ = g ^ (k : ℤ) • q.out' :=
+ (quotientEquivSigmaZMod H g).symm ⟨q, k⟩ = g ^ (k : ℤ) • q.out' :=
rfl
-#align subgroup.quotient_equiv_sigma_zmod_symm_apply Subgroup.quotientEquivSigmaZmod_symm_apply
+#align subgroup.quotient_equiv_sigma_zmod_symm_apply Subgroup.quotientEquivSigmaZMod_symm_apply
-theorem quotientEquivSigmaZmod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H)) (k : ℤ) :
- quotientEquivSigmaZmod H g (g ^ k • q.out') = ⟨q, k⟩ := by
+theorem quotientEquivSigmaZMod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H)) (k : ℤ) :
+ quotientEquivSigmaZMod H g (g ^ k • q.out') = ⟨q, k⟩ := by
rw [apply_eq_iff_eq_symm_apply, quotient_equiv_sigma_zmod_symm_apply, ZMod.coe_int_cast,
zpow_smul_mod_minimal_period]
-#align subgroup.quotient_equiv_sigma_zmod_apply Subgroup.quotientEquivSigmaZmod_apply
+#align subgroup.quotient_equiv_sigma_zmod_apply Subgroup.quotientEquivSigmaZMod_apply
#print Subgroup.transferFunction /-
/-- The transfer transversal as a function. Given a `⟨g⟩`-orbit `q₀, g • q₀, ..., g ^ (m - 1) • q₀`
in `G ⧸ H`, an element `g ^ k • q₀` is mapped to `g ^ k • g₀` for a fixed choice of
representative `g₀` of `q₀`. -/
noncomputable def transferFunction : G ⧸ H → G := fun q =>
- g ^ ((quotientEquivSigmaZmod H g q).2 : ℤ) * (quotientEquivSigmaZmod H g q).1.out'.out'
+ g ^ ((quotientEquivSigmaZMod H g q).2 : ℤ) * (quotientEquivSigmaZMod H g q).1.out'.out'
#align subgroup.transfer_function Subgroup.transferFunction
-/
theorem transferFunction_apply (q : G ⧸ H) :
transferFunction H g q =
- g ^ ((quotientEquivSigmaZmod H g q).2 : ℤ) * (quotientEquivSigmaZmod H g q).1.out'.out' :=
+ g ^ ((quotientEquivSigmaZMod H g q).2 : ℤ) * (quotientEquivSigmaZMod H g q).1.out'.out' :=
rfl
#align subgroup.transfer_function_apply Subgroup.transferFunction_apply
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -64,7 +64,7 @@ abbrev IsComplement' :=
/-- The set of left-complements of `T : set G` -/
@[to_additive "The set of left-complements of `T : set G`"]
def leftTransversals : Set (Set G) :=
- { S : Set G | IsComplement S T }
+ {S : Set G | IsComplement S T}
#align subgroup.left_transversals Subgroup.leftTransversals
#align add_subgroup.left_transversals AddSubgroup.leftTransversals
-/
@@ -73,7 +73,7 @@ def leftTransversals : Set (Set G) :=
/-- The set of right-complements of `S : set G` -/
@[to_additive "The set of right-complements of `S : set G`"]
def rightTransversals : Set (Set G) :=
- { T : Set G | IsComplement S T }
+ {T : Set G | IsComplement S T}
#align subgroup.right_transversals Subgroup.rightTransversals
#align add_subgroup.right_transversals AddSubgroup.rightTransversals
-/
@@ -338,24 +338,24 @@ theorem range_mem_rightTransversals {f : Quotient (QuotientGroup.rightRel H) →
@[to_additive]
theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G), g ∈ S := by
classical
- refine'
- ⟨Set.range (Function.update Quotient.out' (↑g) g), range_mem_left_transversals fun q => _, g,
- Function.update_same g g Quotient.out'⟩
- by_cases hq : q = g
- · exact hq.symm ▸ congr_arg _ (Function.update_same g g Quotient.out')
- · exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
+ refine'
+ ⟨Set.range (Function.update Quotient.out' (↑g) g), range_mem_left_transversals fun q => _, g,
+ Function.update_same g g Quotient.out'⟩
+ by_cases hq : q = g
+ · exact hq.symm ▸ congr_arg _ (Function.update_same g g Quotient.out')
+ · exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
#align subgroup.exists_left_transversal Subgroup.exists_left_transversal
#align add_subgroup.exists_left_transversal AddSubgroup.exists_left_transversal
@[to_additive]
theorem exists_right_transversal (g : G) : ∃ S ∈ rightTransversals (H : Set G), g ∈ S := by
classical
- refine'
- ⟨Set.range (Function.update Quotient.out' _ g), range_mem_right_transversals fun q => _,
- Quotient.mk'' g, Function.update_same (Quotient.mk'' g) g Quotient.out'⟩
- by_cases hq : q = Quotient.mk'' g
- · exact hq.symm ▸ congr_arg _ (Function.update_same (Quotient.mk'' g) g Quotient.out')
- · exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
+ refine'
+ ⟨Set.range (Function.update Quotient.out' _ g), range_mem_right_transversals fun q => _,
+ Quotient.mk'' g, Function.update_same (Quotient.mk'' g) g Quotient.out'⟩
+ by_cases hq : q = Quotient.mk'' g
+ · exact hq.symm ▸ congr_arg _ (Function.update_same (Quotient.mk'' g) g Quotient.out')
+ · exact Eq.trans (congr_arg _ (Function.update_noteq hq g Quotient.out')) q.out_eq'
#align subgroup.exists_right_transversal Subgroup.exists_right_transversal
#align add_subgroup.exists_right_transversal AddSubgroup.exists_right_transversal
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -484,7 +484,7 @@ instance : MulAction F (leftTransversals (H : Set G))
· exact (congr_arg _ (smul_inv_smul f g)).mp (quotient_action.inv_mul_mem f ht1)
· rintro ⟨-, t', ht', rfl⟩ h
replace h := quotient_action.inv_mul_mem f⁻¹ h
- simp only [Subtype.ext_iff, Subtype.coe_mk, smul_left_cancel_iff, inv_smul_smul] at h⊢
+ simp only [Subtype.ext_iff, Subtype.coe_mk, smul_left_cancel_iff, inv_smul_smul] at h ⊢
exact subtype.ext_iff.mp (ht2 ⟨t', ht'⟩ h)⟩
one_smul T := Subtype.ext (one_smul F T)
mul_smul f₁ f₂ T := Subtype.ext (mul_smul f₁ f₂ T)
@@ -598,7 +598,7 @@ theorem IsComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
rintro ⟨h', g, hg : g • a = a⟩ rfl
specialize h1 (h * h') (by rwa [mul_smul, smul_def h', ← hg, ← mul_smul, hg])
refine' Prod.ext (eq_inv_of_mul_eq_one_right h1) (Subtype.ext _)
- rwa [Subtype.ext_iff, coe_one, coe_mul, ← self_eq_mul_left, mul_assoc (↑h) (↑h') g] at h1
+ rwa [Subtype.ext_iff, coe_one, coe_mul, ← self_eq_mul_left, mul_assoc (↑h) (↑h') g] at h1
#align subgroup.is_complement'_stabilizer Subgroup.IsComplement'_stabilizer
end Subgroup
@@ -613,7 +613,7 @@ variable {G : Type u} [Group G] (H : Subgroup G) (g : G)
/-- Partition `G ⧸ H` into orbits of the action of `g : G`. -/
noncomputable def quotientEquivSigmaZmod :
- G ⧸ H ≃ Σq : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod ((· • ·) g) q.out') :=
+ G ⧸ H ≃ Σ q : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod ((· • ·) g) q.out') :=
(selfEquivSigmaOrbits (zpowers g) (G ⧸ H)).trans
(sigmaCongrRight fun q => orbitZpowersEquiv g q.out')
#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZmod
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning
! This file was ported from Lean 3 source module group_theory.complement
-! leanprover-community/mathlib commit 6ca1a09bc9aa75824bf97388c9e3b441fc4ccf3f
+! leanprover-community/mathlib commit f60c6087a7275b72d5db3c5a1d0e19e35a429c0a
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -13,6 +13,9 @@ import Mathbin.Data.Zmod.Quotient
/-!
# Complements
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
In this file we define the complement of a subgroup.
## Main definitions
@@ -38,6 +41,7 @@ namespace Subgroup
variable {G : Type _} [Group G] (H K : Subgroup G) (S T : Set G)
+#print Subgroup.IsComplement /-
/-- `S` and `T` are complements if `(*) : S × T → G` is a bijection.
This notion generalizes left transversals, right transversals, and complementary subgroups. -/
@[to_additive "`S` and `T` are complements if `(*) : S × T → G` is a bijection"]
@@ -45,50 +49,58 @@ def IsComplement : Prop :=
Function.Bijective fun x : S × T => x.1.1 * x.2.1
#align subgroup.is_complement Subgroup.IsComplement
#align add_subgroup.is_complement AddSubgroup.IsComplement
+-/
+#print Subgroup.IsComplement' /-
/-- `H` and `K` are complements if `(*) : H × K → G` is a bijection -/
@[to_additive "`H` and `K` are complements if `(*) : H × K → G` is a bijection"]
abbrev IsComplement' :=
IsComplement (H : Set G) (K : Set G)
#align subgroup.is_complement' Subgroup.IsComplement'
#align add_subgroup.is_complement' AddSubgroup.IsComplement'
+-/
+#print Subgroup.leftTransversals /-
/-- The set of left-complements of `T : set G` -/
@[to_additive "The set of left-complements of `T : set G`"]
def leftTransversals : Set (Set G) :=
{ S : Set G | IsComplement S T }
#align subgroup.left_transversals Subgroup.leftTransversals
#align add_subgroup.left_transversals AddSubgroup.leftTransversals
+-/
+#print Subgroup.rightTransversals /-
/-- The set of right-complements of `S : set G` -/
@[to_additive "The set of right-complements of `S : set G`"]
def rightTransversals : Set (Set G) :=
{ T : Set G | IsComplement S T }
#align subgroup.right_transversals Subgroup.rightTransversals
#align add_subgroup.right_transversals AddSubgroup.rightTransversals
+-/
variable {H K S T}
@[to_additive]
-theorem isComplement'_def : IsComplement' H K ↔ IsComplement (H : Set G) (K : Set G) :=
+theorem IsComplement'_def : IsComplement' H K ↔ IsComplement (H : Set G) (K : Set G) :=
Iff.rfl
-#align subgroup.is_complement'_def Subgroup.isComplement'_def
-#align add_subgroup.is_complement'_def AddSubgroup.isComplement'_def
+#align subgroup.is_complement'_def Subgroup.IsComplement'_def
+#align add_subgroup.is_complement'_def AddSubgroup.IsComplement'_def
@[to_additive]
-theorem isComplement_iff_existsUnique :
+theorem IsComplement_iff_existsUnique :
IsComplement S T ↔ ∀ g : G, ∃! x : S × T, x.1.1 * x.2.1 = g :=
Function.bijective_iff_existsUnique _
-#align subgroup.is_complement_iff_exists_unique Subgroup.isComplement_iff_existsUnique
-#align add_subgroup.is_complement_iff_exists_unique AddSubgroup.isComplement_iff_existsUnique
+#align subgroup.is_complement_iff_exists_unique Subgroup.IsComplement_iff_existsUnique
+#align add_subgroup.is_complement_iff_exists_unique AddSubgroup.IsComplement_iff_existsUnique
@[to_additive]
theorem IsComplement.existsUnique (h : IsComplement S T) (g : G) :
∃! x : S × T, x.1.1 * x.2.1 = g :=
- isComplement_iff_existsUnique.mp h g
+ IsComplement_iff_existsUnique.mp h g
#align subgroup.is_complement.exists_unique Subgroup.IsComplement.existsUnique
#align add_subgroup.is_complement.exists_unique AddSubgroup.IsComplement.existsUnique
+#print Subgroup.IsComplement'.symm /-
@[to_additive]
theorem IsComplement'.symm (h : IsComplement' H K) : IsComplement' K H :=
by
@@ -101,39 +113,42 @@ theorem IsComplement'.symm (h : IsComplement' H K) : IsComplement' K H :=
exact funext fun x => mul_inv_rev _ _
#align subgroup.is_complement'.symm Subgroup.IsComplement'.symm
#align add_subgroup.is_complement'.symm AddSubgroup.IsComplement'.symm
+-/
+#print Subgroup.IsComplement'_comm /-
@[to_additive]
-theorem isComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
+theorem IsComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
⟨IsComplement'.symm, IsComplement'.symm⟩
-#align subgroup.is_complement'_comm Subgroup.isComplement'_comm
-#align add_subgroup.is_complement'_comm AddSubgroup.isComplement'_comm
+#align subgroup.is_complement'_comm Subgroup.IsComplement'_comm
+#align add_subgroup.is_complement'_comm AddSubgroup.IsComplement'_comm
+-/
@[to_additive]
-theorem isComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
+theorem IsComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
⟨fun ⟨x, _, rfl⟩ ⟨y, _, rfl⟩ h => Prod.ext (Subtype.ext (mul_right_cancel h)) rfl, fun x =>
⟨⟨⟨x * g⁻¹, ⟨⟩⟩, g, rfl⟩, inv_mul_cancel_right x g⟩⟩
-#align subgroup.is_complement_top_singleton Subgroup.isComplement_top_singleton
-#align add_subgroup.is_complement_top_singleton AddSubgroup.isComplement_top_singleton
+#align subgroup.is_complement_top_singleton Subgroup.IsComplement_top_singleton
+#align add_subgroup.is_complement_top_singleton AddSubgroup.IsComplement_top_singleton
@[to_additive]
-theorem isComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
+theorem IsComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
⟨fun ⟨⟨_, rfl⟩, x⟩ ⟨⟨_, rfl⟩, y⟩ h => Prod.ext rfl (Subtype.ext (mul_left_cancel h)), fun x =>
⟨⟨⟨g, rfl⟩, g⁻¹ * x, ⟨⟩⟩, mul_inv_cancel_left g x⟩⟩
-#align subgroup.is_complement_singleton_top Subgroup.isComplement_singleton_top
-#align add_subgroup.is_complement_singleton_top AddSubgroup.isComplement_singleton_top
+#align subgroup.is_complement_singleton_top Subgroup.IsComplement_singleton_top
+#align add_subgroup.is_complement_singleton_top AddSubgroup.IsComplement_singleton_top
@[to_additive]
-theorem isComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ :=
+theorem IsComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ :=
by
refine'
⟨fun h => top_le_iff.mp fun x hx => _, fun h => (congr_arg _ h).mpr is_complement_singleton_top⟩
obtain ⟨⟨⟨z, rfl : z = g⟩, y, _⟩, hy⟩ := h.2 (g * x)
rwa [← mul_left_cancel hy]
-#align subgroup.is_complement_singleton_left Subgroup.isComplement_singleton_left
-#align add_subgroup.is_complement_singleton_left AddSubgroup.isComplement_singleton_left
+#align subgroup.is_complement_singleton_left Subgroup.IsComplement_singleton_left
+#align add_subgroup.is_complement_singleton_left AddSubgroup.IsComplement_singleton_left
@[to_additive]
-theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
+theorem IsComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
by
refine'
⟨fun h => top_le_iff.mp fun x hx => _, fun h => (congr_arg _ h).mpr is_complement_top_singleton⟩
@@ -141,11 +156,11 @@ theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
conv_rhs at hy => rw [← show y.2.1 = g from y.2.2]
rw [← mul_right_cancel hy]
exact y.1.2
-#align subgroup.is_complement_singleton_right Subgroup.isComplement_singleton_right
-#align add_subgroup.is_complement_singleton_right AddSubgroup.isComplement_singleton_right
+#align subgroup.is_complement_singleton_right Subgroup.IsComplement_singleton_right
+#align add_subgroup.is_complement_singleton_right AddSubgroup.IsComplement_singleton_right
@[to_additive]
-theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
+theorem IsComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
by
refine'
⟨fun h => set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
@@ -156,11 +171,11 @@ theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} :=
exact subtype.ext_iff.mp (prod.ext_iff.mp this).2
· rintro ⟨g, rfl⟩
exact is_complement_top_singleton
-#align subgroup.is_complement_top_left Subgroup.isComplement_top_left
-#align add_subgroup.is_complement_top_left AddSubgroup.isComplement_top_left
+#align subgroup.is_complement_top_left Subgroup.IsComplement_top_left
+#align add_subgroup.is_complement_top_left AddSubgroup.IsComplement_top_left
@[to_additive]
-theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
+theorem IsComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
by
refine'
⟨fun h => set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
@@ -171,44 +186,44 @@ theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} :=
exact subtype.ext_iff.mp (prod.ext_iff.mp this).1
· rintro ⟨g, rfl⟩
exact is_complement_singleton_top
-#align subgroup.is_complement_top_right Subgroup.isComplement_top_right
-#align add_subgroup.is_complement_top_right AddSubgroup.isComplement_top_right
+#align subgroup.is_complement_top_right Subgroup.IsComplement_top_right
+#align add_subgroup.is_complement_top_right AddSubgroup.IsComplement_top_right
@[to_additive]
-theorem isComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
- isComplement_top_singleton
-#align subgroup.is_complement'_top_bot Subgroup.isComplement'_top_bot
-#align add_subgroup.is_complement'_top_bot AddSubgroup.isComplement'_top_bot
+theorem IsComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
+ IsComplement_top_singleton
+#align subgroup.is_complement'_top_bot Subgroup.IsComplement'_top_bot
+#align add_subgroup.is_complement'_top_bot AddSubgroup.IsComplement'_top_bot
@[to_additive]
-theorem isComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
- isComplement_singleton_top
-#align subgroup.is_complement'_bot_top Subgroup.isComplement'_bot_top
-#align add_subgroup.is_complement'_bot_top AddSubgroup.isComplement'_bot_top
+theorem IsComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
+ IsComplement_singleton_top
+#align subgroup.is_complement'_bot_top Subgroup.IsComplement'_bot_top
+#align add_subgroup.is_complement'_bot_top AddSubgroup.IsComplement'_bot_top
@[simp, to_additive]
-theorem isComplement'_bot_left : IsComplement' ⊥ H ↔ H = ⊤ :=
- isComplement_singleton_left.trans coe_eq_univ
-#align subgroup.is_complement'_bot_left Subgroup.isComplement'_bot_left
-#align add_subgroup.is_complement'_bot_left AddSubgroup.isComplement'_bot_left
+theorem IsComplement'_bot_left : IsComplement' ⊥ H ↔ H = ⊤ :=
+ IsComplement_singleton_left.trans coe_eq_univ
+#align subgroup.is_complement'_bot_left Subgroup.IsComplement'_bot_left
+#align add_subgroup.is_complement'_bot_left AddSubgroup.IsComplement'_bot_left
@[simp, to_additive]
-theorem isComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
- isComplement_singleton_right.trans coe_eq_univ
-#align subgroup.is_complement'_bot_right Subgroup.isComplement'_bot_right
-#align add_subgroup.is_complement'_bot_right AddSubgroup.isComplement'_bot_right
+theorem IsComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
+ IsComplement_singleton_right.trans coe_eq_univ
+#align subgroup.is_complement'_bot_right Subgroup.IsComplement'_bot_right
+#align add_subgroup.is_complement'_bot_right AddSubgroup.IsComplement'_bot_right
@[simp, to_additive]
-theorem isComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
- isComplement_top_left.trans coe_eq_singleton
-#align subgroup.is_complement'_top_left Subgroup.isComplement'_top_left
-#align add_subgroup.is_complement'_top_left AddSubgroup.isComplement'_top_left
+theorem IsComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
+ IsComplement_top_left.trans coe_eq_singleton
+#align subgroup.is_complement'_top_left Subgroup.IsComplement'_top_left
+#align add_subgroup.is_complement'_top_left AddSubgroup.IsComplement'_top_left
@[simp, to_additive]
-theorem isComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
- isComplement_top_right.trans coe_eq_singleton
-#align subgroup.is_complement'_top_right Subgroup.isComplement'_top_right
-#align add_subgroup.is_complement'_top_right AddSubgroup.isComplement'_top_right
+theorem IsComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
+ IsComplement_top_right.trans coe_eq_singleton
+#align subgroup.is_complement'_top_right Subgroup.IsComplement'_top_right
+#align add_subgroup.is_complement'_top_right AddSubgroup.IsComplement'_top_right
@[to_additive]
theorem mem_leftTransversals_iff_existsUnique_inv_mul_mem :
@@ -358,8 +373,9 @@ theorem mk''_toEquiv (hS : S ∈ Subgroup.leftTransversals (H : Set G)) (q : G
Quotient.mk'' (toEquiv hS q : G) = q :=
(toEquiv hS).symm_apply_apply q
#align subgroup.mem_left_transversals.mk'_to_equiv Subgroup.MemLeftTransversals.mk''_toEquiv
-#align add_subgroup.mem_left_transversals.mk'_to_equiv AddSubgroup.MemLeftTransversals.mk'_to_equiv
+#align add_subgroup.mem_left_transversals.mk'_to_equiv AddSubgroup.MemLeftTransversals.mk''_toEquiv
+#print Subgroup.MemLeftTransversals.toEquiv_apply /-
@[to_additive]
theorem toEquiv_apply {f : G ⧸ H → G} (hf : ∀ q, (f q : G ⧸ H) = q) (q : G ⧸ H) :
(toEquiv (range_mem_leftTransversals hf) q : G) = f q :=
@@ -367,7 +383,8 @@ theorem toEquiv_apply {f : G ⧸ H → G} (hf : ∀ q, (f q : G ⧸ H) = q) (q :
refine' (subtype.ext_iff.mp _).trans (Subtype.coe_mk (f q) ⟨q, rfl⟩)
exact (to_equiv (range_mem_left_transversals hf)).apply_eq_iff_eq_symm_apply.mpr (hf q).symm
#align subgroup.mem_left_transversals.to_equiv_apply Subgroup.MemLeftTransversals.toEquiv_apply
-#align add_subgroup.mem_left_transversals.to_equiv_apply AddSubgroup.MemLeftTransversals.to_equiv_apply
+#align add_subgroup.mem_left_transversals.to_equiv_apply AddSubgroup.MemLeftTransversals.toEquiv_apply
+-/
/-- A left transversal can be viewed as a function mapping each element of the group
to the chosen representative from that left coset. -/
@@ -409,8 +426,9 @@ theorem mk''_toEquiv (hS : S ∈ Subgroup.rightTransversals (H : Set G))
(q : Quotient (QuotientGroup.rightRel H)) : Quotient.mk'' (toEquiv hS q : G) = q :=
(toEquiv hS).symm_apply_apply q
#align subgroup.mem_right_transversals.mk'_to_equiv Subgroup.MemRightTransversals.mk''_toEquiv
-#align add_subgroup.mem_right_transversals.mk'_to_equiv AddSubgroup.MemRightTransversals.mk'_to_equiv
+#align add_subgroup.mem_right_transversals.mk'_to_equiv AddSubgroup.MemRightTransversals.mk''_toEquiv
+#print Subgroup.MemRightTransversals.toEquiv_apply /-
@[to_additive]
theorem toEquiv_apply {f : Quotient (QuotientGroup.rightRel H) → G}
(hf : ∀ q, Quotient.mk'' (f q) = q) (q : Quotient (QuotientGroup.rightRel H)) :
@@ -419,7 +437,8 @@ theorem toEquiv_apply {f : Quotient (QuotientGroup.rightRel H) → G}
refine' (subtype.ext_iff.mp _).trans (Subtype.coe_mk (f q) ⟨q, rfl⟩)
exact (to_equiv (range_mem_right_transversals hf)).apply_eq_iff_eq_symm_apply.mpr (hf q).symm
#align subgroup.mem_right_transversals.to_equiv_apply Subgroup.MemRightTransversals.toEquiv_apply
-#align add_subgroup.mem_right_transversals.to_equiv_apply AddSubgroup.MemRightTransversals.to_equiv_apply
+#align add_subgroup.mem_right_transversals.to_equiv_apply AddSubgroup.MemRightTransversals.toEquiv_apply
+-/
/-- A right transversal can be viewed as a function mapping each element of the group
to the chosen representative from that right coset. -/
@@ -486,7 +505,7 @@ theorem smul_toEquiv (f : F) (T : leftTransversals (H : Set G)) (q : G ⧸ H) :
f • (toEquiv T.2 q : G) = toEquiv (f • T).2 (f • q) :=
Quotient.inductionOn' q fun g => smul_toFun f T g
#align subgroup.smul_to_equiv Subgroup.smul_toEquiv
-#align add_subgroup.vadd_to_equiv AddSubgroup.vadd_to_equiv
+#align add_subgroup.vadd_to_equiv AddSubgroup.vadd_toEquiv
@[to_additive]
theorem smul_apply_eq_smul_apply_inv_smul (f : F) (T : leftTransversals (H : Set G)) (q : G ⧸ H) :
@@ -530,43 +549,45 @@ theorem IsComplement'.index_eq_card (h : IsComplement' H K) : K.index = Nat.card
(card_left_transversal h).symm
#align subgroup.is_complement'.index_eq_card Subgroup.IsComplement'.index_eq_card
+#print Subgroup.IsComplement.card_mul /-
theorem IsComplement.card_mul [Fintype G] [Fintype S] [Fintype T] (h : IsComplement S T) :
Fintype.card S * Fintype.card T = Fintype.card G :=
(Fintype.card_prod _ _).symm.trans (Fintype.card_of_bijective h)
#align subgroup.is_complement.card_mul Subgroup.IsComplement.card_mul
+-/
theorem IsComplement'.card_mul [Fintype G] [Fintype H] [Fintype K] (h : IsComplement' H K) :
Fintype.card H * Fintype.card K = Fintype.card G :=
h.card_mul
#align subgroup.is_complement'.card_mul Subgroup.IsComplement'.card_mul
-theorem isComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
+theorem IsComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
(h2 : ↑H * ↑K = (Set.univ : Set G)) : IsComplement' H K :=
by
refine' ⟨mul_injective_of_disjoint h1, fun g => _⟩
obtain ⟨h, k, hh, hk, hg⟩ := set.eq_univ_iff_forall.mp h2 g
exact ⟨(⟨h, hh⟩, ⟨k, hk⟩), hg⟩
-#align subgroup.is_complement'_of_disjoint_and_mul_eq_univ Subgroup.isComplement'_of_disjoint_and_mul_eq_univ
+#align subgroup.is_complement'_of_disjoint_and_mul_eq_univ Subgroup.IsComplement'_of_disjoint_and_mul_eq_univ
-theorem isComplement'_of_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K]
+theorem IsComplement'_of_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G) (h2 : Disjoint H K) :
IsComplement' H K :=
(Fintype.bijective_iff_injective_and_card _).mpr
⟨mul_injective_of_disjoint h2, (Fintype.card_prod H K).trans h1⟩
-#align subgroup.is_complement'_of_card_mul_and_disjoint Subgroup.isComplement'_of_card_mul_and_disjoint
+#align subgroup.is_complement'_of_card_mul_and_disjoint Subgroup.IsComplement'_of_card_mul_and_disjoint
-theorem isComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K] :
+theorem IsComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K] :
IsComplement' H K ↔ Fintype.card H * Fintype.card K = Fintype.card G ∧ Disjoint H K :=
- ⟨fun h => ⟨h.card_mul, h.Disjoint⟩, fun h => isComplement'_of_card_mul_and_disjoint h.1 h.2⟩
-#align subgroup.is_complement'_iff_card_mul_and_disjoint Subgroup.isComplement'_iff_card_mul_and_disjoint
+ ⟨fun h => ⟨h.card_mul, h.Disjoint⟩, fun h => IsComplement'_of_card_mul_and_disjoint h.1 h.2⟩
+#align subgroup.is_complement'_iff_card_mul_and_disjoint Subgroup.IsComplement'_iff_card_mul_and_disjoint
-theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
+theorem IsComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G)
(h2 : Nat.coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
- isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
-#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
+ IsComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
+#align subgroup.is_complement'_of_coprime Subgroup.IsComplement'_of_coprime
-theorem isComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
+theorem IsComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
(h1 : ∀ h : H, h • a = a → h = 1) (h2 : ∀ g : G, ∃ h : H, h • g • a = a) :
IsComplement' H (MulAction.stabilizer G a) :=
by
@@ -578,7 +599,7 @@ theorem isComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
specialize h1 (h * h') (by rwa [mul_smul, smul_def h', ← hg, ← mul_smul, hg])
refine' Prod.ext (eq_inv_of_mul_eq_one_right h1) (Subtype.ext _)
rwa [Subtype.ext_iff, coe_one, coe_mul, ← self_eq_mul_left, mul_assoc (↑h) (↑h') g] at h1
-#align subgroup.is_complement'_stabilizer Subgroup.isComplement'_stabilizer
+#align subgroup.is_complement'_stabilizer Subgroup.IsComplement'_stabilizer
end Subgroup
@@ -609,12 +630,14 @@ theorem quotientEquivSigmaZmod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H
zpow_smul_mod_minimal_period]
#align subgroup.quotient_equiv_sigma_zmod_apply Subgroup.quotientEquivSigmaZmod_apply
+#print Subgroup.transferFunction /-
/-- The transfer transversal as a function. Given a `⟨g⟩`-orbit `q₀, g • q₀, ..., g ^ (m - 1) • q₀`
in `G ⧸ H`, an element `g ^ k • q₀` is mapped to `g ^ k • g₀` for a fixed choice of
representative `g₀` of `q₀`. -/
noncomputable def transferFunction : G ⧸ H → G := fun q =>
g ^ ((quotientEquivSigmaZmod H g q).2 : ℤ) * (quotientEquivSigmaZmod H g q).1.out'.out'
#align subgroup.transfer_function Subgroup.transferFunction
+-/
theorem transferFunction_apply (q : G ⧸ H) :
transferFunction H g q =
@@ -622,20 +645,26 @@ theorem transferFunction_apply (q : G ⧸ H) :
rfl
#align subgroup.transfer_function_apply Subgroup.transferFunction_apply
+#print Subgroup.coe_transferFunction /-
theorem coe_transferFunction (q : G ⧸ H) : ↑(transferFunction H g q) = q := by
rw [transfer_function_apply, ← smul_eq_mul, coe_smul_out', ← quotient_equiv_sigma_zmod_symm_apply,
Sigma.eta, symm_apply_apply]
#align subgroup.coe_transfer_function Subgroup.coe_transferFunction
+-/
+#print Subgroup.transferSet /-
/-- The transfer transversal as a set. Contains elements of the form `g ^ k • g₀` for fixed choices
of representatives `g₀` of fixed choices of representatives `q₀` of `⟨g⟩`-orbits in `G ⧸ H`. -/
def transferSet : Set G :=
Set.range (transferFunction H g)
#align subgroup.transfer_set Subgroup.transferSet
+-/
+#print Subgroup.mem_transferSet /-
theorem mem_transferSet (q : G ⧸ H) : transferFunction H g q ∈ transferSet H g :=
⟨q, rfl⟩
#align subgroup.mem_transfer_set Subgroup.mem_transferSet
+-/
/-- The transfer transversal. Contains elements of the form `g ^ k • g₀` for fixed choices
of representatives `g₀` of fixed choices of representatives `q₀` of `⟨g⟩`-orbits in `G ⧸ H`. -/
@@ -643,10 +672,12 @@ def transferTransversal : leftTransversals (H : Set G) :=
⟨transferSet H g, range_mem_leftTransversals (coe_transferFunction H g)⟩
#align subgroup.transfer_transversal Subgroup.transferTransversal
+#print Subgroup.transferTransversal_apply /-
theorem transferTransversal_apply (q : G ⧸ H) :
↑(toEquiv (transferTransversal H g).2 q) = transferFunction H g q :=
toEquiv_apply (coe_transferFunction H g) q
#align subgroup.transfer_transversal_apply Subgroup.transferTransversal_apply
+-/
theorem transferTransversal_apply' (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -32,7 +32,7 @@ In this file we define the complement of a subgroup.
-/
-open BigOperators Pointwise
+open scoped BigOperators Pointwise
namespace Subgroup
@@ -448,7 +448,7 @@ end MemRightTransversals
section Action
-open Pointwise
+open scoped Pointwise
open MulAction MemLeftTransversals
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -480,9 +480,9 @@ theorem equiv_mul_right_of_mem {g k : G} (h : k ∈ K) :
theorem equiv_mul_left (h : H) (g : G) :
hHT.equiv (h * g) = (h * (hHT.equiv g).fst, (hHT.equiv g).snd) := by
have : (hHT.equiv (h * g)).2 = (hHT.equiv g).2 := hHT.equiv_snd_eq_iff_rightCosetEquivalence.2 ?_
- ext
- · rw [coe_mul, equiv_fst_eq_mul_inv, this, equiv_fst_eq_mul_inv, mul_assoc]
- · rw [this]
+ · ext
+ · rw [coe_mul, equiv_fst_eq_mul_inv, this, equiv_fst_eq_mul_inv, mul_assoc]
+ · rw [this]
· simp [RightCosetEquivalence, ← smul_smul]
theorem equiv_mul_left_of_mem {h g : G} (hh : h ∈ H) :
nat_cast
/int_cast
/rat_cast
to natCast
/intCast
/ratCast
(#11486)
Now that I am defining NNRat.cast
, I want a definitive answer to this naming issue. Plenty of lemmas in mathlib already use natCast
/intCast
/ratCast
over nat_cast
/int_cast
/rat_cast
, and this matches with the general expectation that underscore-separated name parts correspond to a single declaration.
@@ -773,7 +773,7 @@ theorem quotientEquivSigmaZMod_symm_apply (q : orbitRel.Quotient (zpowers g) (G
theorem quotientEquivSigmaZMod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H)) (k : ℤ) :
quotientEquivSigmaZMod H g (g ^ k • q.out') = ⟨q, k⟩ := by
- rw [apply_eq_iff_eq_symm_apply, quotientEquivSigmaZMod_symm_apply, ZMod.coe_int_cast,
+ rw [apply_eq_iff_eq_symm_apply, quotientEquivSigmaZMod_symm_apply, ZMod.coe_intCast,
zpow_smul_mod_minimalPeriod]
#align subgroup.quotient_equiv_sigma_zmod_apply Subgroup.quotientEquivSigmaZMod_apply
@@ -832,7 +832,7 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
else g ^ (cast k : ℤ) * q.out'.out' := by
rw [smul_apply_eq_smul_apply_inv_smul, transferTransversal_apply, transferFunction_apply, ←
mul_smul, ← zpow_neg_one, ← zpow_add, quotientEquivSigmaZMod_apply, smul_eq_mul, ← mul_assoc,
- ← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id, ←
+ ← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, intCast_cast, cast_id', id, ←
sub_eq_neg_add, cast_sub_one, add_sub_cancel]
by_cases hk : k = 0
· rw [if_pos hk, if_pos hk, zpow_natCast]
@@ -832,7 +832,7 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
else g ^ (cast k : ℤ) * q.out'.out' := by
rw [smul_apply_eq_smul_apply_inv_smul, transferTransversal_apply, transferFunction_apply, ←
mul_smul, ← zpow_neg_one, ← zpow_add, quotientEquivSigmaZMod_apply, smul_eq_mul, ← mul_assoc,
- ← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id.def, ←
+ ← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id, ←
sub_eq_neg_add, cast_sub_one, add_sub_cancel]
by_cases hk : k = 0
· rw [if_pos hk, if_pos hk, zpow_natCast]
mul
-div
cancellation lemmas (#11530)
Lemma names around cancellation of multiplication and division are a mess.
This PR renames a handful of them according to the following table (each big row contains the multiplicative statement, then the three rows contain the GroupWithZero
lemma name, the Group
lemma, the AddGroup
lemma name).
| Statement | New name | Old name | |
@@ -833,7 +833,7 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
rw [smul_apply_eq_smul_apply_inv_smul, transferTransversal_apply, transferFunction_apply, ←
mul_smul, ← zpow_neg_one, ← zpow_add, quotientEquivSigmaZMod_apply, smul_eq_mul, ← mul_assoc,
← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id.def, ←
- sub_eq_neg_add, cast_sub_one, add_sub_cancel'_right]
+ sub_eq_neg_add, cast_sub_one, add_sub_cancel]
by_cases hk : k = 0
· rw [if_pos hk, if_pos hk, zpow_natCast]
· rw [if_neg hk, if_neg hk]
zpow_coe_nat
to zpow_natCast
(#11528)
... and add a deprecated alias for the old name. This is mostly just me discovering the power of F2
@@ -835,7 +835,7 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id.def, ←
sub_eq_neg_add, cast_sub_one, add_sub_cancel'_right]
by_cases hk : k = 0
- · rw [if_pos hk, if_pos hk, zpow_coe_nat]
+ · rw [if_pos hk, if_pos hk, zpow_natCast]
· rw [if_neg hk, if_neg hk]
#align subgroup.transfer_transversal_apply'' Subgroup.transferTransversal_apply''
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -94,7 +94,7 @@ theorem IsComplement'.symm (h : IsComplement' H K) : IsComplement' K H := by
let ψ : G ≃ G := Equiv.mk (fun g : G => g⁻¹) (fun g : G => g⁻¹) inv_inv inv_inv
suffices hf : (ψ ∘ fun x : H × K => x.1.1 * x.2.1) = (fun x : K × H => x.1.1 * x.2.1) ∘ ϕ by
rw [isComplement'_def, IsComplement, ← Equiv.bijective_comp ϕ]
- apply (congr_arg Function.Bijective hf).mp -- porting note: This was a `rw` in mathlib3
+ apply (congr_arg Function.Bijective hf).mp -- Porting note: This was a `rw` in mathlib3
rwa [ψ.comp_bijective]
exact funext fun x => mul_inv_rev _ _
#align subgroup.is_complement'.symm Subgroup.IsComplement'.symm
zpow_ofNat
and ofNat_zsmul
(#10969)
Previously these were syntactically identical to the corresponding zpow_coe_nat
and coe_nat_zsmul
lemmas, now they are about OfNat.ofNat
.
Unfortunately, almost every call site uses the ofNat
name to refer to Nat.cast
, so the downstream proofs had to be adjusted too.
@@ -835,7 +835,7 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id.def, ←
sub_eq_neg_add, cast_sub_one, add_sub_cancel'_right]
by_cases hk : k = 0
- · rw [if_pos hk, if_pos hk, zpow_ofNat]
+ · rw [if_pos hk, if_pos hk, zpow_coe_nat]
· rw [if_neg hk, if_neg hk]
#align subgroup.transfer_transversal_apply'' Subgroup.transferTransversal_apply''
@@ -348,7 +348,7 @@ lemma exists_right_transversal (H : Subgroup G) (g : G) :
lemma exists_left_transversal_of_le {H' H : Subgroup G} (h : H' ≤ H) :
∃ S : Set G, S * H' = H ∧ Nat.card S * Nat.card H' = Nat.card H := by
let H'' : Subgroup H := H'.comap H.subtype
- have : H' = H''.map H.subtype := by simp [h]
+ have : H' = H''.map H.subtype := by simp [H'', h]
rw [this]
obtain ⟨S, cmem, -⟩ := H''.exists_left_transversal 1
refine ⟨H.subtype '' S, ?_, ?_⟩
@@ -364,7 +364,7 @@ lemma exists_left_transversal_of_le {H' H : Subgroup G} (h : H' ≤ H) :
lemma exists_right_transversal_of_le {H' H : Subgroup G} (h : H' ≤ H) :
∃ S : Set G, H' * S = H ∧ Nat.card H' * Nat.card S = Nat.card H := by
let H'' : Subgroup H := H'.comap H.subtype
- have : H' = H''.map H.subtype := by simp [h]
+ have : H' = H''.map H.subtype := by simp [H'', h]
rw [this]
obtain ⟨S, cmem, -⟩ := H''.exists_right_transversal 1
refine ⟨H.subtype '' S, ?_, ?_⟩
Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Vierkantor <vierkantor@vierkantor.com>
@@ -767,7 +767,7 @@ noncomputable def quotientEquivSigmaZMod :
theorem quotientEquivSigmaZMod_symm_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod (g • ·) q.out')) :
- (quotientEquivSigmaZMod H g).symm ⟨q, k⟩ = g ^ (k : ℤ) • q.out' :=
+ (quotientEquivSigmaZMod H g).symm ⟨q, k⟩ = g ^ (cast k : ℤ) • q.out' :=
rfl
#align subgroup.quotient_equiv_sigma_zmod_symm_apply Subgroup.quotientEquivSigmaZMod_symm_apply
@@ -781,12 +781,13 @@ theorem quotientEquivSigmaZMod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H
in `G ⧸ H`, an element `g ^ k • q₀` is mapped to `g ^ k • g₀` for a fixed choice of
representative `g₀` of `q₀`. -/
noncomputable def transferFunction : G ⧸ H → G := fun q =>
- g ^ ((quotientEquivSigmaZMod H g q).2 : ℤ) * (quotientEquivSigmaZMod H g q).1.out'.out'
+ g ^ (cast (quotientEquivSigmaZMod H g q).2 : ℤ) * (quotientEquivSigmaZMod H g q).1.out'.out'
#align subgroup.transfer_function Subgroup.transferFunction
theorem transferFunction_apply (q : G ⧸ H) :
transferFunction H g q =
- g ^ ((quotientEquivSigmaZMod H g q).2 : ℤ) * (quotientEquivSigmaZMod H g q).1.out'.out' :=
+ g ^ (cast (quotientEquivSigmaZMod H g q).2 : ℤ) *
+ (quotientEquivSigmaZMod H g q).1.out'.out' :=
rfl
#align subgroup.transfer_function_apply Subgroup.transferFunction_apply
@@ -818,16 +819,17 @@ theorem transferTransversal_apply (q : G ⧸ H) :
theorem transferTransversal_apply' (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod (g • ·) q.out')) :
- ↑(toEquiv (transferTransversal H g).2 (g ^ (k : ℤ) • q.out')) = g ^ (k : ℤ) * q.out'.out' := by
+ ↑(toEquiv (transferTransversal H g).2 (g ^ (cast k : ℤ) • q.out')) =
+ g ^ (cast k : ℤ) * q.out'.out' := by
rw [transferTransversal_apply, transferFunction_apply, ← quotientEquivSigmaZMod_symm_apply,
apply_symm_apply]
#align subgroup.transfer_transversal_apply' Subgroup.transferTransversal_apply'
theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod (g • ·) q.out')) :
- ↑(toEquiv (g • transferTransversal H g).2 (g ^ (k : ℤ) • q.out')) =
+ ↑(toEquiv (g • transferTransversal H g).2 (g ^ (cast k : ℤ) • q.out')) =
if k = 0 then g ^ minimalPeriod (g • ·) q.out' * q.out'.out'
- else g ^ (k : ℤ) * q.out'.out' := by
+ else g ^ (cast k : ℤ) * q.out'.out' := by
rw [smul_apply_eq_smul_apply_inv_smul, transferTransversal_apply, transferFunction_apply, ←
mul_smul, ← zpow_neg_one, ← zpow_add, quotientEquivSigmaZMod_apply, smul_eq_mul, ← mul_assoc,
← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id.def, ←
$
with <|
(#9319)
See Zulip thread for the discussion.
@@ -174,7 +174,7 @@ lemma IsComplement.mul_eq (h : IsComplement S T) : S * T = univ :=
@[to_additive AddSubgroup.IsComplement.card_mul_card]
lemma IsComplement.card_mul_card (h : IsComplement S T) : Nat.card S * Nat.card T = Nat.card G :=
- (Nat.card_prod _ _).symm.trans $ Nat.card_congr $ Equiv.ofBijective _ h
+ (Nat.card_prod _ _).symm.trans <| Nat.card_congr <| Equiv.ofBijective _ h
@[to_additive]
theorem isComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
@@ -301,7 +301,7 @@ theorem range_mem_leftTransversals {f : G ⧸ H → G} (hf : ∀ q, ↑(f q) = q
Set.range f ∈ leftTransversals (H : Set G) :=
mem_leftTransversals_iff_bijective.mpr
⟨by rintro ⟨-, q₁, rfl⟩ ⟨-, q₂, rfl⟩ h
- exact Subtype.ext $ congr_arg f $ ((hf q₁).symm.trans h).trans (hf q₂),
+ exact Subtype.ext <| congr_arg f <| ((hf q₁).symm.trans h).trans (hf q₂),
fun q => ⟨⟨f q, q, rfl⟩, hf q⟩⟩
#align subgroup.range_mem_left_transversals Subgroup.range_mem_leftTransversals
#align add_subgroup.range_mem_left_transversals AddSubgroup.range_mem_leftTransversals
@@ -311,7 +311,7 @@ theorem range_mem_rightTransversals {f : Quotient (QuotientGroup.rightRel H) →
(hf : ∀ q, Quotient.mk'' (f q) = q) : Set.range f ∈ rightTransversals (H : Set G) :=
mem_rightTransversals_iff_bijective.mpr
⟨by rintro ⟨-, q₁, rfl⟩ ⟨-, q₂, rfl⟩ h
- exact Subtype.ext $ congr_arg f $ ((hf q₁).symm.trans h).trans (hf q₂),
+ exact Subtype.ext <| congr_arg f <| ((hf q₁).symm.trans h).trans (hf q₂),
fun q => ⟨⟨f q, q, rfl⟩, hf q⟩⟩
#align subgroup.range_mem_right_transversals Subgroup.range_mem_rightTransversals
#align add_subgroup.range_mem_right_transversals AddSubgroup.range_mem_rightTransversals
@@ -357,7 +357,7 @@ lemma exists_left_transversal_of_le {H' H : Subgroup G} (h : H' ≤ H) :
simp [Set.ext_iff]
· rw [← cmem.card_mul_card]
refine congr_arg₂ (· * ·) ?_ ?_ <;>
- exact Nat.card_congr (Equiv.Set.image _ _ $ subtype_injective H).symm
+ exact Nat.card_congr (Equiv.Set.image _ _ <| subtype_injective H).symm
/-- Given two subgroups `H' ⊆ H`, there exists a right transversal to `H'` inside `H`. -/
@[to_additive "Given two subgroups `H' ⊆ H`, there exists a transversal to `H'` inside `H`"]
@@ -374,7 +374,7 @@ lemma exists_right_transversal_of_le {H' H : Subgroup G} (h : H' ≤ H) :
· have : Nat.card H'' * Nat.card S = Nat.card H := cmem.card_mul_card
rw [← this]
refine congr_arg₂ (· * ·) ?_ ?_ <;>
- exact Nat.card_congr (Equiv.Set.image _ _ $ subtype_injective H).symm
+ exact Nat.card_congr (Equiv.Set.image _ _ <| subtype_injective H).symm
namespace IsComplement
@@ -645,7 +645,7 @@ noncomputable instance : MulAction F (leftTransversals (H : Set G)) where
@[to_additive]
theorem smul_toFun (f : F) (T : leftTransversals (H : Set G)) (g : G) :
(f • (toFun T.2 g : G)) = toFun (f • T).2 (f • g) :=
- Subtype.ext_iff.mp $ @ExistsUnique.unique (↥(f • (T : Set G))) (fun s => (↑s)⁻¹ * f • g ∈ H)
+ Subtype.ext_iff.mp <| @ExistsUnique.unique (↥(f • (T : Set G))) (fun s => (↑s)⁻¹ * f • g ∈ H)
(mem_leftTransversals_iff_existsUnique_inv_mul_mem.mp (f • T).2 (f • g))
⟨f • (toFun T.2 g : G), Set.smul_mem_smul_set (Subtype.coe_prop _)⟩ (toFun (f • T).2 (f • g))
(QuotientAction.inv_mul_mem f (inv_toFun_mul_mem T.2 g)) (inv_toFun_mul_mem (f • T).2 (f • g))
Set.image2
etc (#9275)
Set.image2
to use ∃ a ∈ s, ∃ b ∈ t, f a b = c
instead of ∃ a b, a ∈ s ∧ b ∈ t ∧ f a b = c
.Set.seq
as Set.image2
. The new definition is equal to the old one but rw [Set.seq]
gives a different result.Filter.map₂
to use ∃ u ∈ f, ∃ v ∈ g, image2 m u v ⊆ s
instead of ∃ u v, u ∈ f ∧ v ∈ g ∧ ...
Set.mem_image2
, Finset.mem_image₂
, Set.mem_mul
, Finset.mem_div
etcThe two reasons to make the change are:
∃ a ∈ s, ∃ b ∈ t, _
is a simp
-normal form, and@@ -713,7 +713,7 @@ theorem IsComplement'.card_mul [Fintype G] [Fintype H] [Fintype K] (h : IsComple
theorem isComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
(h2 : ↑H * ↑K = (Set.univ : Set G)) : IsComplement' H K := by
refine' ⟨mul_injective_of_disjoint h1, fun g => _⟩
- obtain ⟨h, k, hh, hk, hg⟩ := Set.eq_univ_iff_forall.mp h2 g
+ obtain ⟨h, hh, k, hk, hg⟩ := Set.eq_univ_iff_forall.mp h2 g
exact ⟨(⟨h, hh⟩, ⟨k, hk⟩), hg⟩
#align subgroup.is_complement'_of_disjoint_and_mul_eq_univ Subgroup.isComplement'_of_disjoint_and_mul_eq_univ
Nsmul
-> NSMul
, Zpow
-> ZPow
, etc (#9067)
Normalising to naming convention rule number 6.
@@ -762,7 +762,7 @@ variable {G : Type u} [Group G] (H : Subgroup G) (g : G)
noncomputable def quotientEquivSigmaZMod :
G ⧸ H ≃ Σq : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod (g • ·) q.out') :=
(selfEquivSigmaOrbits (zpowers g) (G ⧸ H)).trans
- (sigmaCongrRight fun q => orbitZpowersEquiv g q.out')
+ (sigmaCongrRight fun q => orbitZPowersEquiv g q.out')
#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZMod
theorem quotientEquivSigmaZMod_symm_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
Specialises the existence of tranversals to the case where one subgroup is contained in another.
Also replace ⊤ : Set G
by Set.univ
and modify the lemma names accordingly.
From PFR
@@ -28,8 +28,8 @@ In this file we define the complement of a subgroup.
- `isComplement'_of_coprime` : Subgroups of coprime order are complements.
-/
-
-open BigOperators Pointwise
+open Set
+open scoped BigOperators Pointwise
namespace Subgroup
@@ -107,32 +107,32 @@ theorem isComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
#align add_subgroup.is_complement'_comm AddSubgroup.isComplement'_comm
@[to_additive]
-theorem isComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
+theorem isComplement_univ_singleton {g : G} : IsComplement (univ : Set G) {g} :=
⟨fun ⟨_, _, rfl⟩ ⟨_, _, rfl⟩ h => Prod.ext (Subtype.ext (mul_right_cancel h)) rfl, fun x =>
⟨⟨⟨x * g⁻¹, ⟨⟩⟩, g, rfl⟩, inv_mul_cancel_right x g⟩⟩
-#align subgroup.is_complement_top_singleton Subgroup.isComplement_top_singleton
-#align add_subgroup.is_complement_top_singleton AddSubgroup.isComplement_top_singleton
+#align subgroup.is_complement_top_singleton Subgroup.isComplement_univ_singleton
+#align add_subgroup.is_complement_top_singleton AddSubgroup.isComplement_univ_singleton
@[to_additive]
-theorem isComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
+theorem isComplement_singleton_univ {g : G} : IsComplement ({g} : Set G) univ :=
⟨fun ⟨⟨_, rfl⟩, _⟩ ⟨⟨_, rfl⟩, _⟩ h => Prod.ext rfl (Subtype.ext (mul_left_cancel h)), fun x =>
⟨⟨⟨g, rfl⟩, g⁻¹ * x, ⟨⟩⟩, mul_inv_cancel_left g x⟩⟩
-#align subgroup.is_complement_singleton_top Subgroup.isComplement_singleton_top
-#align add_subgroup.is_complement_singleton_top AddSubgroup.isComplement_singleton_top
+#align subgroup.is_complement_singleton_top Subgroup.isComplement_singleton_univ
+#align add_subgroup.is_complement_singleton_top AddSubgroup.isComplement_singleton_univ
@[to_additive]
-theorem isComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ := by
+theorem isComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = univ := by
refine'
- ⟨fun h => top_le_iff.mp fun x _ => _, fun h => (congr_arg _ h).mpr isComplement_singleton_top⟩
+ ⟨fun h => top_le_iff.mp fun x _ => _, fun h => (congr_arg _ h).mpr isComplement_singleton_univ⟩
obtain ⟨⟨⟨z, rfl : z = g⟩, y, _⟩, hy⟩ := h.2 (g * x)
rwa [← mul_left_cancel hy]
#align subgroup.is_complement_singleton_left Subgroup.isComplement_singleton_left
#align add_subgroup.is_complement_singleton_left AddSubgroup.isComplement_singleton_left
@[to_additive]
-theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ := by
+theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = univ := by
refine'
- ⟨fun h => top_le_iff.mp fun x _ => _, fun h => h ▸ isComplement_top_singleton⟩
+ ⟨fun h => top_le_iff.mp fun x _ => _, fun h => h ▸ isComplement_univ_singleton⟩
obtain ⟨y, hy⟩ := h.2 (x * g)
conv_rhs at hy => rw [← show y.2.1 = g from y.2.2]
rw [← mul_right_cancel hy]
@@ -141,7 +141,7 @@ theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ :=
#align add_subgroup.is_complement_singleton_right AddSubgroup.isComplement_singleton_right
@[to_additive]
-theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} := by
+theorem isComplement_univ_left : IsComplement univ S ↔ ∃ g : G, S = {g} := by
refine'
⟨fun h => Set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
· obtain ⟨a, _⟩ := h.2 1
@@ -150,12 +150,12 @@ theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} := by
h.1 ((inv_mul_self a).trans (inv_mul_self b).symm)
exact Subtype.ext_iff.mp (Prod.ext_iff.mp this).2
· rintro ⟨g, rfl⟩
- exact isComplement_top_singleton
-#align subgroup.is_complement_top_left Subgroup.isComplement_top_left
-#align add_subgroup.is_complement_top_left AddSubgroup.isComplement_top_left
+ exact isComplement_univ_singleton
+#align subgroup.is_complement_top_left Subgroup.isComplement_univ_left
+#align add_subgroup.is_complement_top_left AddSubgroup.isComplement_univ_left
@[to_additive]
-theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} := by
+theorem isComplement_univ_right : IsComplement S univ ↔ ∃ g : G, S = {g} := by
refine'
⟨fun h => Set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
· obtain ⟨a, _⟩ := h.2 1
@@ -164,19 +164,27 @@ theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} := by
h.1 ((mul_inv_self a).trans (mul_inv_self b).symm)
exact Subtype.ext_iff.mp (Prod.ext_iff.mp this).1
· rintro ⟨g, rfl⟩
- exact isComplement_singleton_top
-#align subgroup.is_complement_top_right Subgroup.isComplement_top_right
-#align add_subgroup.is_complement_top_right AddSubgroup.isComplement_top_right
+ exact isComplement_singleton_univ
+#align subgroup.is_complement_top_right Subgroup.isComplement_univ_right
+#align add_subgroup.is_complement_top_right AddSubgroup.isComplement_univ_right
+
+@[to_additive]
+lemma IsComplement.mul_eq (h : IsComplement S T) : S * T = univ :=
+ eq_univ_of_forall fun x ↦ by simpa [mem_mul] using (h.existsUnique x).exists
+
+@[to_additive AddSubgroup.IsComplement.card_mul_card]
+lemma IsComplement.card_mul_card (h : IsComplement S T) : Nat.card S * Nat.card T = Nat.card G :=
+ (Nat.card_prod _ _).symm.trans $ Nat.card_congr $ Equiv.ofBijective _ h
@[to_additive]
theorem isComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
- isComplement_top_singleton
+ isComplement_univ_singleton
#align subgroup.is_complement'_top_bot Subgroup.isComplement'_top_bot
#align add_subgroup.is_complement'_top_bot AddSubgroup.isComplement'_top_bot
@[to_additive]
theorem isComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
- isComplement_singleton_top
+ isComplement_singleton_univ
#align subgroup.is_complement'_bot_top Subgroup.isComplement'_bot_top
#align add_subgroup.is_complement'_bot_top AddSubgroup.isComplement'_bot_top
@@ -194,13 +202,13 @@ theorem isComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
@[to_additive (attr := simp)]
theorem isComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
- isComplement_top_left.trans coe_eq_singleton
+ isComplement_univ_left.trans coe_eq_singleton
#align subgroup.is_complement'_top_left Subgroup.isComplement'_top_left
#align add_subgroup.is_complement'_top_left AddSubgroup.isComplement'_top_left
@[to_additive (attr := simp)]
theorem isComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
- isComplement_top_right.trans coe_eq_singleton
+ isComplement_univ_right.trans coe_eq_singleton
#align subgroup.is_complement'_top_right Subgroup.isComplement'_top_right
#align add_subgroup.is_complement'_top_right AddSubgroup.isComplement'_top_right
@@ -309,7 +317,8 @@ theorem range_mem_rightTransversals {f : Quotient (QuotientGroup.rightRel H) →
#align add_subgroup.range_mem_right_transversals AddSubgroup.range_mem_rightTransversals
@[to_additive]
-theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G), g ∈ S := by
+lemma exists_left_transversal (H : Subgroup G) (g : G) :
+ ∃ S ∈ leftTransversals (H : Set G), g ∈ S := by
classical
refine'
⟨Set.range (Function.update Quotient.out' _ g), range_mem_leftTransversals fun q => _,
@@ -322,7 +331,8 @@ theorem exists_left_transversal (g : G) : ∃ S ∈ leftTransversals (H : Set G)
#align add_subgroup.exists_left_transversal AddSubgroup.exists_left_transversal
@[to_additive]
-theorem exists_right_transversal (g : G) : ∃ S ∈ rightTransversals (H : Set G), g ∈ S := by
+lemma exists_right_transversal (H : Subgroup G) (g : G) :
+ ∃ S ∈ rightTransversals (H : Set G), g ∈ S := by
classical
refine'
⟨Set.range (Function.update Quotient.out' _ g), range_mem_rightTransversals fun q => _,
@@ -333,6 +343,39 @@ theorem exists_right_transversal (g : G) : ∃ S ∈ rightTransversals (H : Set
#align subgroup.exists_right_transversal Subgroup.exists_right_transversal
#align add_subgroup.exists_right_transversal AddSubgroup.exists_right_transversal
+/-- Given two subgroups `H' ⊆ H`, there exists a left transversal to `H'` inside `H`. -/
+@[to_additive "Given two subgroups `H' ⊆ H`, there exists a transversal to `H'` inside `H`"]
+lemma exists_left_transversal_of_le {H' H : Subgroup G} (h : H' ≤ H) :
+ ∃ S : Set G, S * H' = H ∧ Nat.card S * Nat.card H' = Nat.card H := by
+ let H'' : Subgroup H := H'.comap H.subtype
+ have : H' = H''.map H.subtype := by simp [h]
+ rw [this]
+ obtain ⟨S, cmem, -⟩ := H''.exists_left_transversal 1
+ refine ⟨H.subtype '' S, ?_, ?_⟩
+ · have : H.subtype '' (S * H'') = H.subtype '' S * H''.map H.subtype := image_mul H.subtype
+ rw [← this, cmem.mul_eq]
+ simp [Set.ext_iff]
+ · rw [← cmem.card_mul_card]
+ refine congr_arg₂ (· * ·) ?_ ?_ <;>
+ exact Nat.card_congr (Equiv.Set.image _ _ $ subtype_injective H).symm
+
+/-- Given two subgroups `H' ⊆ H`, there exists a right transversal to `H'` inside `H`. -/
+@[to_additive "Given two subgroups `H' ⊆ H`, there exists a transversal to `H'` inside `H`"]
+lemma exists_right_transversal_of_le {H' H : Subgroup G} (h : H' ≤ H) :
+ ∃ S : Set G, H' * S = H ∧ Nat.card H' * Nat.card S = Nat.card H := by
+ let H'' : Subgroup H := H'.comap H.subtype
+ have : H' = H''.map H.subtype := by simp [h]
+ rw [this]
+ obtain ⟨S, cmem, -⟩ := H''.exists_right_transversal 1
+ refine ⟨H.subtype '' S, ?_, ?_⟩
+ · have : H.subtype '' (H'' * S) = H''.map H.subtype * H.subtype '' S := image_mul H.subtype
+ rw [← this, cmem.mul_eq]
+ simp [Set.ext_iff]
+ · have : Nat.card H'' * Nat.card S = Nat.card H := cmem.card_mul_card
+ rw [← this]
+ refine congr_arg₂ (· * ·) ?_ ?_ <;>
+ exact Nat.card_congr (Equiv.Set.image _ _ $ subtype_injective H).symm
+
namespace IsComplement
/-- The equivalence `G ≃ S × T`, such that the inverse is `(*) : S × T → G` -/
leftCoset
/rightCoset
(#8877)
Those two definitions are completely obsolete now that we have the pointwise API. This PR removes them but not the corresponding API. A much more tedious subsequent PR will be needed to merge the two API.
Note that I need to tweak simp lemmas to keep confluence since I'm merging two pairs of head keys together.
@@ -436,12 +436,11 @@ theorem equiv_mul_right_of_mem {g k : G} (h : k ∈ K) :
@[simp, nolint simpNF]
theorem equiv_mul_left (h : H) (g : G) :
hHT.equiv (h * g) = (h * (hHT.equiv g).fst, (hHT.equiv g).snd) := by
- have : (hHT.equiv (h * g)).snd = (hHT.equiv g).snd :=
- hHT.equiv_snd_eq_iff_rightCosetEquivalence.2
- (by simp [RightCosetEquivalence, rightCoset_eq_iff])
+ have : (hHT.equiv (h * g)).2 = (hHT.equiv g).2 := hHT.equiv_snd_eq_iff_rightCosetEquivalence.2 ?_
ext
· rw [coe_mul, equiv_fst_eq_mul_inv, this, equiv_fst_eq_mul_inv, mul_assoc]
· rw [this]
+ · simp [RightCosetEquivalence, ← smul_smul]
theorem equiv_mul_left_of_mem {h g : G} (hh : h ∈ H) :
hHT.equiv (h * g) = (⟨h, hh⟩ * (hHT.equiv g).fst, (hHT.equiv g).snd) :=
(· op ·) a
by (a op ·)
(#8843)
I used the regex \(\(· (.) ·\) (.)\)
, replacing with ($2 $1 ·)
.
@@ -718,13 +718,13 @@ variable {G : Type u} [Group G] (H : Subgroup G) (g : G)
/-- Partition `G ⧸ H` into orbits of the action of `g : G`. -/
noncomputable def quotientEquivSigmaZMod :
- G ⧸ H ≃ Σq : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod ((· • ·) g) q.out') :=
+ G ⧸ H ≃ Σq : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod (g • ·) q.out') :=
(selfEquivSigmaOrbits (zpowers g) (G ⧸ H)).trans
(sigmaCongrRight fun q => orbitZpowersEquiv g q.out')
#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZMod
theorem quotientEquivSigmaZMod_symm_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
- (k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
+ (k : ZMod (minimalPeriod (g • ·) q.out')) :
(quotientEquivSigmaZMod H g).symm ⟨q, k⟩ = g ^ (k : ℤ) • q.out' :=
rfl
#align subgroup.quotient_equiv_sigma_zmod_symm_apply Subgroup.quotientEquivSigmaZMod_symm_apply
@@ -775,16 +775,16 @@ theorem transferTransversal_apply (q : G ⧸ H) :
#align subgroup.transfer_transversal_apply Subgroup.transferTransversal_apply
theorem transferTransversal_apply' (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
- (k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
+ (k : ZMod (minimalPeriod (g • ·) q.out')) :
↑(toEquiv (transferTransversal H g).2 (g ^ (k : ℤ) • q.out')) = g ^ (k : ℤ) * q.out'.out' := by
rw [transferTransversal_apply, transferFunction_apply, ← quotientEquivSigmaZMod_symm_apply,
apply_symm_apply]
#align subgroup.transfer_transversal_apply' Subgroup.transferTransversal_apply'
theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
- (k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
+ (k : ZMod (minimalPeriod (g • ·) q.out')) :
↑(toEquiv (g • transferTransversal H g).2 (g ^ (k : ℤ) • q.out')) =
- if k = 0 then g ^ minimalPeriod ((· • ·) g) q.out' * q.out'.out'
+ if k = 0 then g ^ minimalPeriod (g • ·) q.out' * q.out'.out'
else g ^ (k : ℤ) * q.out'.out' := by
rw [smul_apply_eq_smul_apply_inv_smul, transferTransversal_apply, transferFunction_apply, ←
mul_smul, ← zpow_neg_one, ← zpow_add, quotientEquivSigmaZMod_apply, smul_eq_mul, ← mul_assoc,
@@ -358,7 +358,7 @@ theorem equiv_fst_eq_iff_leftCosetEquivalence {g₁ g₂ : G} :
rw [LeftCosetEquivalence, leftCoset_eq_iff]
constructor
· intro h
- rw [← hSK.equiv_fst_mul_equiv_snd g₂, ←hSK.equiv_fst_mul_equiv_snd g₁, ← h,
+ rw [← hSK.equiv_fst_mul_equiv_snd g₂, ← hSK.equiv_fst_mul_equiv_snd g₁, ← h,
mul_inv_rev, ← mul_assoc, inv_mul_cancel_right, ← coe_inv, ← coe_mul]
exact Subtype.property _
· intro h
@@ -374,7 +374,7 @@ theorem equiv_snd_eq_iff_rightCosetEquivalence {g₁ g₂ : G} :
rw [RightCosetEquivalence, rightCoset_eq_iff]
constructor
· intro h
- rw [← hHT.equiv_fst_mul_equiv_snd g₂, ←hHT.equiv_fst_mul_equiv_snd g₁, ← h,
+ rw [← hHT.equiv_fst_mul_equiv_snd g₂, ← hHT.equiv_fst_mul_equiv_snd g₁, ← h,
mul_inv_rev, mul_assoc, mul_inv_cancel_left, ← coe_inv, ← coe_mul]
exact Subtype.property _
· intro h
@@ -363,9 +363,11 @@ theorem equiv_fst_eq_iff_leftCosetEquivalence {g₁ g₂ : G} :
exact Subtype.property _
· intro h
apply (mem_leftTransversals_iff_existsUnique_inv_mul_mem.1 hSK g₁).unique
- · simp [equiv_fst_eq_mul_inv]
+ · -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_fst_eq_mul_inv]; simp
· rw [SetLike.mem_coe, ← mul_mem_cancel_right h]
- simp [equiv_fst_eq_mul_inv, ← mul_assoc]
+ -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_fst_eq_mul_inv]; simp [equiv_fst_eq_mul_inv, ← mul_assoc]
theorem equiv_snd_eq_iff_rightCosetEquivalence {g₁ g₂ : G} :
(hHT.equiv g₁).snd = (hHT.equiv g₂).snd ↔ RightCosetEquivalence H g₁ g₂ := by
@@ -377,17 +379,21 @@ theorem equiv_snd_eq_iff_rightCosetEquivalence {g₁ g₂ : G} :
exact Subtype.property _
· intro h
apply (mem_rightTransversals_iff_existsUnique_mul_inv_mem.1 hHT g₁).unique
- · simp [equiv_snd_eq_inv_mul]
+ · -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_snd_eq_inv_mul]; simp
· rw [SetLike.mem_coe, ← mul_mem_cancel_left h]
- simp [equiv_snd_eq_inv_mul, mul_assoc]
+ -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_snd_eq_inv_mul, mul_assoc]; simp
theorem leftCosetEquivalence_equiv_fst (g : G) :
LeftCosetEquivalence K g ((hSK.equiv g).fst : G) := by
- simp [LeftCosetEquivalence, leftCoset_eq_iff, equiv_fst_eq_mul_inv]
+ -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_fst_eq_mul_inv]; simp [LeftCosetEquivalence, leftCoset_eq_iff]
theorem rightCosetEquivalence_equiv_snd (g : G) :
RightCosetEquivalence H g ((hHT.equiv g).snd : G) := by
- simp [RightCosetEquivalence, rightCoset_eq_iff, equiv_snd_eq_inv_mul]
+ -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [RightCosetEquivalence, rightCoset_eq_iff, equiv_snd_eq_inv_mul]; simp
theorem equiv_fst_eq_self_of_mem_of_one_mem {g : G} (h1 : 1 ∈ T) (hg : g ∈ S) :
(hST.equiv g).fst = ⟨g, hg⟩ := by
@@ -411,7 +417,8 @@ theorem equiv_fst_eq_one_of_mem_of_one_mem {g : G} (h1 : 1 ∈ S) (hg : g ∈ T)
ext
rw [equiv_fst_eq_mul_inv, equiv_snd_eq_self_of_mem_of_one_mem _ h1 hg, mul_inv_self]
-@[simp]
+-- This lemma has always been bad, but the linter only noticed after lean4#2644.
+@[simp, nolint simpNF]
theorem equiv_mul_right (g : G) (k : K) :
hSK.equiv (g * k) = ((hSK.equiv g).fst, (hSK.equiv g).snd * k) := by
have : (hSK.equiv (g * k)).fst = (hSK.equiv g).fst :=
@@ -425,7 +432,8 @@ theorem equiv_mul_right_of_mem {g k : G} (h : k ∈ K) :
hSK.equiv (g * k) = ((hSK.equiv g).fst, (hSK.equiv g).snd * ⟨k, h⟩) :=
equiv_mul_right _ g ⟨k, h⟩
-@[simp]
+-- This lemma has always been bad, but the linter only noticed after lean4#2644.
+@[simp, nolint simpNF]
theorem equiv_mul_left (h : H) (g : G) :
hHT.equiv (h * g) = (h * (hHT.equiv g).fst, (hHT.equiv g).snd) := by
have : (hHT.equiv (h * g)).snd = (hHT.equiv g).snd :=
@@ -363,11 +363,9 @@ theorem equiv_fst_eq_iff_leftCosetEquivalence {g₁ g₂ : G} :
exact Subtype.property _
· intro h
apply (mem_leftTransversals_iff_existsUnique_inv_mul_mem.1 hSK g₁).unique
- · -- This used to be `simp [...]` before leanprover/lean4#2644
- rw [equiv_fst_eq_mul_inv]; simp
+ · simp [equiv_fst_eq_mul_inv]
· rw [SetLike.mem_coe, ← mul_mem_cancel_right h]
- -- This used to be `simp [...]` before leanprover/lean4#2644
- rw [equiv_fst_eq_mul_inv]; simp [equiv_fst_eq_mul_inv, ← mul_assoc]
+ simp [equiv_fst_eq_mul_inv, ← mul_assoc]
theorem equiv_snd_eq_iff_rightCosetEquivalence {g₁ g₂ : G} :
(hHT.equiv g₁).snd = (hHT.equiv g₂).snd ↔ RightCosetEquivalence H g₁ g₂ := by
@@ -379,21 +377,17 @@ theorem equiv_snd_eq_iff_rightCosetEquivalence {g₁ g₂ : G} :
exact Subtype.property _
· intro h
apply (mem_rightTransversals_iff_existsUnique_mul_inv_mem.1 hHT g₁).unique
- · -- This used to be `simp [...]` before leanprover/lean4#2644
- rw [equiv_snd_eq_inv_mul]; simp
+ · simp [equiv_snd_eq_inv_mul]
· rw [SetLike.mem_coe, ← mul_mem_cancel_left h]
- -- This used to be `simp [...]` before leanprover/lean4#2644
- rw [equiv_snd_eq_inv_mul, mul_assoc]; simp
+ simp [equiv_snd_eq_inv_mul, mul_assoc]
theorem leftCosetEquivalence_equiv_fst (g : G) :
LeftCosetEquivalence K g ((hSK.equiv g).fst : G) := by
- -- This used to be `simp [...]` before leanprover/lean4#2644
- rw [equiv_fst_eq_mul_inv]; simp [LeftCosetEquivalence, leftCoset_eq_iff]
+ simp [LeftCosetEquivalence, leftCoset_eq_iff, equiv_fst_eq_mul_inv]
theorem rightCosetEquivalence_equiv_snd (g : G) :
RightCosetEquivalence H g ((hHT.equiv g).snd : G) := by
- -- This used to be `simp [...]` before leanprover/lean4#2644
- rw [RightCosetEquivalence, rightCoset_eq_iff, equiv_snd_eq_inv_mul]; simp
+ simp [RightCosetEquivalence, rightCoset_eq_iff, equiv_snd_eq_inv_mul]
theorem equiv_fst_eq_self_of_mem_of_one_mem {g : G} (h1 : 1 ∈ T) (hg : g ∈ S) :
(hST.equiv g).fst = ⟨g, hg⟩ := by
@@ -417,8 +411,7 @@ theorem equiv_fst_eq_one_of_mem_of_one_mem {g : G} (h1 : 1 ∈ S) (hg : g ∈ T)
ext
rw [equiv_fst_eq_mul_inv, equiv_snd_eq_self_of_mem_of_one_mem _ h1 hg, mul_inv_self]
--- This lemma has always been bad, but the linter only noticed after lean4#2644.
-@[simp, nolint simpNF]
+@[simp]
theorem equiv_mul_right (g : G) (k : K) :
hSK.equiv (g * k) = ((hSK.equiv g).fst, (hSK.equiv g).snd * k) := by
have : (hSK.equiv (g * k)).fst = (hSK.equiv g).fst :=
@@ -432,8 +425,7 @@ theorem equiv_mul_right_of_mem {g k : G} (h : k ∈ K) :
hSK.equiv (g * k) = ((hSK.equiv g).fst, (hSK.equiv g).snd * ⟨k, h⟩) :=
equiv_mul_right _ g ⟨k, h⟩
--- This lemma has always been bad, but the linter only noticed after lean4#2644.
-@[simp, nolint simpNF]
+@[simp]
theorem equiv_mul_left (h : H) (g : G) :
hHT.equiv (h * g) = (h * (hHT.equiv g).fst, (hHT.equiv g).snd) := by
have : (hHT.equiv (h * g)).snd = (hHT.equiv g).snd :=
@@ -363,9 +363,11 @@ theorem equiv_fst_eq_iff_leftCosetEquivalence {g₁ g₂ : G} :
exact Subtype.property _
· intro h
apply (mem_leftTransversals_iff_existsUnique_inv_mul_mem.1 hSK g₁).unique
- · simp [equiv_fst_eq_mul_inv]
+ · -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_fst_eq_mul_inv]; simp
· rw [SetLike.mem_coe, ← mul_mem_cancel_right h]
- simp [equiv_fst_eq_mul_inv, ← mul_assoc]
+ -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_fst_eq_mul_inv]; simp [equiv_fst_eq_mul_inv, ← mul_assoc]
theorem equiv_snd_eq_iff_rightCosetEquivalence {g₁ g₂ : G} :
(hHT.equiv g₁).snd = (hHT.equiv g₂).snd ↔ RightCosetEquivalence H g₁ g₂ := by
@@ -377,17 +379,21 @@ theorem equiv_snd_eq_iff_rightCosetEquivalence {g₁ g₂ : G} :
exact Subtype.property _
· intro h
apply (mem_rightTransversals_iff_existsUnique_mul_inv_mem.1 hHT g₁).unique
- · simp [equiv_snd_eq_inv_mul]
+ · -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_snd_eq_inv_mul]; simp
· rw [SetLike.mem_coe, ← mul_mem_cancel_left h]
- simp [equiv_snd_eq_inv_mul, mul_assoc]
+ -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_snd_eq_inv_mul, mul_assoc]; simp
theorem leftCosetEquivalence_equiv_fst (g : G) :
LeftCosetEquivalence K g ((hSK.equiv g).fst : G) := by
- simp [LeftCosetEquivalence, leftCoset_eq_iff, equiv_fst_eq_mul_inv]
+ -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [equiv_fst_eq_mul_inv]; simp [LeftCosetEquivalence, leftCoset_eq_iff]
theorem rightCosetEquivalence_equiv_snd (g : G) :
RightCosetEquivalence H g ((hHT.equiv g).snd : G) := by
- simp [RightCosetEquivalence, rightCoset_eq_iff, equiv_snd_eq_inv_mul]
+ -- This used to be `simp [...]` before leanprover/lean4#2644
+ rw [RightCosetEquivalence, rightCoset_eq_iff, equiv_snd_eq_inv_mul]; simp
theorem equiv_fst_eq_self_of_mem_of_one_mem {g : G} (h1 : 1 ∈ T) (hg : g ∈ S) :
(hST.equiv g).fst = ⟨g, hg⟩ := by
@@ -411,7 +417,8 @@ theorem equiv_fst_eq_one_of_mem_of_one_mem {g : G} (h1 : 1 ∈ S) (hg : g ∈ T)
ext
rw [equiv_fst_eq_mul_inv, equiv_snd_eq_self_of_mem_of_one_mem _ h1 hg, mul_inv_self]
-@[simp]
+-- This lemma has always been bad, but the linter only noticed after lean4#2644.
+@[simp, nolint simpNF]
theorem equiv_mul_right (g : G) (k : K) :
hSK.equiv (g * k) = ((hSK.equiv g).fst, (hSK.equiv g).snd * k) := by
have : (hSK.equiv (g * k)).fst = (hSK.equiv g).fst :=
@@ -425,7 +432,8 @@ theorem equiv_mul_right_of_mem {g k : G} (h : k ∈ K) :
hSK.equiv (g * k) = ((hSK.equiv g).fst, (hSK.equiv g).snd * ⟨k, h⟩) :=
equiv_mul_right _ g ⟨k, h⟩
-@[simp]
+-- This lemma has always been bad, but the linter only noticed after lean4#2644.
+@[simp, nolint simpNF]
theorem equiv_mul_left (h : H) (g : G) :
hHT.equiv (h * g) = (h * (hHT.equiv g).fst, (hHT.equiv g).snd) := by
have : (hHT.equiv (h * g)).snd = (hHT.equiv g).snd :=
@@ -681,7 +681,7 @@ theorem isComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype
theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G)
- (h2 : Nat.coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
+ (h2 : Nat.Coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
@@ -681,7 +681,7 @@ theorem isComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype
theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G)
- (h2 : Nat.Coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
+ (h2 : Nat.coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
Some changes have already been review and delegated in #6910 and #7148.
The diff that needs looking at is https://github.com/leanprover-community/mathlib4/pull/7174/commits/64d6d07ee18163627c8f517eb31455411921c5ac
The std bump PR was insta-merged already!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -681,7 +681,7 @@ theorem isComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype
theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G)
- (h2 : Nat.coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
+ (h2 : Nat.Coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
@@ -333,6 +333,144 @@ theorem exists_right_transversal (g : G) : ∃ S ∈ rightTransversals (H : Set
#align subgroup.exists_right_transversal Subgroup.exists_right_transversal
#align add_subgroup.exists_right_transversal AddSubgroup.exists_right_transversal
+namespace IsComplement
+
+/-- The equivalence `G ≃ S × T`, such that the inverse is `(*) : S × T → G` -/
+noncomputable def equiv {S T : Set G} (hST : IsComplement S T) : G ≃ S × T :=
+ (Equiv.ofBijective (fun x : S × T => x.1.1 * x.2.1) hST).symm
+
+variable (hST : IsComplement S T) (hHT : IsComplement H T) (hSK : IsComplement S K)
+
+@[simp] theorem equiv_symm_apply (x : S × T) : (hST.equiv.symm x : G) = x.1.1 * x.2.1 := rfl
+
+@[simp]
+theorem equiv_fst_mul_equiv_snd (g : G) : ↑(hST.equiv g).fst * (hST.equiv g).snd = g :=
+ (Equiv.ofBijective (fun x : S × T => x.1.1 * x.2.1) hST).right_inv g
+
+theorem equiv_fst_eq_mul_inv (g : G) : ↑(hST.equiv g).fst = g * ((hST.equiv g).snd : G)⁻¹ :=
+ eq_mul_inv_of_mul_eq (hST.equiv_fst_mul_equiv_snd g)
+
+theorem equiv_snd_eq_inv_mul (g : G) : ↑(hST.equiv g).snd = ((hST.equiv g).fst : G)⁻¹ * g :=
+ eq_inv_mul_of_mul_eq (hST.equiv_fst_mul_equiv_snd g)
+
+theorem equiv_fst_eq_iff_leftCosetEquivalence {g₁ g₂ : G} :
+ (hSK.equiv g₁).fst = (hSK.equiv g₂).fst ↔ LeftCosetEquivalence K g₁ g₂ := by
+ rw [LeftCosetEquivalence, leftCoset_eq_iff]
+ constructor
+ · intro h
+ rw [← hSK.equiv_fst_mul_equiv_snd g₂, ←hSK.equiv_fst_mul_equiv_snd g₁, ← h,
+ mul_inv_rev, ← mul_assoc, inv_mul_cancel_right, ← coe_inv, ← coe_mul]
+ exact Subtype.property _
+ · intro h
+ apply (mem_leftTransversals_iff_existsUnique_inv_mul_mem.1 hSK g₁).unique
+ · simp [equiv_fst_eq_mul_inv]
+ · rw [SetLike.mem_coe, ← mul_mem_cancel_right h]
+ simp [equiv_fst_eq_mul_inv, ← mul_assoc]
+
+theorem equiv_snd_eq_iff_rightCosetEquivalence {g₁ g₂ : G} :
+ (hHT.equiv g₁).snd = (hHT.equiv g₂).snd ↔ RightCosetEquivalence H g₁ g₂ := by
+ rw [RightCosetEquivalence, rightCoset_eq_iff]
+ constructor
+ · intro h
+ rw [← hHT.equiv_fst_mul_equiv_snd g₂, ←hHT.equiv_fst_mul_equiv_snd g₁, ← h,
+ mul_inv_rev, mul_assoc, mul_inv_cancel_left, ← coe_inv, ← coe_mul]
+ exact Subtype.property _
+ · intro h
+ apply (mem_rightTransversals_iff_existsUnique_mul_inv_mem.1 hHT g₁).unique
+ · simp [equiv_snd_eq_inv_mul]
+ · rw [SetLike.mem_coe, ← mul_mem_cancel_left h]
+ simp [equiv_snd_eq_inv_mul, mul_assoc]
+
+theorem leftCosetEquivalence_equiv_fst (g : G) :
+ LeftCosetEquivalence K g ((hSK.equiv g).fst : G) := by
+ simp [LeftCosetEquivalence, leftCoset_eq_iff, equiv_fst_eq_mul_inv]
+
+theorem rightCosetEquivalence_equiv_snd (g : G) :
+ RightCosetEquivalence H g ((hHT.equiv g).snd : G) := by
+ simp [RightCosetEquivalence, rightCoset_eq_iff, equiv_snd_eq_inv_mul]
+
+theorem equiv_fst_eq_self_of_mem_of_one_mem {g : G} (h1 : 1 ∈ T) (hg : g ∈ S) :
+ (hST.equiv g).fst = ⟨g, hg⟩ := by
+ have : hST.equiv.symm (⟨g, hg⟩, ⟨1, h1⟩) = g := by
+ rw [equiv, Equiv.ofBijective]; simp
+ conv_lhs => rw [← this, Equiv.apply_symm_apply]
+
+theorem equiv_snd_eq_self_of_mem_of_one_mem {g : G} (h1 : 1 ∈ S) (hg : g ∈ T) :
+ (hST.equiv g).snd = ⟨g, hg⟩ := by
+ have : hST.equiv.symm (⟨1, h1⟩, ⟨g, hg⟩) = g := by
+ rw [equiv, Equiv.ofBijective]; simp
+ conv_lhs => rw [← this, Equiv.apply_symm_apply]
+
+theorem equiv_snd_eq_one_of_mem_of_one_mem {g : G} (h1 : 1 ∈ T) (hg : g ∈ S) :
+ (hST.equiv g).snd = ⟨1, h1⟩ := by
+ ext
+ rw [equiv_snd_eq_inv_mul, equiv_fst_eq_self_of_mem_of_one_mem _ h1 hg, inv_mul_self]
+
+theorem equiv_fst_eq_one_of_mem_of_one_mem {g : G} (h1 : 1 ∈ S) (hg : g ∈ T) :
+ (hST.equiv g).fst = ⟨1, h1⟩ := by
+ ext
+ rw [equiv_fst_eq_mul_inv, equiv_snd_eq_self_of_mem_of_one_mem _ h1 hg, mul_inv_self]
+
+@[simp]
+theorem equiv_mul_right (g : G) (k : K) :
+ hSK.equiv (g * k) = ((hSK.equiv g).fst, (hSK.equiv g).snd * k) := by
+ have : (hSK.equiv (g * k)).fst = (hSK.equiv g).fst :=
+ hSK.equiv_fst_eq_iff_leftCosetEquivalence.2
+ (by simp [LeftCosetEquivalence, leftCoset_eq_iff])
+ ext
+ · rw [this]
+ · rw [coe_mul, equiv_snd_eq_inv_mul, this, equiv_snd_eq_inv_mul, mul_assoc]
+
+theorem equiv_mul_right_of_mem {g k : G} (h : k ∈ K) :
+ hSK.equiv (g * k) = ((hSK.equiv g).fst, (hSK.equiv g).snd * ⟨k, h⟩) :=
+ equiv_mul_right _ g ⟨k, h⟩
+
+@[simp]
+theorem equiv_mul_left (h : H) (g : G) :
+ hHT.equiv (h * g) = (h * (hHT.equiv g).fst, (hHT.equiv g).snd) := by
+ have : (hHT.equiv (h * g)).snd = (hHT.equiv g).snd :=
+ hHT.equiv_snd_eq_iff_rightCosetEquivalence.2
+ (by simp [RightCosetEquivalence, rightCoset_eq_iff])
+ ext
+ · rw [coe_mul, equiv_fst_eq_mul_inv, this, equiv_fst_eq_mul_inv, mul_assoc]
+ · rw [this]
+
+theorem equiv_mul_left_of_mem {h g : G} (hh : h ∈ H) :
+ hHT.equiv (h * g) = (⟨h, hh⟩ * (hHT.equiv g).fst, (hHT.equiv g).snd) :=
+ equiv_mul_left _ ⟨h, hh⟩ g
+
+theorem equiv_one (hs1 : 1 ∈ S) (ht1 : 1 ∈ T) :
+ hST.equiv 1 = (⟨1, hs1⟩, ⟨1, ht1⟩) := by
+ rw [Equiv.apply_eq_iff_eq_symm_apply]; simp [equiv]
+
+theorem equiv_fst_eq_self_iff_mem {g : G} (h1 : 1 ∈ T) :
+ ((hST.equiv g).fst : G) = g ↔ g ∈ S := by
+ constructor
+ · intro h
+ rw [← h]
+ exact Subtype.prop _
+ · intro h
+ rw [hST.equiv_fst_eq_self_of_mem_of_one_mem h1 h]
+
+theorem equiv_snd_eq_self_iff_mem {g : G} (h1 : 1 ∈ S) :
+ ((hST.equiv g).snd : G) = g ↔ g ∈ T := by
+ constructor
+ · intro h
+ rw [← h]
+ exact Subtype.prop _
+ · intro h
+ rw [hST.equiv_snd_eq_self_of_mem_of_one_mem h1 h]
+
+theorem coe_equiv_fst_eq_one_iff_mem {g : G} (h1 : 1 ∈ S) :
+ ((hST.equiv g).fst : G) = 1 ↔ g ∈ T := by
+ rw [equiv_fst_eq_mul_inv, mul_inv_eq_one, eq_comm, equiv_snd_eq_self_iff_mem _ h1]
+
+theorem coe_equiv_snd_eq_one_iff_mem {g : G} (h1 : 1 ∈ T) :
+ ((hST.equiv g).snd : G) = 1 ↔ g ∈ S := by
+ rw [equiv_snd_eq_inv_mul, inv_mul_eq_one, equiv_fst_eq_self_iff_mem _ h1]
+
+end IsComplement
+
namespace MemLeftTransversals
/-- A left transversal is in bijection with left cosets. -/
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -33,7 +33,7 @@ open BigOperators Pointwise
namespace Subgroup
-variable {G : Type _} [Group G] (H K : Subgroup G) (S T : Set G)
+variable {G : Type*} [Group G] (H K : Subgroup G) (S T : Set G)
/-- `S` and `T` are complements if `(*) : S × T → G` is a bijection.
This notion generalizes left transversals, right transversals, and complementary subgroups. -/
@@ -437,7 +437,7 @@ section Action
open Pointwise MulAction MemLeftTransversals
-variable {F : Type _} [Group F] [MulAction F G] [QuotientAction F H]
+variable {F : Type*} [Group F] [MulAction F G] [QuotientAction F H]
@[to_additive]
noncomputable instance : MulAction F (leftTransversals (H : Set G)) where
@@ -547,7 +547,7 @@ theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
-theorem isComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
+theorem isComplement'_stabilizer {α : Type*} [MulAction G α] (a : α)
(h1 : ∀ h : H, h • a = a → h = 1) (h2 : ∀ g : G, ∃ h : H, h • g • a = a) :
IsComplement' H (MulAction.stabilizer G a) := by
refine' isComplement_iff_existsUnique.mpr fun g => _
@@ -2,14 +2,11 @@
Copyright (c) 2021 Thomas Browning. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning
-
-! This file was ported from Lean 3 source module group_theory.complement
-! leanprover-community/mathlib commit 6ca1a09bc9aa75824bf97388c9e3b441fc4ccf3f
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Data.ZMod.Quotient
+#align_import group_theory.complement from "leanprover-community/mathlib"@"6ca1a09bc9aa75824bf97388c9e3b441fc4ccf3f"
+
/-!
# Complements
at
and goals (#5387)
Changes are of the form
some_tactic at h⊢
-> some_tactic at h ⊢
some_tactic at h
-> some_tactic at h
@@ -452,7 +452,7 @@ noncomputable instance : MulAction F (leftTransversals (H : Set G)) where
· exact smul_inv_smul f g ▸ QuotientAction.inv_mul_mem f ht1
· rintro ⟨-, t', ht', rfl⟩ h
replace h := QuotientAction.inv_mul_mem f⁻¹ h
- simp only [Subtype.ext_iff, Subtype.coe_mk, smul_left_cancel_iff, inv_smul_smul] at h⊢
+ simp only [Subtype.ext_iff, Subtype.coe_mk, smul_left_cancel_iff, inv_smul_smul] at h ⊢
exact Subtype.ext_iff.mp (ht2 ⟨t', ht'⟩ h)⟩
one_smul T := Subtype.ext (one_smul F (T : Set G))
mul_smul f₁ f₂ T := Subtype.ext (mul_smul f₁ f₂ (T : Set G))
@@ -28,7 +28,7 @@ In this file we define the complement of a subgroup.
## Main results
-- `IsComplement'_of_coprime` : Subgroups of coprime order are complements.
+- `isComplement'_of_coprime` : Subgroups of coprime order are complements.
-/
@@ -40,14 +40,14 @@ variable {G : Type _} [Group G] (H K : Subgroup G) (S T : Set G)
/-- `S` and `T` are complements if `(*) : S × T → G` is a bijection.
This notion generalizes left transversals, right transversals, and complementary subgroups. -/
-@[to_additive "`S` and `T` are complements if `(*) : S × T → G` is a bijection"]
+@[to_additive "`S` and `T` are complements if `(+) : S × T → G` is a bijection"]
def IsComplement : Prop :=
Function.Bijective fun x : S × T => x.1.1 * x.2.1
#align subgroup.is_complement Subgroup.IsComplement
#align add_subgroup.is_complement AddSubgroup.IsComplement
/-- `H` and `K` are complements if `(*) : H × K → G` is a bijection -/
-@[to_additive "`H` and `K` are complements if `(*) : H × K → G` is a bijection"]
+@[to_additive "`H` and `K` are complements if `(+) : H × K → G` is a bijection"]
abbrev IsComplement' :=
IsComplement (H : Set G) (K : Set G)
#align subgroup.is_complement' Subgroup.IsComplement'
@@ -70,22 +70,22 @@ def rightTransversals : Set (Set G) :=
variable {H K S T}
@[to_additive]
-theorem IsComplement'_def : IsComplement' H K ↔ IsComplement (H : Set G) (K : Set G) :=
+theorem isComplement'_def : IsComplement' H K ↔ IsComplement (H : Set G) (K : Set G) :=
Iff.rfl
-#align subgroup.is_complement'_def Subgroup.IsComplement'_def
-#align add_subgroup.is_complement'_def AddSubgroup.IsComplement'_def
+#align subgroup.is_complement'_def Subgroup.isComplement'_def
+#align add_subgroup.is_complement'_def AddSubgroup.isComplement'_def
@[to_additive]
-theorem IsComplement_iff_existsUnique :
+theorem isComplement_iff_existsUnique :
IsComplement S T ↔ ∀ g : G, ∃! x : S × T, x.1.1 * x.2.1 = g :=
Function.bijective_iff_existsUnique _
-#align subgroup.is_complement_iff_exists_unique Subgroup.IsComplement_iff_existsUnique
-#align add_subgroup.is_complement_iff_exists_unique AddSubgroup.IsComplement_iff_existsUnique
+#align subgroup.is_complement_iff_exists_unique Subgroup.isComplement_iff_existsUnique
+#align add_subgroup.is_complement_iff_exists_unique AddSubgroup.isComplement_iff_existsUnique
@[to_additive]
theorem IsComplement.existsUnique (h : IsComplement S T) (g : G) :
∃! x : S × T, x.1.1 * x.2.1 = g :=
- IsComplement_iff_existsUnique.mp h g
+ isComplement_iff_existsUnique.mp h g
#align subgroup.is_complement.exists_unique Subgroup.IsComplement.existsUnique
#align add_subgroup.is_complement.exists_unique AddSubgroup.IsComplement.existsUnique
@@ -96,7 +96,7 @@ theorem IsComplement'.symm (h : IsComplement' H K) : IsComplement' K H := by
(fun x => Prod.ext (inv_inv _) (inv_inv _)) fun x => Prod.ext (inv_inv _) (inv_inv _)
let ψ : G ≃ G := Equiv.mk (fun g : G => g⁻¹) (fun g : G => g⁻¹) inv_inv inv_inv
suffices hf : (ψ ∘ fun x : H × K => x.1.1 * x.2.1) = (fun x : K × H => x.1.1 * x.2.1) ∘ ϕ by
- rw [IsComplement'_def, IsComplement, ← Equiv.bijective_comp ϕ]
+ rw [isComplement'_def, IsComplement, ← Equiv.bijective_comp ϕ]
apply (congr_arg Function.Bijective hf).mp -- porting note: This was a `rw` in mathlib3
rwa [ψ.comp_bijective]
exact funext fun x => mul_inv_rev _ _
@@ -104,47 +104,47 @@ theorem IsComplement'.symm (h : IsComplement' H K) : IsComplement' K H := by
#align add_subgroup.is_complement'.symm AddSubgroup.IsComplement'.symm
@[to_additive]
-theorem IsComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
+theorem isComplement'_comm : IsComplement' H K ↔ IsComplement' K H :=
⟨IsComplement'.symm, IsComplement'.symm⟩
-#align subgroup.is_complement'_comm Subgroup.IsComplement'_comm
-#align add_subgroup.is_complement'_comm AddSubgroup.IsComplement'_comm
+#align subgroup.is_complement'_comm Subgroup.isComplement'_comm
+#align add_subgroup.is_complement'_comm AddSubgroup.isComplement'_comm
@[to_additive]
-theorem IsComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
+theorem isComplement_top_singleton {g : G} : IsComplement (⊤ : Set G) {g} :=
⟨fun ⟨_, _, rfl⟩ ⟨_, _, rfl⟩ h => Prod.ext (Subtype.ext (mul_right_cancel h)) rfl, fun x =>
⟨⟨⟨x * g⁻¹, ⟨⟩⟩, g, rfl⟩, inv_mul_cancel_right x g⟩⟩
-#align subgroup.is_complement_top_singleton Subgroup.IsComplement_top_singleton
-#align add_subgroup.is_complement_top_singleton AddSubgroup.IsComplement_top_singleton
+#align subgroup.is_complement_top_singleton Subgroup.isComplement_top_singleton
+#align add_subgroup.is_complement_top_singleton AddSubgroup.isComplement_top_singleton
@[to_additive]
-theorem IsComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
+theorem isComplement_singleton_top {g : G} : IsComplement ({g} : Set G) ⊤ :=
⟨fun ⟨⟨_, rfl⟩, _⟩ ⟨⟨_, rfl⟩, _⟩ h => Prod.ext rfl (Subtype.ext (mul_left_cancel h)), fun x =>
⟨⟨⟨g, rfl⟩, g⁻¹ * x, ⟨⟩⟩, mul_inv_cancel_left g x⟩⟩
-#align subgroup.is_complement_singleton_top Subgroup.IsComplement_singleton_top
-#align add_subgroup.is_complement_singleton_top AddSubgroup.IsComplement_singleton_top
+#align subgroup.is_complement_singleton_top Subgroup.isComplement_singleton_top
+#align add_subgroup.is_complement_singleton_top AddSubgroup.isComplement_singleton_top
@[to_additive]
-theorem IsComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ := by
+theorem isComplement_singleton_left {g : G} : IsComplement {g} S ↔ S = ⊤ := by
refine'
- ⟨fun h => top_le_iff.mp fun x _ => _, fun h => (congr_arg _ h).mpr IsComplement_singleton_top⟩
+ ⟨fun h => top_le_iff.mp fun x _ => _, fun h => (congr_arg _ h).mpr isComplement_singleton_top⟩
obtain ⟨⟨⟨z, rfl : z = g⟩, y, _⟩, hy⟩ := h.2 (g * x)
rwa [← mul_left_cancel hy]
-#align subgroup.is_complement_singleton_left Subgroup.IsComplement_singleton_left
-#align add_subgroup.is_complement_singleton_left AddSubgroup.IsComplement_singleton_left
+#align subgroup.is_complement_singleton_left Subgroup.isComplement_singleton_left
+#align add_subgroup.is_complement_singleton_left AddSubgroup.isComplement_singleton_left
@[to_additive]
-theorem IsComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ := by
+theorem isComplement_singleton_right {g : G} : IsComplement S {g} ↔ S = ⊤ := by
refine'
- ⟨fun h => top_le_iff.mp fun x _ => _, fun h => h ▸ IsComplement_top_singleton⟩
+ ⟨fun h => top_le_iff.mp fun x _ => _, fun h => h ▸ isComplement_top_singleton⟩
obtain ⟨y, hy⟩ := h.2 (x * g)
conv_rhs at hy => rw [← show y.2.1 = g from y.2.2]
rw [← mul_right_cancel hy]
exact y.1.2
-#align subgroup.is_complement_singleton_right Subgroup.IsComplement_singleton_right
-#align add_subgroup.is_complement_singleton_right AddSubgroup.IsComplement_singleton_right
+#align subgroup.is_complement_singleton_right Subgroup.isComplement_singleton_right
+#align add_subgroup.is_complement_singleton_right AddSubgroup.isComplement_singleton_right
@[to_additive]
-theorem IsComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} := by
+theorem isComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} := by
refine'
⟨fun h => Set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
· obtain ⟨a, _⟩ := h.2 1
@@ -153,12 +153,12 @@ theorem IsComplement_top_left : IsComplement ⊤ S ↔ ∃ g : G, S = {g} := by
h.1 ((inv_mul_self a).trans (inv_mul_self b).symm)
exact Subtype.ext_iff.mp (Prod.ext_iff.mp this).2
· rintro ⟨g, rfl⟩
- exact IsComplement_top_singleton
-#align subgroup.is_complement_top_left Subgroup.IsComplement_top_left
-#align add_subgroup.is_complement_top_left AddSubgroup.IsComplement_top_left
+ exact isComplement_top_singleton
+#align subgroup.is_complement_top_left Subgroup.isComplement_top_left
+#align add_subgroup.is_complement_top_left AddSubgroup.isComplement_top_left
@[to_additive]
-theorem IsComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} := by
+theorem isComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} := by
refine'
⟨fun h => Set.exists_eq_singleton_iff_nonempty_subsingleton.mpr ⟨_, fun a ha b hb => _⟩, _⟩
· obtain ⟨a, _⟩ := h.2 1
@@ -167,50 +167,50 @@ theorem IsComplement_top_right : IsComplement S ⊤ ↔ ∃ g : G, S = {g} := by
h.1 ((mul_inv_self a).trans (mul_inv_self b).symm)
exact Subtype.ext_iff.mp (Prod.ext_iff.mp this).1
· rintro ⟨g, rfl⟩
- exact IsComplement_singleton_top
-#align subgroup.is_complement_top_right Subgroup.IsComplement_top_right
-#align add_subgroup.is_complement_top_right AddSubgroup.IsComplement_top_right
+ exact isComplement_singleton_top
+#align subgroup.is_complement_top_right Subgroup.isComplement_top_right
+#align add_subgroup.is_complement_top_right AddSubgroup.isComplement_top_right
@[to_additive]
-theorem IsComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
- IsComplement_top_singleton
-#align subgroup.is_complement'_top_bot Subgroup.IsComplement'_top_bot
-#align add_subgroup.is_complement'_top_bot AddSubgroup.IsComplement'_top_bot
+theorem isComplement'_top_bot : IsComplement' (⊤ : Subgroup G) ⊥ :=
+ isComplement_top_singleton
+#align subgroup.is_complement'_top_bot Subgroup.isComplement'_top_bot
+#align add_subgroup.is_complement'_top_bot AddSubgroup.isComplement'_top_bot
@[to_additive]
-theorem IsComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
- IsComplement_singleton_top
-#align subgroup.is_complement'_bot_top Subgroup.IsComplement'_bot_top
-#align add_subgroup.is_complement'_bot_top AddSubgroup.IsComplement'_bot_top
+theorem isComplement'_bot_top : IsComplement' (⊥ : Subgroup G) ⊤ :=
+ isComplement_singleton_top
+#align subgroup.is_complement'_bot_top Subgroup.isComplement'_bot_top
+#align add_subgroup.is_complement'_bot_top AddSubgroup.isComplement'_bot_top
@[to_additive (attr := simp)]
-theorem IsComplement'_bot_left : IsComplement' ⊥ H ↔ H = ⊤ :=
- IsComplement_singleton_left.trans coe_eq_univ
-#align subgroup.is_complement'_bot_left Subgroup.IsComplement'_bot_left
-#align add_subgroup.is_complement'_bot_left AddSubgroup.IsComplement'_bot_left
+theorem isComplement'_bot_left : IsComplement' ⊥ H ↔ H = ⊤ :=
+ isComplement_singleton_left.trans coe_eq_univ
+#align subgroup.is_complement'_bot_left Subgroup.isComplement'_bot_left
+#align add_subgroup.is_complement'_bot_left AddSubgroup.isComplement'_bot_left
@[to_additive (attr := simp)]
-theorem IsComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
- IsComplement_singleton_right.trans coe_eq_univ
-#align subgroup.is_complement'_bot_right Subgroup.IsComplement'_bot_right
-#align add_subgroup.is_complement'_bot_right AddSubgroup.IsComplement'_bot_right
+theorem isComplement'_bot_right : IsComplement' H ⊥ ↔ H = ⊤ :=
+ isComplement_singleton_right.trans coe_eq_univ
+#align subgroup.is_complement'_bot_right Subgroup.isComplement'_bot_right
+#align add_subgroup.is_complement'_bot_right AddSubgroup.isComplement'_bot_right
@[to_additive (attr := simp)]
-theorem IsComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
- IsComplement_top_left.trans coe_eq_singleton
-#align subgroup.is_complement'_top_left Subgroup.IsComplement'_top_left
-#align add_subgroup.is_complement'_top_left AddSubgroup.IsComplement'_top_left
+theorem isComplement'_top_left : IsComplement' ⊤ H ↔ H = ⊥ :=
+ isComplement_top_left.trans coe_eq_singleton
+#align subgroup.is_complement'_top_left Subgroup.isComplement'_top_left
+#align add_subgroup.is_complement'_top_left AddSubgroup.isComplement'_top_left
@[to_additive (attr := simp)]
-theorem IsComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
- IsComplement_top_right.trans coe_eq_singleton
-#align subgroup.is_complement'_top_right Subgroup.IsComplement'_top_right
-#align add_subgroup.is_complement'_top_right AddSubgroup.IsComplement'_top_right
+theorem isComplement'_top_right : IsComplement' H ⊤ ↔ H = ⊥ :=
+ isComplement_top_right.trans coe_eq_singleton
+#align subgroup.is_complement'_top_right Subgroup.isComplement'_top_right
+#align add_subgroup.is_complement'_top_right AddSubgroup.isComplement'_top_right
@[to_additive]
theorem mem_leftTransversals_iff_existsUnique_inv_mul_mem :
S ∈ leftTransversals T ↔ ∀ g : G, ∃! s : S, (s : G)⁻¹ * g ∈ T := by
- rw [leftTransversals, Set.mem_setOf_eq, IsComplement_iff_existsUnique]
+ rw [leftTransversals, Set.mem_setOf_eq, isComplement_iff_existsUnique]
refine' ⟨fun h g => _, fun h g => _⟩
· obtain ⟨x, h1, h2⟩ := h g
exact
@@ -220,15 +220,13 @@ theorem mem_leftTransversals_iff_existsUnique_inv_mul_mem :
refine' ⟨⟨x, (↑x)⁻¹ * g, h1⟩, mul_inv_cancel_left (↑x) g, fun y hy => _⟩
have hf := h2 y.1 ((congr_arg (· ∈ T) (eq_inv_mul_of_mul_eq hy)).mp y.2.2)
exact Prod.ext hf (Subtype.ext (eq_inv_mul_of_mul_eq (hf ▸ hy)))
-#align subgroup.mem_left_transversals_iff_exists_unique_inv_mul_mem
- Subgroup.mem_leftTransversals_iff_existsUnique_inv_mul_mem
-#align add_subgroup.mem_left_transversals_iff_exists_unique_neg_add_mem
- AddSubgroup.mem_leftTransversals_iff_existsUnique_neg_add_mem
+#align subgroup.mem_left_transversals_iff_exists_unique_inv_mul_mem Subgroup.mem_leftTransversals_iff_existsUnique_inv_mul_mem
+#align add_subgroup.mem_left_transversals_iff_exists_unique_neg_add_mem AddSubgroup.mem_leftTransversals_iff_existsUnique_neg_add_mem
@[to_additive]
theorem mem_rightTransversals_iff_existsUnique_mul_inv_mem :
S ∈ rightTransversals T ↔ ∀ g : G, ∃! s : S, g * (s : G)⁻¹ ∈ T := by
- rw [rightTransversals, Set.mem_setOf_eq, IsComplement_iff_existsUnique]
+ rw [rightTransversals, Set.mem_setOf_eq, isComplement_iff_existsUnique]
refine' ⟨fun h g => _, fun h g => _⟩
· obtain ⟨x, h1, h2⟩ := h g
exact
@@ -238,10 +236,8 @@ theorem mem_rightTransversals_iff_existsUnique_mul_inv_mem :
refine' ⟨⟨⟨g * (↑x)⁻¹, h1⟩, x⟩, inv_mul_cancel_right g x, fun y hy => _⟩
have hf := h2 y.2 ((congr_arg (· ∈ T) (eq_mul_inv_of_mul_eq hy)).mp y.1.2)
exact Prod.ext (Subtype.ext (eq_mul_inv_of_mul_eq (hf ▸ hy))) hf
-#align subgroup.mem_right_transversals_iff_exists_unique_mul_inv_mem
- Subgroup.mem_rightTransversals_iff_existsUnique_mul_inv_mem
-#align add_subgroup.mem_right_transversals_iff_exists_unique_add_neg_mem
- AddSubgroup.mem_rightTransversals_iff_existsUnique_add_neg_mem
+#align subgroup.mem_right_transversals_iff_exists_unique_mul_inv_mem Subgroup.mem_rightTransversals_iff_existsUnique_mul_inv_mem
+#align add_subgroup.mem_right_transversals_iff_exists_unique_add_neg_mem AddSubgroup.mem_rightTransversals_iff_existsUnique_add_neg_mem
@[to_additive]
theorem mem_leftTransversals_iff_existsUnique_quotient_mk''_eq :
@@ -250,10 +246,8 @@ theorem mem_leftTransversals_iff_existsUnique_quotient_mk''_eq :
simp_rw [mem_leftTransversals_iff_existsUnique_inv_mul_mem, SetLike.mem_coe, ←
QuotientGroup.eq']
exact ⟨fun h q => Quotient.inductionOn' q h, fun h g => h (Quotient.mk'' g)⟩
-#align subgroup.mem_left_transversals_iff_exists_unique_quotient_mk'_eq
- Subgroup.mem_leftTransversals_iff_existsUnique_quotient_mk''_eq
-#align add_subgroup.mem_left_transversals_iff_exists_unique_quotient_mk'_eq
- AddSubgroup.mem_leftTransversals_iff_existsUnique_quotient_mk''_eq
+#align subgroup.mem_left_transversals_iff_exists_unique_quotient_mk'_eq Subgroup.mem_leftTransversals_iff_existsUnique_quotient_mk''_eq
+#align add_subgroup.mem_left_transversals_iff_exists_unique_quotient_mk'_eq AddSubgroup.mem_leftTransversals_iff_existsUnique_quotient_mk''_eq
@[to_additive]
theorem mem_rightTransversals_iff_existsUnique_quotient_mk''_eq :
@@ -262,10 +256,8 @@ theorem mem_rightTransversals_iff_existsUnique_quotient_mk''_eq :
simp_rw [mem_rightTransversals_iff_existsUnique_mul_inv_mem, SetLike.mem_coe, ←
QuotientGroup.rightRel_apply, ← Quotient.eq'']
exact ⟨fun h q => Quotient.inductionOn' q h, fun h g => h (Quotient.mk'' g)⟩
-#align subgroup.mem_right_transversals_iff_exists_unique_quotient_mk'_eq
- Subgroup.mem_rightTransversals_iff_existsUnique_quotient_mk''_eq
-#align add_subgroup.mem_right_transversals_iff_exists_unique_quotient_mk'_eq
- AddSubgroup.mem_rightTransversals_iff_existsUnique_quotient_mk''_eq
+#align subgroup.mem_right_transversals_iff_exists_unique_quotient_mk'_eq Subgroup.mem_rightTransversals_iff_existsUnique_quotient_mk''_eq
+#align add_subgroup.mem_right_transversals_iff_exists_unique_quotient_mk'_eq AddSubgroup.mem_rightTransversals_iff_existsUnique_quotient_mk''_eq
@[to_additive]
theorem mem_leftTransversals_iff_bijective :
@@ -274,8 +266,7 @@ theorem mem_leftTransversals_iff_bijective :
mem_leftTransversals_iff_existsUnique_quotient_mk''_eq.trans
(Function.bijective_iff_existsUnique (S.restrict Quotient.mk'')).symm
#align subgroup.mem_left_transversals_iff_bijective Subgroup.mem_leftTransversals_iff_bijective
-#align add_subgroup.mem_left_transversals_iff_bijective
- AddSubgroup.mem_leftTransversals_iff_bijective
+#align add_subgroup.mem_left_transversals_iff_bijective AddSubgroup.mem_leftTransversals_iff_bijective
@[to_additive]
theorem mem_rightTransversals_iff_bijective :
@@ -284,8 +275,7 @@ theorem mem_rightTransversals_iff_bijective :
mem_rightTransversals_iff_existsUnique_quotient_mk''_eq.trans
(Function.bijective_iff_existsUnique (S.restrict Quotient.mk'')).symm
#align subgroup.mem_right_transversals_iff_bijective Subgroup.mem_rightTransversals_iff_bijective
-#align add_subgroup.mem_right_transversals_iff_bijective
- AddSubgroup.mem_rightTransversals_iff_bijective
+#align add_subgroup.mem_right_transversals_iff_bijective AddSubgroup.mem_rightTransversals_iff_bijective
@[to_additive]
theorem card_left_transversal (h : S ∈ leftTransversals (H : Set G)) : Nat.card S = H.index :=
@@ -367,10 +357,8 @@ theorem toEquiv_apply {f : G ⧸ H → G} (hf : ∀ q, (f q : G ⧸ H) = q) (q :
(toEquiv (range_mem_leftTransversals hf) q : G) = f q := by
refine' (Subtype.ext_iff.mp _).trans (Subtype.coe_mk (f q) ⟨q, rfl⟩)
exact (toEquiv (range_mem_leftTransversals hf)).apply_eq_iff_eq_symm_apply.mpr (hf q).symm
-#align subgroup.mem_left_transversals.to_equiv_apply
- Subgroup.MemLeftTransversals.toEquiv_apply
-#align add_subgroup.mem_left_transversals.to_equiv_apply
- AddSubgroup.MemLeftTransversals.toEquiv_apply
+#align subgroup.mem_left_transversals.to_equiv_apply Subgroup.MemLeftTransversals.toEquiv_apply
+#align add_subgroup.mem_left_transversals.to_equiv_apply AddSubgroup.MemLeftTransversals.toEquiv_apply
/-- A left transversal can be viewed as a function mapping each element of the group
to the chosen representative from that left coset. -/
@@ -385,19 +373,15 @@ noncomputable def toFun (hS : S ∈ Subgroup.leftTransversals (H : Set G)) : G
theorem inv_toFun_mul_mem (hS : S ∈ Subgroup.leftTransversals (H : Set G)) (g : G) :
(toFun hS g : G)⁻¹ * g ∈ H :=
QuotientGroup.leftRel_apply.mp <| Quotient.exact' <| mk''_toEquiv _ _
-#align subgroup.mem_left_transversals.inv_to_fun_mul_mem
- Subgroup.MemLeftTransversals.inv_toFun_mul_mem
-#align add_subgroup.mem_left_transversals.neg_to_fun_add_mem
- AddSubgroup.MemLeftTransversals.neg_toFun_add_mem
+#align subgroup.mem_left_transversals.inv_to_fun_mul_mem Subgroup.MemLeftTransversals.inv_toFun_mul_mem
+#align add_subgroup.mem_left_transversals.neg_to_fun_add_mem AddSubgroup.MemLeftTransversals.neg_toFun_add_mem
@[to_additive]
theorem inv_mul_toFun_mem (hS : S ∈ Subgroup.leftTransversals (H : Set G)) (g : G) :
g⁻¹ * toFun hS g ∈ H :=
(congr_arg (· ∈ H) (by rw [mul_inv_rev, inv_inv])).mp (H.inv_mem (inv_toFun_mul_mem hS g))
-#align subgroup.mem_left_transversals.inv_mul_to_fun_mem
- Subgroup.MemLeftTransversals.inv_mul_toFun_mem
-#align add_subgroup.mem_left_transversals.neg_add_to_fun_mem
- AddSubgroup.MemLeftTransversals.neg_add_toFun_mem
+#align subgroup.mem_left_transversals.inv_mul_to_fun_mem Subgroup.MemLeftTransversals.inv_mul_toFun_mem
+#align add_subgroup.mem_left_transversals.neg_add_to_fun_mem AddSubgroup.MemLeftTransversals.neg_add_toFun_mem
end MemLeftTransversals
@@ -416,8 +400,7 @@ theorem mk''_toEquiv (hS : S ∈ Subgroup.rightTransversals (H : Set G))
(q : Quotient (QuotientGroup.rightRel H)) : Quotient.mk'' (toEquiv hS q : G) = q :=
(toEquiv hS).symm_apply_apply q
#align subgroup.mem_right_transversals.mk'_to_equiv Subgroup.MemRightTransversals.mk''_toEquiv
-#align add_subgroup.mem_right_transversals.mk'_to_equiv
- AddSubgroup.MemRightTransversals.mk''_toEquiv
+#align add_subgroup.mem_right_transversals.mk'_to_equiv AddSubgroup.MemRightTransversals.mk''_toEquiv
@[to_additive]
theorem toEquiv_apply {f : Quotient (QuotientGroup.rightRel H) → G}
@@ -426,8 +409,7 @@ theorem toEquiv_apply {f : Quotient (QuotientGroup.rightRel H) → G}
refine' (Subtype.ext_iff.mp _).trans (Subtype.coe_mk (f q) ⟨q, rfl⟩)
exact (toEquiv (range_mem_rightTransversals hf)).apply_eq_iff_eq_symm_apply.mpr (hf q).symm
#align subgroup.mem_right_transversals.to_equiv_apply Subgroup.MemRightTransversals.toEquiv_apply
-#align add_subgroup.mem_right_transversals.to_equiv_apply
- AddSubgroup.MemRightTransversals.toEquiv_apply
+#align add_subgroup.mem_right_transversals.to_equiv_apply AddSubgroup.MemRightTransversals.toEquiv_apply
/-- A right transversal can be viewed as a function mapping each element of the group
to the chosen representative from that right coset. -/
@@ -442,27 +424,21 @@ noncomputable def toFun (hS : S ∈ Subgroup.rightTransversals (H : Set G)) : G
theorem mul_inv_toFun_mem (hS : S ∈ Subgroup.rightTransversals (H : Set G)) (g : G) :
g * (toFun hS g : G)⁻¹ ∈ H :=
QuotientGroup.rightRel_apply.mp <| Quotient.exact' <| mk''_toEquiv _ _
-#align subgroup.mem_right_transversals.mul_inv_to_fun_mem
- Subgroup.MemRightTransversals.mul_inv_toFun_mem
-#align add_subgroup.mem_right_transversals.add_neg_to_fun_mem
- AddSubgroup.MemRightTransversals.add_neg_toFun_mem
+#align subgroup.mem_right_transversals.mul_inv_to_fun_mem Subgroup.MemRightTransversals.mul_inv_toFun_mem
+#align add_subgroup.mem_right_transversals.add_neg_to_fun_mem AddSubgroup.MemRightTransversals.add_neg_toFun_mem
@[to_additive]
theorem toFun_mul_inv_mem (hS : S ∈ Subgroup.rightTransversals (H : Set G)) (g : G) :
(toFun hS g : G) * g⁻¹ ∈ H :=
(congr_arg (· ∈ H) (by rw [mul_inv_rev, inv_inv])).mp (H.inv_mem (mul_inv_toFun_mem hS g))
-#align subgroup.mem_right_transversals.to_fun_mul_inv_mem
- Subgroup.MemRightTransversals.toFun_mul_inv_mem
-#align add_subgroup.mem_right_transversals.to_fun_add_neg_mem
- AddSubgroup.MemRightTransversals.toFun_add_neg_mem
+#align subgroup.mem_right_transversals.to_fun_mul_inv_mem Subgroup.MemRightTransversals.toFun_mul_inv_mem
+#align add_subgroup.mem_right_transversals.to_fun_add_neg_mem AddSubgroup.MemRightTransversals.toFun_add_neg_mem
end MemRightTransversals
section Action
-open Pointwise
-
-open MulAction MemLeftTransversals
+open Pointwise MulAction MemLeftTransversals
variable {F : Type _} [Group F] [MulAction F G] [QuotientAction F H]
@@ -549,38 +525,35 @@ theorem IsComplement'.card_mul [Fintype G] [Fintype H] [Fintype K] (h : IsComple
IsComplement.card_mul h
#align subgroup.is_complement'.card_mul Subgroup.IsComplement'.card_mul
-theorem IsComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
+theorem isComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
(h2 : ↑H * ↑K = (Set.univ : Set G)) : IsComplement' H K := by
refine' ⟨mul_injective_of_disjoint h1, fun g => _⟩
obtain ⟨h, k, hh, hk, hg⟩ := Set.eq_univ_iff_forall.mp h2 g
exact ⟨(⟨h, hh⟩, ⟨k, hk⟩), hg⟩
-#align subgroup.is_complement'_of_disjoint_and_mul_eq_univ
- Subgroup.IsComplement'_of_disjoint_and_mul_eq_univ
+#align subgroup.is_complement'_of_disjoint_and_mul_eq_univ Subgroup.isComplement'_of_disjoint_and_mul_eq_univ
-theorem IsComplement'_of_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K]
+theorem isComplement'_of_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G) (h2 : Disjoint H K) :
IsComplement' H K :=
(Fintype.bijective_iff_injective_and_card _).mpr
⟨mul_injective_of_disjoint h2, (Fintype.card_prod H K).trans h1⟩
-#align subgroup.is_complement'_of_card_mul_and_disjoint
- Subgroup.IsComplement'_of_card_mul_and_disjoint
+#align subgroup.is_complement'_of_card_mul_and_disjoint Subgroup.isComplement'_of_card_mul_and_disjoint
-theorem IsComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K] :
+theorem isComplement'_iff_card_mul_and_disjoint [Fintype G] [Fintype H] [Fintype K] :
IsComplement' H K ↔ Fintype.card H * Fintype.card K = Fintype.card G ∧ Disjoint H K :=
- ⟨fun h => ⟨h.card_mul, h.disjoint⟩, fun h => IsComplement'_of_card_mul_and_disjoint h.1 h.2⟩
-#align subgroup.is_complement'_iff_card_mul_and_disjoint
- Subgroup.IsComplement'_iff_card_mul_and_disjoint
+ ⟨fun h => ⟨h.card_mul, h.disjoint⟩, fun h => isComplement'_of_card_mul_and_disjoint h.1 h.2⟩
+#align subgroup.is_complement'_iff_card_mul_and_disjoint Subgroup.isComplement'_iff_card_mul_and_disjoint
-theorem IsComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
+theorem isComplement'_of_coprime [Fintype G] [Fintype H] [Fintype K]
(h1 : Fintype.card H * Fintype.card K = Fintype.card G)
(h2 : Nat.coprime (Fintype.card H) (Fintype.card K)) : IsComplement' H K :=
- IsComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
-#align subgroup.is_complement'_of_coprime Subgroup.IsComplement'_of_coprime
+ isComplement'_of_card_mul_and_disjoint h1 (disjoint_iff.mpr (inf_eq_bot_of_coprime h2))
+#align subgroup.is_complement'_of_coprime Subgroup.isComplement'_of_coprime
-theorem IsComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
+theorem isComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
(h1 : ∀ h : H, h • a = a → h = 1) (h2 : ∀ g : G, ∃ h : H, h • g • a = a) :
IsComplement' H (MulAction.stabilizer G a) := by
- refine' IsComplement_iff_existsUnique.mpr fun g => _
+ refine' isComplement_iff_existsUnique.mpr fun g => _
obtain ⟨h, hh⟩ := h2 g
have hh' : (↑h * g) • a = a := by rwa [mul_smul]
refine' ⟨⟨h⁻¹, h * g, hh'⟩, inv_mul_cancel_left ↑h g, _⟩
@@ -588,7 +561,7 @@ theorem IsComplement'_stabilizer {α : Type _} [MulAction G α] (a : α)
specialize h1 (h * h') (by rwa [mul_smul, smul_def h', ← hg, ← mul_smul, hg])
refine' Prod.ext (eq_inv_of_mul_eq_one_right h1) (Subtype.ext _)
rwa [Subtype.ext_iff, coe_one, coe_mul, ← self_eq_mul_left, mul_assoc (↑h) (↑h') g] at h1
-#align subgroup.is_complement'_stabilizer Subgroup.IsComplement'_stabilizer
+#align subgroup.is_complement'_stabilizer Subgroup.isComplement'_stabilizer
end Subgroup
@@ -601,40 +574,40 @@ universe u
variable {G : Type u} [Group G] (H : Subgroup G) (g : G)
/-- Partition `G ⧸ H` into orbits of the action of `g : G`. -/
-noncomputable def quotientEquivSigmaZmod :
+noncomputable def quotientEquivSigmaZMod :
G ⧸ H ≃ Σq : orbitRel.Quotient (zpowers g) (G ⧸ H), ZMod (minimalPeriod ((· • ·) g) q.out') :=
(selfEquivSigmaOrbits (zpowers g) (G ⧸ H)).trans
(sigmaCongrRight fun q => orbitZpowersEquiv g q.out')
-#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZmod
+#align subgroup.quotient_equiv_sigma_zmod Subgroup.quotientEquivSigmaZMod
-theorem quotientEquivSigmaZmod_symm_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
+theorem quotientEquivSigmaZMod_symm_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
- (quotientEquivSigmaZmod H g).symm ⟨q, k⟩ = g ^ (k : ℤ) • q.out' :=
+ (quotientEquivSigmaZMod H g).symm ⟨q, k⟩ = g ^ (k : ℤ) • q.out' :=
rfl
-#align subgroup.quotient_equiv_sigma_zmod_symm_apply Subgroup.quotientEquivSigmaZmod_symm_apply
+#align subgroup.quotient_equiv_sigma_zmod_symm_apply Subgroup.quotientEquivSigmaZMod_symm_apply
-theorem quotientEquivSigmaZmod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H)) (k : ℤ) :
- quotientEquivSigmaZmod H g (g ^ k • q.out') = ⟨q, k⟩ := by
- rw [apply_eq_iff_eq_symm_apply, quotientEquivSigmaZmod_symm_apply, ZMod.coe_int_cast,
+theorem quotientEquivSigmaZMod_apply (q : orbitRel.Quotient (zpowers g) (G ⧸ H)) (k : ℤ) :
+ quotientEquivSigmaZMod H g (g ^ k • q.out') = ⟨q, k⟩ := by
+ rw [apply_eq_iff_eq_symm_apply, quotientEquivSigmaZMod_symm_apply, ZMod.coe_int_cast,
zpow_smul_mod_minimalPeriod]
-#align subgroup.quotient_equiv_sigma_zmod_apply Subgroup.quotientEquivSigmaZmod_apply
+#align subgroup.quotient_equiv_sigma_zmod_apply Subgroup.quotientEquivSigmaZMod_apply
/-- The transfer transversal as a function. Given a `⟨g⟩`-orbit `q₀, g • q₀, ..., g ^ (m - 1) • q₀`
in `G ⧸ H`, an element `g ^ k • q₀` is mapped to `g ^ k • g₀` for a fixed choice of
representative `g₀` of `q₀`. -/
noncomputable def transferFunction : G ⧸ H → G := fun q =>
- g ^ ((quotientEquivSigmaZmod H g q).2 : ℤ) * (quotientEquivSigmaZmod H g q).1.out'.out'
+ g ^ ((quotientEquivSigmaZMod H g q).2 : ℤ) * (quotientEquivSigmaZMod H g q).1.out'.out'
#align subgroup.transfer_function Subgroup.transferFunction
theorem transferFunction_apply (q : G ⧸ H) :
transferFunction H g q =
- g ^ ((quotientEquivSigmaZmod H g q).2 : ℤ) * (quotientEquivSigmaZmod H g q).1.out'.out' :=
+ g ^ ((quotientEquivSigmaZMod H g q).2 : ℤ) * (quotientEquivSigmaZMod H g q).1.out'.out' :=
rfl
#align subgroup.transfer_function_apply Subgroup.transferFunction_apply
theorem coe_transferFunction (q : G ⧸ H) : ↑(transferFunction H g q) = q := by
rw [transferFunction_apply, ← smul_eq_mul, Quotient.coe_smul_out',
- ← quotientEquivSigmaZmod_symm_apply, Sigma.eta, symm_apply_apply]
+ ← quotientEquivSigmaZMod_symm_apply, Sigma.eta, symm_apply_apply]
#align subgroup.coe_transfer_function Subgroup.coe_transferFunction
/-- The transfer transversal as a set. Contains elements of the form `g ^ k • g₀` for fixed choices
@@ -661,7 +634,7 @@ theorem transferTransversal_apply (q : G ⧸ H) :
theorem transferTransversal_apply' (q : orbitRel.Quotient (zpowers g) (G ⧸ H))
(k : ZMod (minimalPeriod ((· • ·) g) q.out')) :
↑(toEquiv (transferTransversal H g).2 (g ^ (k : ℤ) • q.out')) = g ^ (k : ℤ) * q.out'.out' := by
- rw [transferTransversal_apply, transferFunction_apply, ← quotientEquivSigmaZmod_symm_apply,
+ rw [transferTransversal_apply, transferFunction_apply, ← quotientEquivSigmaZMod_symm_apply,
apply_symm_apply]
#align subgroup.transfer_transversal_apply' Subgroup.transferTransversal_apply'
@@ -671,7 +644,7 @@ theorem transferTransversal_apply'' (q : orbitRel.Quotient (zpowers g) (G ⧸ H)
if k = 0 then g ^ minimalPeriod ((· • ·) g) q.out' * q.out'.out'
else g ^ (k : ℤ) * q.out'.out' := by
rw [smul_apply_eq_smul_apply_inv_smul, transferTransversal_apply, transferFunction_apply, ←
- mul_smul, ← zpow_neg_one, ← zpow_add, quotientEquivSigmaZmod_apply, smul_eq_mul, ← mul_assoc,
+ mul_smul, ← zpow_neg_one, ← zpow_add, quotientEquivSigmaZMod_apply, smul_eq_mul, ← mul_assoc,
← zpow_one_add, Int.cast_add, Int.cast_neg, Int.cast_one, int_cast_cast, cast_id', id.def, ←
sub_eq_neg_add, cast_sub_one, add_sub_cancel'_right]
by_cases hk : k = 0
The unported dependencies are