group_theory.complementMathlib.GroupTheory.Complement

This file has been ported!

Changes since the initial port

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.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(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)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -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
 -/
Diff
@@ -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''
 -/
Diff
@@ -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
 -/
 
Diff
@@ -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''
 -/
Diff
@@ -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
 -/
Diff
@@ -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
 -/
Diff
@@ -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
 -/
 
Diff
@@ -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
 -/
Diff
@@ -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"
 
Diff
@@ -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
 -/
Diff
@@ -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
 -/
Diff
@@ -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
 
Diff
@@ -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
 
Diff
@@ -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
 
Diff
@@ -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
 
Diff
@@ -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
Diff
@@ -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')) :
Diff
@@ -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
 

Changes in mathlib4

mathlib3
mathlib4
chore: adapt to multiple goal linter 3 (#12372)

A PR analogous to #12338 and #12361: reformatting proofs following the multiple goals linter of #12339.

Diff
@@ -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) :
chore: Rename 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.

Diff
@@ -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]
chore: avoid id.def (adaptation for nightly-2024-03-27) (#11829)

Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com>

Diff
@@ -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]
chore: Rename 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 | |

Diff
@@ -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]
chore: Rename 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

Diff
@@ -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''
 
style: homogenise porting notes (#11145)

Homogenises porting notes via capitalisation and addition of whitespace.

It makes the following changes:

  • converts "--porting note" into "-- Porting note";
  • converts "porting note" into "Porting note".
Diff
@@ -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
fix: correct statement of 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.

Diff
@@ -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''
 
chore: prepare Lean version bump with explicit simp (#10999)

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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, ?_, ?_⟩
refactor(ZMod): remove coe out of ZMod (#9839)

Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Vierkantor <vierkantor@vierkantor.com>

Diff
@@ -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, ←
chore(*): replace $ with <| (#9319)

See Zulip thread for the discussion.

Diff
@@ -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))
refactor(*): change definition of Set.image2 etc (#9275)
  • Redefine Set.image2 to use ∃ a ∈ s, ∃ b ∈ t, f a b = c instead of ∃ a b, a ∈ s ∧ b ∈ t ∧ f a b = c.
  • Redefine Set.seq as Set.image2. The new definition is equal to the old one but rw [Set.seq] gives a different result.
  • Redefine Filter.map₂ to use ∃ u ∈ f, ∃ v ∈ g, image2 m u v ⊆ s instead of ∃ u v, u ∈ f ∧ v ∈ g ∧ ...
  • Update lemmas like Set.mem_image2, Finset.mem_image₂, Set.mem_mul, Finset.mem_div etc

The two reasons to make the change are:

  • ∃ a ∈ s, ∃ b ∈ t, _ is a simp-normal form, and
  • it looks a bit nicer.
Diff
@@ -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
 
chore: Nsmul -> NSMul, Zpow -> ZPow, etc (#9067)

Normalising to naming convention rule number 6.

Diff
@@ -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))
feat: Existence of tranversals of a subgroup (#8932)

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

Diff
@@ -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` -/
refactor: Remove 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.

Diff
@@ -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) :=
chore: Replace (· op ·) a by (a op ·) (#8843)

I used the regex \(\(· (.) ·\) (.)\), replacing with ($2 $1 ·).

Diff
@@ -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,
chore: space after (#8178)

Co-authored-by: Moritz Firsching <firsching@google.com>

Diff
@@ -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
Revert "chore: revert #7703 (#7710)"

This reverts commit f3695eb2.

Diff
@@ -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 :=
chore: revert #7703 (#7710)

This reverts commit 26eb2b0a.

Diff
@@ -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 :=
chore: bump toolchain to v4.2.0-rc2 (#7703)

This includes all the changes from #7606.

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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 :=
chore: bump to v4.1.0-rc1 (2nd attempt) (#7216)

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
 
Revert "chore: bump to v4.1.0-rc1 (#7174)" (#7198)

This reverts commit 6f8e8104. Unfortunately this bump was not linted correctly, as CI did not run runLinter Mathlib.

We can unrevert once that's fixed.

Diff
@@ -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
 
chore: bump to v4.1.0-rc1 (#7174)

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>

Diff
@@ -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
 
feat(GroupTheory/Complement): the equivalence and some corresponding lemmas (#6899)

Co-authored-by: Chris Hughes <33847686+ChrisHughes24@users.noreply.github.com>

Diff
@@ -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. -/
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -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 => _
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
 
chore: clean up spacing around 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
Diff
@@ -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))
chore: tidy various files (#4854)
Diff
@@ -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
feat: port GroupTheory.Complement (#4349)

Co-authored-by: qawbecrdtey <qawbecrdtey@naver.com>

Dependencies 8 + 503

504 files ported (98.4%)
207745 lines ported (98.5%)
Show graph

The unported dependencies are