Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+πŸ–±οΈto focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2020 Yury Kudryashov. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov

! This file was ported from Lean 3 source module algebra.hom.iterate
! leanprover-community/mathlib commit 792a2a264169d64986541c6f8f7e3bbb6acb6295
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.GroupPower.Lemmas
import Mathlib.GroupTheory.GroupAction.Opposite

/-!
# Iterates of monoid and ring homomorphisms

Iterate of a monoid/ring homomorphism is a monoid/ring homomorphism but it has a wrong type, so Lean
can't apply lemmas like `MonoidHom.map_one` to `f^[n] 1`. Though it is possible to define
a monoid structure on the endomorphisms, quite often we do not want to convert from
`M β†’* M` to `Monoid.End M` and from `f^[n]` to `f^n` just to apply a simple lemma.

So, we restate standard `*Hom.map_*` lemmas under names `*Hom.iterate_map_*`.

We also prove formulas for iterates of add/mul left/right.

## Tags

homomorphism, iterate
-/


open Function

variable {
M: Type ?u.46544
M
:
Type _: Type (?u.2+1)
Type _
} {
N: Type ?u.17
N
:
Type _: Type (?u.17+1)
Type _
} {
G: Type ?u.34788
G
:
Type _: Type (?u.8+1)
Type _
} {
H: Type ?u.32619
H
:
Type _: Type (?u.51637+1)
Type _
} /-- An auxiliary lemma that can be used to prove `⇑(f ^ n) = (⇑f^[n])`. -/ theorem
hom_coe_pow: βˆ€ {F : Type u_1} [inst : Monoid F] (c : F β†’ M β†’ M), c 1 = id β†’ (βˆ€ (f g : F), c (f * g) = c f ∘ c g) β†’ βˆ€ (f : F) (n : β„•), c (f ^ n) = c f^[n]
hom_coe_pow
{
F: Type ?u.26
F
:
Type _: Type (?u.26+1)
Type _
} [
Monoid: Type ?u.29 β†’ Type ?u.29
Monoid
F: Type ?u.26
F
] (
c: F β†’ M β†’ M
c
:
F: Type ?u.26
F
β†’
M: Type ?u.14
M
β†’
M: Type ?u.14
M
) (
h1: c 1 = id
h1
:
c: F β†’ M β†’ M
c
1: ?m.40
1
=
id: {Ξ± : Sort ?u.370} β†’ Ξ± β†’ Ξ±
id
) (
hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g
hmul
: βˆ€
f: ?m.413
f
g: ?m.416
g
,
c: F β†’ M β†’ M
c
(
f: ?m.413
f
*
g: ?m.416
g
) =
c: F β†’ M β†’ M
c
f: ?m.413
f
∘
c: F β†’ M β†’ M
c
g: ?m.416
g
) (
f: F
f
:
F: Type ?u.26
F
) : βˆ€
n: ?m.1010
n
,
c: F β†’ M β†’ M
c
(
f: F
f
^
n: ?m.1010
n
) =
c: F β†’ M β†’ M
c
f: F
f
^[
n: ?m.1010
n
] | 0 =>

Goals accomplished! πŸ™
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F


c (f ^ 0) = c f^[0]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F


c (f ^ 0) = c f^[0]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F


c 1 = c f^[0]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F


c (f ^ 0) = c f^[0]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F


id = c f^[0]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F


id = c f^[0]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F


c (f ^ 0) = c f^[0]

Goals accomplished! πŸ™
| n + 1 =>

Goals accomplished! πŸ™
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c (f ^ (n + 1)) = c f^[n + 1]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c (f ^ (n + 1)) = c f^[n + 1]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c (f * f ^ n) = c f^[n + 1]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c (f ^ (n + 1)) = c f^[n + 1]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c (f * f ^ n) = c f ∘ c f^[n]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c (f ^ (n + 1)) = c f^[n + 1]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c f ∘ c (f ^ n) = c f ∘ c f^[n]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c (f ^ (n + 1)) = c f^[n + 1]
M: Type u_2

N: Type ?u.17

G: Type ?u.20

H: Type ?u.23

F: Type u_1

inst✝: Monoid F

c: F β†’ M β†’ M

h1: c 1 = id

hmul: βˆ€ (f g : F), c (f * g) = c f ∘ c g

f: F

n: β„•


c f ∘ c f^[n] = c f ∘ c f^[n]

Goals accomplished! πŸ™
#align hom_coe_pow
hom_coe_pow: βˆ€ {M : Type u_2} {F : Type u_1} [inst : Monoid F] (c : F β†’ M β†’ M), c 1 = id β†’ (βˆ€ (f g : F), c (f * g) = c f ∘ c g) β†’ βˆ€ (f : F) (n : β„•), c (f ^ n) = c f^[n]
hom_coe_pow
namespace MonoidHom section variable [
MulOneClass: Type ?u.2631 β†’ Type ?u.2631
MulOneClass
M: Type ?u.1575
M
] [
MulOneClass: Type ?u.1590 β†’ Type ?u.1590
MulOneClass
N: Type ?u.1578
N
] @[
to_additive: βˆ€ {M : Type u_1} [inst : AddZeroClass M] (f : M β†’+ M) (n : β„•), (↑f^[n]) 0 = 0
to_additive
(attr := simp)] theorem
iterate_map_one: βˆ€ {M : Type u_1} [inst : MulOneClass M] (f : M β†’* M) (n : β„•), (↑f^[n]) 1 = 1
iterate_map_one
(
f: M β†’* M
f
:
M: Type ?u.1593
M
β†’*
M: Type ?u.1593
M
) (n :
β„•: Type
β„•
) : (
f: M β†’* M
f
^[n])
1: ?m.2020
1
=
1: ?m.2482
1
:=
iterate_fixed: βˆ€ {Ξ± : Type ?u.2501} {f : Ξ± β†’ Ξ±} {x : Ξ±}, f x = x β†’ βˆ€ (n : β„•), (f^[n]) x = x
iterate_fixed
f: M β†’* M
f
.
map_one: βˆ€ {M : Type ?u.2505} {N : Type ?u.2506} [inst : MulOneClass M] [inst_1 : MulOneClass N] (f : M β†’* N), ↑f 1 = 1
map_one
n #align monoid_hom.iterate_map_one
MonoidHom.iterate_map_one: βˆ€ {M : Type u_1} [inst : MulOneClass M] (f : M β†’* M) (n : β„•), (↑f^[n]) 1 = 1
MonoidHom.iterate_map_one
#align add_monoid_hom.iterate_map_zero
AddMonoidHom.iterate_map_zero: βˆ€ {M : Type u_1} [inst : AddZeroClass M] (f : M β†’+ M) (n : β„•), (↑f^[n]) 0 = 0
AddMonoidHom.iterate_map_zero
@[
to_additive: βˆ€ {M : Type u_1} [inst : AddZeroClass M] (f : M β†’+ M) (n : β„•) (x y : M), (↑f^[n]) (x + y) = (↑f^[n]) x + (↑f^[n]) y
to_additive
(attr := simp)] theorem
iterate_map_mul: βˆ€ (f : M β†’* M) (n : β„•) (x y : M), (↑f^[n]) (x * y) = (↑f^[n]) x * (↑f^[n]) y
iterate_map_mul
(
f: M β†’* M
f
:
M: Type ?u.2619
M
β†’*
M: Type ?u.2619
M
) (n :
β„•: Type
β„•
) (
x: M
x
y: M
y
) : (
f: M β†’* M
f
^[n]) (
x: ?m.2650
x
*
y: ?m.2653
y
) = (
f: M β†’* M
f
^[n])
x: ?m.2650
x
* (
f: M β†’* M
f
^[n])
y: ?m.2653
y
:=
Semiconjβ‚‚.iterate: βˆ€ {Ξ± : Type ?u.4657} {f : Ξ± β†’ Ξ±} {op : Ξ± β†’ Ξ± β†’ Ξ±}, Semiconjβ‚‚ f op op β†’ βˆ€ (n : β„•), Semiconjβ‚‚ (f^[n]) op op
Semiconjβ‚‚.iterate
f: M β†’* M
f
.
map_mul: βˆ€ {M : Type ?u.4661} {N : Type ?u.4662} [inst : MulOneClass M] [inst_1 : MulOneClass N] (f : M β†’* N) (a b : M), ↑f (a * b) = ↑f a * ↑f b
map_mul
n
x: M
x
y: M
y
#align monoid_hom.iterate_map_mul
MonoidHom.iterate_map_mul: βˆ€ {M : Type u_1} [inst : MulOneClass M] (f : M β†’* M) (n : β„•) (x y : M), (↑f^[n]) (x * y) = (↑f^[n]) x * (↑f^[n]) y
MonoidHom.iterate_map_mul
#align add_monoid_hom.iterate_map_add
AddMonoidHom.iterate_map_add: βˆ€ {M : Type u_1} [inst : AddZeroClass M] (f : M β†’+ M) (n : β„•) (x y : M), (↑f^[n]) (x + y) = (↑f^[n]) x + (↑f^[n]) y
AddMonoidHom.iterate_map_add
end variable [
Monoid: Type ?u.7992 β†’ Type ?u.7992
Monoid
M: Type ?u.4835
M
] [
Monoid: Type ?u.6192 β†’ Type ?u.6192
Monoid
N: Type ?u.4838
N
] [
Group: Type ?u.4829 β†’ Type ?u.4829
Group
G: Type ?u.4841
G
] [
Group: Type ?u.4832 β†’ Type ?u.4832
Group
H: Type ?u.7989
H
] @[
to_additive: βˆ€ {G : Type u_1} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (x : G), (↑f^[n]) (-x) = -(↑f^[n]) x
to_additive
(attr := simp)] theorem
iterate_map_inv: βˆ€ (f : G β†’* G) (n : β„•) (x : G), (↑f^[n]) x⁻¹ = ((↑f^[n]) x)⁻¹
iterate_map_inv
(
f: G β†’* G
f
:
G: Type ?u.4841
G
β†’*
G: Type ?u.4841
G
) (n :
β„•: Type
β„•
) (
x: G
x
) : (
f: G β†’* G
f
^[n])
x: ?m.5113
x
⁻¹ = ((
f: G β†’* G
f
^[n])
x: ?m.5113
x
)⁻¹ :=
Commute.iterate_left: βˆ€ {Ξ± : Type ?u.6001} {f g : Ξ± β†’ Ξ±}, Function.Commute f g β†’ βˆ€ (n : β„•), Function.Commute (f^[n]) g
Commute.iterate_left
f: G β†’* G
f
.
map_inv: βˆ€ {Ξ± : Type ?u.6005} {Ξ² : Type ?u.6006} [inst : Group Ξ±] [inst_1 : DivisionMonoid Ξ²] (f : Ξ± β†’* Ξ²) (a : Ξ±), ↑f a⁻¹ = (↑f a)⁻¹
map_inv
n
x: G
x
#align monoid_hom.iterate_map_inv
MonoidHom.iterate_map_inv: βˆ€ {G : Type u_1} [inst : Group G] (f : G β†’* G) (n : β„•) (x : G), (↑f^[n]) x⁻¹ = ((↑f^[n]) x)⁻¹
MonoidHom.iterate_map_inv
#align add_monoid_hom.iterate_map_neg
AddMonoidHom.iterate_map_neg: βˆ€ {G : Type u_1} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (x : G), (↑f^[n]) (-x) = -(↑f^[n]) x
AddMonoidHom.iterate_map_neg
@[
to_additive: βˆ€ {G : Type u_1} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (x y : G), (↑f^[n]) (x - y) = (↑f^[n]) x - (↑f^[n]) y
to_additive
(attr := simp)] theorem
iterate_map_div: βˆ€ (f : G β†’* G) (n : β„•) (x y : G), (↑f^[n]) (x / y) = (↑f^[n]) x / (↑f^[n]) y
iterate_map_div
(
f: G β†’* G
f
:
G: Type ?u.6183
G
β†’*
G: Type ?u.6183
G
) (n :
β„•: Type
β„•
) (
x: G
x
y: G
y
) : (
f: G β†’* G
f
^[n]) (
x: ?m.6455
x
/
y: ?m.6458
y
) = (
f: G β†’* G
f
^[n])
x: ?m.6455
x
/ (
f: G β†’* G
f
^[n])
y: ?m.6458
y
:=
Semiconjβ‚‚.iterate: βˆ€ {Ξ± : Type ?u.7779} {f : Ξ± β†’ Ξ±} {op : Ξ± β†’ Ξ± β†’ Ξ±}, Semiconjβ‚‚ f op op β†’ βˆ€ (n : β„•), Semiconjβ‚‚ (f^[n]) op op
Semiconjβ‚‚.iterate
f: G β†’* G
f
.
map_div: βˆ€ {Ξ± : Type ?u.7783} {Ξ² : Type ?u.7784} [inst : Group Ξ±] [inst_1 : DivisionMonoid Ξ²] (f : Ξ± β†’* Ξ²) (g h : Ξ±), ↑f (g / h) = ↑f g / ↑f h
map_div
n
x: G
x
y: G
y
#align monoid_hom.iterate_map_div
MonoidHom.iterate_map_div: βˆ€ {G : Type u_1} [inst : Group G] (f : G β†’* G) (n : β„•) (x y : G), (↑f^[n]) (x / y) = (↑f^[n]) x / (↑f^[n]) y
MonoidHom.iterate_map_div
#align add_monoid_hom.iterate_map_sub
AddMonoidHom.iterate_map_sub: βˆ€ {G : Type u_1} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (x y : G), (↑f^[n]) (x - y) = (↑f^[n]) x - (↑f^[n]) y
AddMonoidHom.iterate_map_sub
theorem
iterate_map_pow: βˆ€ (f : M β†’* M) (n : β„•) (a : M) (m : β„•), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
iterate_map_pow
(
f: M β†’* M
f
:
M: Type ?u.7980
M
β†’*
M: Type ?u.7980
M
) (n :
β„•: Type
β„•
) (
a: M
a
) (m :
β„•: Type
β„•
) : (
f: M β†’* M
f
^[n]) (
a: ?m.8241
a
^ m) = (
f: M β†’* M
f
^[n])
a: ?m.8241
a
^ m :=
Commute.iterate_left: βˆ€ {Ξ± : Type ?u.14012} {f g : Ξ± β†’ Ξ±}, Function.Commute f g β†’ βˆ€ (n : β„•), Function.Commute (f^[n]) g
Commute.iterate_left
(fun
x: ?m.14017
x
=>
f: M β†’* M
f
.
map_pow: βˆ€ {M : Type ?u.14019} {N : Type ?u.14020} [inst : Monoid M] [inst_1 : Monoid N] (f : M β†’* N) (a : M) (n : β„•), ↑f (a ^ n) = ↑f a ^ n
map_pow
x: ?m.14017
x
m) n
a: M
a
#align monoid_hom.iterate_map_pow
MonoidHom.iterate_map_pow: βˆ€ {M : Type u_1} [inst : Monoid M] (f : M β†’* M) (n : β„•) (a : M) (m : β„•), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
MonoidHom.iterate_map_pow
theorem
iterate_map_zpow: βˆ€ (f : G β†’* G) (n : β„•) (a : G) (m : β„€), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
iterate_map_zpow
(
f: G β†’* G
f
:
G: Type ?u.14072
G
β†’*
G: Type ?u.14072
G
) (n :
β„•: Type
β„•
) (
a: ?m.14344
a
) (m :
β„€: Type
β„€
) : (
f: G β†’* G
f
^[n]) (
a: ?m.14344
a
^ m) = (
f: G β†’* G
f
^[n])
a: ?m.14344
a
^ m :=
Commute.iterate_left: βˆ€ {Ξ± : Type ?u.20274} {f g : Ξ± β†’ Ξ±}, Function.Commute f g β†’ βˆ€ (n : β„•), Function.Commute (f^[n]) g
Commute.iterate_left
(fun
x: ?m.20279
x
=>
f: G β†’* G
f
.
map_zpow: βˆ€ {Ξ± : Type ?u.20281} {Ξ² : Type ?u.20282} [inst : Group Ξ±] [inst_1 : DivisionMonoid Ξ²] (f : Ξ± β†’* Ξ²) (g : Ξ±) (n : β„€), ↑f (g ^ n) = ↑f g ^ n
map_zpow
x: ?m.20279
x
m) n
a: G
a
#align monoid_hom.iterate_map_zpow
MonoidHom.iterate_map_zpow: βˆ€ {G : Type u_1} [inst : Group G] (f : G β†’* G) (n : β„•) (a : G) (m : β„€), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
MonoidHom.iterate_map_zpow
theorem
coe_pow: βˆ€ {M : Type u_1} [inst : CommMonoid M] (f : Monoid.End M) (n : β„•), ↑(f ^ n) = ↑f^[n]
coe_pow
{
M: Type u_1
M
} [
CommMonoid: Type ?u.20403 β†’ Type ?u.20403
CommMonoid
M: ?m.20400
M
] (f :
Monoid.End: (M : Type ?u.20406) β†’ [inst : MulOneClass M] β†’ Type ?u.20406
Monoid.End
M: ?m.20400
M
) (n :
β„•: Type
β„•
) : ⇑(f ^ n) = f^[n] :=
hom_coe_pow: βˆ€ {M : Type ?u.25127} {F : Type ?u.25126} [inst : Monoid F] (c : F β†’ M β†’ M), c 1 = _root_.id β†’ (βˆ€ (f g : F), c (f * g) = c f ∘ c g) β†’ βˆ€ (f : F) (n : β„•), c (f ^ n) = c f^[n]
hom_coe_pow
_: ?m.25129 β†’ ?m.25128 β†’ ?m.25128
_
rfl: βˆ€ {Ξ± : Sort ?u.25132} {a : Ξ±}, a = a
rfl
(fun
_: ?m.25542
_
_: ?m.25545
_
=>
rfl: βˆ€ {Ξ± : Sort ?u.25547} {a : Ξ±}, a = a
rfl
)
_: ?m.25129
_
_ #align monoid_hom.coe_pow
MonoidHom.coe_pow: βˆ€ {M : Type u_1} [inst : CommMonoid M] (f : Monoid.End M) (n : β„•), ↑(f ^ n) = ↑f^[n]
MonoidHom.coe_pow
end MonoidHom theorem
Monoid.End.coe_pow: βˆ€ {M : Type u_1} [inst : Monoid M] (f : Monoid.End M) (n : β„•), ↑(f ^ n) = ↑f^[n]
Monoid.End.coe_pow
{
M: ?m.25658
M
} [
Monoid: Type ?u.25661 β†’ Type ?u.25661
Monoid
M: ?m.25658
M
] (f :
Monoid.End: (M : Type ?u.25664) β†’ [inst : MulOneClass M] β†’ Type ?u.25664
Monoid.End
M: ?m.25658
M
) (n :
β„•: Type
β„•
) : ⇑(f ^ n) = f^[n] :=
hom_coe_pow: βˆ€ {M : Type ?u.30268} {F : Type ?u.30267} [inst : Monoid F] (c : F β†’ M β†’ M), c 1 = id β†’ (βˆ€ (f g : F), c (f * g) = c f ∘ c g) β†’ βˆ€ (f : F) (n : β„•), c (f ^ n) = c f^[n]
hom_coe_pow
_: ?m.30270 β†’ ?m.30269 β†’ ?m.30269
_
rfl: βˆ€ {Ξ± : Sort ?u.30273} {a : Ξ±}, a = a
rfl
(fun
_: ?m.30683
_
_: ?m.30686
_
=>
rfl: βˆ€ {Ξ± : Sort ?u.30688} {a : Ξ±}, a = a
rfl
)
_: ?m.30270
_
_ #align monoid.End.coe_pow
Monoid.End.coe_pow: βˆ€ {M : Type u_1} [inst : Monoid M] (f : Monoid.End M) (n : β„•), ↑(f ^ n) = ↑f^[n]
Monoid.End.coe_pow
-- we define these manually so that we can pick a better argument order namespace AddMonoidHom variable [
AddMonoid: Type ?u.32622 β†’ Type ?u.32622
AddMonoid
M: Type ?u.30805
M
] [
AddGroup: Type ?u.32625 β†’ Type ?u.32625
AddGroup
G: Type ?u.30793
G
] theorem
iterate_map_smul: βˆ€ (f : M β†’+ M) (n m : β„•) (x : M), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
iterate_map_smul
(
f: M β†’+ M
f
:
M: Type ?u.30805
M
β†’+
M: Type ?u.30805
M
) (n m :
β„•: Type
β„•
) (
x: M
x
:
M: Type ?u.30805
M
) : (
f: M β†’+ M
f
^[n]) (m β€’
x: M
x
) = m β€’ (
f: M β†’+ M
f
^[n])
x: M
x
:=
f: M β†’+ M
f
.
toMultiplicative: {Ξ± : Type ?u.32368} β†’ {Ξ² : Type ?u.32367} β†’ [inst : AddZeroClass Ξ±] β†’ [inst_1 : AddZeroClass Ξ²] β†’ (Ξ± β†’+ Ξ²) ≃ (Multiplicative Ξ± β†’* Multiplicative Ξ²)
toMultiplicative
.
iterate_map_pow: βˆ€ {M : Type ?u.32501} [inst : Monoid M] (f : M β†’* M) (n : β„•) (a : M) (m : β„•), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
iterate_map_pow
n
x: M
x
m #align add_monoid_hom.iterate_map_smul
AddMonoidHom.iterate_map_smul: βˆ€ {M : Type u_1} [inst : AddMonoid M] (f : M β†’+ M) (n m : β„•) (x : M), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
AddMonoidHom.iterate_map_smul
attribute [
to_additive: βˆ€ {M : Type u_1} [inst : AddMonoid M] (f : M β†’+ M) (n m : β„•) (a : M), (↑f^[n]) (m β€’ a) = m β€’ (↑f^[n]) a
to_additive
(reorder := 5 6)]
MonoidHom.iterate_map_pow: βˆ€ {M : Type u_1} [inst : Monoid M] (f : M β†’* M) (n : β„•) (a : M) (m : β„•), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
MonoidHom.iterate_map_pow
#align add_monoid_hom.iterate_map_nsmul
AddMonoidHom.iterate_map_nsmul: βˆ€ {M : Type u_1} [inst : AddMonoid M] (f : M β†’+ M) (n m : β„•) (a : M), (↑f^[n]) (m β€’ a) = m β€’ (↑f^[n]) a
AddMonoidHom.iterate_map_nsmul
theorem
iterate_map_zsmul: βˆ€ (f : G β†’+ G) (n : β„•) (m : β„€) (x : G), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
iterate_map_zsmul
(
f: G β†’+ G
f
:
G: Type ?u.32616
G
β†’+
G: Type ?u.32616
G
) (n :
β„•: Type
β„•
) (m :
β„€: Type
β„€
) (
x: G
x
:
G: Type ?u.32616
G
) : (
f: G β†’+ G
f
^[n]) (m β€’
x: G
x
) = m β€’ (
f: G β†’+ G
f
^[n])
x: G
x
:=
f: G β†’+ G
f
.
toMultiplicative: {Ξ± : Type ?u.34381} β†’ {Ξ² : Type ?u.34380} β†’ [inst : AddZeroClass Ξ±] β†’ [inst_1 : AddZeroClass Ξ²] β†’ (Ξ± β†’+ Ξ²) ≃ (Multiplicative Ξ± β†’* Multiplicative Ξ²)
toMultiplicative
.
iterate_map_zpow: βˆ€ {G : Type ?u.34712} [inst : Group G] (f : G β†’* G) (n : β„•) (a : G) (m : β„€), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
iterate_map_zpow
n
x: G
x
m #align add_monoid_hom.iterate_map_zsmul
AddMonoidHom.iterate_map_zsmul: βˆ€ {G : Type u_1} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (m : β„€) (x : G), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
AddMonoidHom.iterate_map_zsmul
attribute [
to_additive: βˆ€ {G : Type u_1} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (m : β„€) (x : G), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
to_additive
existing (reorder := 5 6)]
MonoidHom.iterate_map_zpow: βˆ€ {G : Type u_1} [inst : Group G] (f : G β†’* G) (n : β„•) (a : G) (m : β„€), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
MonoidHom.iterate_map_zpow
end AddMonoidHom theorem
AddMonoid.End.coe_pow: βˆ€ {A : Type u_1} [inst : AddMonoid A] (f : AddMonoid.End A) (n : β„•), ↑(f ^ n) = ↑f^[n]
AddMonoid.End.coe_pow
{
A: Type u_1
A
} [
AddMonoid: Type ?u.34797 β†’ Type ?u.34797
AddMonoid
A: ?m.34794
A
] (f :
AddMonoid.End: (A : Type ?u.34800) β†’ [inst : AddZeroClass A] β†’ Type ?u.34800
AddMonoid.End
A: ?m.34794
A
) (n :
β„•: Type
β„•
) : ⇑(f ^ n) = f^[n] :=
hom_coe_pow: βˆ€ {M : Type ?u.39873} {F : Type ?u.39872} [inst : Monoid F] (c : F β†’ M β†’ M), c 1 = id β†’ (βˆ€ (f g : F), c (f * g) = c f ∘ c g) β†’ βˆ€ (f : F) (n : β„•), c (f ^ n) = c f^[n]
hom_coe_pow
_: ?m.39875 β†’ ?m.39874 β†’ ?m.39874
_
rfl: βˆ€ {Ξ± : Sort ?u.39878} {a : Ξ±}, a = a
rfl
(fun
_: ?m.40288
_
_: ?m.40291
_
=>
rfl: βˆ€ {Ξ± : Sort ?u.40293} {a : Ξ±}, a = a
rfl
)
_: ?m.39875
_
_ #align add_monoid.End.coe_pow
AddMonoid.End.coe_pow: βˆ€ {A : Type u_1} [inst : AddMonoid A] (f : AddMonoid.End A) (n : β„•), ↑(f ^ n) = ↑f^[n]
AddMonoid.End.coe_pow
namespace RingHom section Semiring variable {
R: Type ?u.45356
R
:
Type _: Type (?u.40406+1)
Type _
} [
Semiring: Type ?u.40409 β†’ Type ?u.40409
Semiring
R: Type ?u.40451
R
] (
f: R β†’+* R
f
:
R: Type ?u.40406
R
β†’+*
R: Type ?u.45356
R
) (n :
β„•: Type
β„•
) (
x: R
x
y: R
y
:
R: Type ?u.40406
R
) theorem
coe_pow: βˆ€ {R : Type u_1} [inst : Semiring R] (f : R β†’+* R) (n : β„•), ↑(f ^ n) = ↑f^[n]
coe_pow
(n :
β„•: Type
β„•
) : ⇑(
f: R β†’+* R
f
^ n) =
f: R β†’+* R
f
^[n] :=
hom_coe_pow: βˆ€ {M : Type ?u.44849} {F : Type ?u.44848} [inst : Monoid F] (c : F β†’ M β†’ M), c 1 = _root_.id β†’ (βˆ€ (f g : F), c (f * g) = c f ∘ c g) β†’ βˆ€ (f : F) (n : β„•), c (f ^ n) = c f^[n]
hom_coe_pow
_: ?m.44851 β†’ ?m.44850 β†’ ?m.44850
_
rfl: βˆ€ {Ξ± : Sort ?u.44854} {a : Ξ±}, a = a
rfl
(fun
_: ?m.45264
_
_: ?m.45267
_
=>
rfl: βˆ€ {Ξ± : Sort ?u.45269} {a : Ξ±}, a = a
rfl
)
f: R β†’+* R
f
n #align ring_hom.coe_pow
RingHom.coe_pow: βˆ€ {R : Type u_1} [inst : Semiring R] (f : R β†’+* R) (n : β„•), ↑(f ^ n) = ↑f^[n]
RingHom.coe_pow
theorem
iterate_map_one: (↑f^[n]) 1 = 1
iterate_map_one
: (
f: R β†’+* R
f
^[n])
1: ?m.45728
1
=
1: ?m.45765
1
:=
f: R β†’+* R
f
.
toMonoidHom: {Ξ± : Type ?u.45783} β†’ {Ξ² : Type ?u.45782} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’* Ξ²
toMonoidHom
.
iterate_map_one: βˆ€ {M : Type ?u.45807} [inst : MulOneClass M] (f : M β†’* M) (n : β„•), (↑f^[n]) 1 = 1
iterate_map_one
n #align ring_hom.iterate_map_one
RingHom.iterate_map_one: βˆ€ {R : Type u_1} [inst : Semiring R] (f : R β†’+* R) (n : β„•), (↑f^[n]) 1 = 1
RingHom.iterate_map_one
theorem
iterate_map_zero: (↑f^[n]) 0 = 0
iterate_map_zero
: (
f: R β†’+* R
f
^[n])
0: ?m.46237
0
=
0: ?m.46369
0
:=
f: R β†’+* R
f
.
toAddMonoidHom: {Ξ± : Type ?u.46387} β†’ {Ξ² : Type ?u.46386} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’+ Ξ²
toAddMonoidHom
.
iterate_map_zero: βˆ€ {M : Type ?u.46411} [inst : AddZeroClass M] (f : M β†’+ M) (n : β„•), (↑f^[n]) 0 = 0
iterate_map_zero
n #align ring_hom.iterate_map_zero
RingHom.iterate_map_zero: βˆ€ {R : Type u_1} [inst : Semiring R] (f : R β†’+* R) (n : β„•), (↑f^[n]) 0 = 0
RingHom.iterate_map_zero
theorem
iterate_map_add: (↑f^[n]) (x + y) = (↑f^[n]) x + (↑f^[n]) y
iterate_map_add
: (
f: R β†’+* R
f
^[n]) (
x: R
x
+
y: R
y
) = (
f: R β†’+* R
f
^[n])
x: R
x
+ (
f: R β†’+* R
f
^[n])
y: R
y
:=
f: R β†’+* R
f
.
toAddMonoidHom: {Ξ± : Type ?u.47887} β†’ {Ξ² : Type ?u.47886} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’+ Ξ²
toAddMonoidHom
.
iterate_map_add: βˆ€ {M : Type ?u.47911} [inst : AddZeroClass M] (f : M β†’+ M) (n : β„•) (x y : M), (↑f^[n]) (x + y) = (↑f^[n]) x + (↑f^[n]) y
iterate_map_add
n
x: R
x
y: R
y
#align ring_hom.iterate_map_add
RingHom.iterate_map_add: βˆ€ {R : Type u_1} [inst : Semiring R] (f : R β†’+* R) (n : β„•) (x y : R), (↑f^[n]) (x + y) = (↑f^[n]) x + (↑f^[n]) y
RingHom.iterate_map_add
theorem
iterate_map_mul: (↑f^[n]) (x * y) = (↑f^[n]) x * (↑f^[n]) y
iterate_map_mul
: (
f: R β†’+* R
f
^[n]) (
x: R
x
*
y: R
y
) = (
f: R β†’+* R
f
^[n])
x: R
x
* (
f: R β†’+* R
f
^[n])
y: R
y
:=
f: R β†’+* R
f
.
toMonoidHom: {Ξ± : Type ?u.49407} β†’ {Ξ² : Type ?u.49406} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’* Ξ²
toMonoidHom
.
iterate_map_mul: βˆ€ {M : Type ?u.49431} [inst : MulOneClass M] (f : M β†’* M) (n : β„•) (x y : M), (↑f^[n]) (x * y) = (↑f^[n]) x * (↑f^[n]) y
iterate_map_mul
n
x: R
x
y: R
y
#align ring_hom.iterate_map_mul
RingHom.iterate_map_mul: βˆ€ {R : Type u_1} [inst : Semiring R] (f : R β†’+* R) (n : β„•) (x y : R), (↑f^[n]) (x * y) = (↑f^[n]) x * (↑f^[n]) y
RingHom.iterate_map_mul
theorem
iterate_map_pow: βˆ€ (a : R) (n m : β„•), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
iterate_map_pow
(
a: ?m.49530
a
) (n m :
β„•: Type
β„•
) : (
f: R β†’+* R
f
^[n]) (
a: ?m.49530
a
^ m) = (
f: R β†’+* R
f
^[n])
a: ?m.49530
a
^ m :=
f: R β†’+* R
f
.
toMonoidHom: {Ξ± : Type ?u.50418} β†’ {Ξ² : Type ?u.50417} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’* Ξ²
toMonoidHom
.
iterate_map_pow: βˆ€ {M : Type ?u.50442} [inst : Monoid M] (f : M β†’* M) (n : β„•) (a : M) (m : β„•), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
iterate_map_pow
n
a: R
a
m #align ring_hom.iterate_map_pow
RingHom.iterate_map_pow: βˆ€ {R : Type u_1} [inst : Semiring R] (f : R β†’+* R) (a : R) (n m : β„•), (↑f^[n]) (a ^ m) = (↑f^[n]) a ^ m
RingHom.iterate_map_pow
theorem
iterate_map_smul: βˆ€ (n m : β„•) (x : R), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
iterate_map_smul
(n m :
β„•: Type
β„•
) (
x: R
x
:
R: Type ?u.50517
R
) : (
f: R β†’+* R
f
^[n]) (m β€’
x: R
x
) = m β€’ (
f: R β†’+* R
f
^[n])
x: R
x
:=
f: R β†’+* R
f
.
toAddMonoidHom: {Ξ± : Type ?u.51468} β†’ {Ξ² : Type ?u.51467} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’+ Ξ²
toAddMonoidHom
.
iterate_map_smul: βˆ€ {M : Type ?u.51492} [inst : AddMonoid M] (f : M β†’+ M) (n m : β„•) (x : M), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
iterate_map_smul
n m
x: R
x
#align ring_hom.iterate_map_smul
RingHom.iterate_map_smul: βˆ€ {R : Type u_1} [inst : Semiring R] (f : R β†’+* R) (n m : β„•) (x : R), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
RingHom.iterate_map_smul
end Semiring variable {
R: Type ?u.51640
R
:
Type _: Type (?u.53234+1)
Type _
} [
Ring: Type ?u.53237 β†’ Type ?u.53237
Ring
R: Type ?u.51805
R
] (
f: R β†’+* R
f
:
R: Type ?u.51640
R
β†’+*
R: Type ?u.51640
R
) (n :
β„•: Type
β„•
) (
x: R
x
y: R
y
:
R: Type ?u.51640
R
) theorem
iterate_map_sub: (↑f^[n]) (x - y) = (↑f^[n]) x - (↑f^[n]) y
iterate_map_sub
: (
f: R β†’+* R
f
^[n]) (
x: R
x
-
y: R
y
) = (
f: R β†’+* R
f
^[n])
x: R
x
- (
f: R β†’+* R
f
^[n])
y: R
y
:=
f: R β†’+* R
f
.
toAddMonoidHom: {Ξ± : Type ?u.53029} β†’ {Ξ² : Type ?u.53028} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’+ Ξ²
toAddMonoidHom
.
iterate_map_sub: βˆ€ {G : Type ?u.53173} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (x y : G), (↑f^[n]) (x - y) = (↑f^[n]) x - (↑f^[n]) y
iterate_map_sub
n
x: R
x
y: R
y
#align ring_hom.iterate_map_sub
RingHom.iterate_map_sub: βˆ€ {R : Type u_1} [inst : Ring R] (f : R β†’+* R) (n : β„•) (x y : R), (↑f^[n]) (x - y) = (↑f^[n]) x - (↑f^[n]) y
RingHom.iterate_map_sub
theorem
iterate_map_neg: βˆ€ {R : Type u_1} [inst : Ring R] (f : R β†’+* R) (n : β„•) (x : R), (↑f^[n]) (-x) = -(↑f^[n]) x
iterate_map_neg
: (
f: R β†’+* R
f
^[n]) (-
x: R
x
) = -(
f: R β†’+* R
f
^[n])
x: R
x
:=
f: R β†’+* R
f
.
toAddMonoidHom: {Ξ± : Type ?u.54072} β†’ {Ξ² : Type ?u.54071} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’+ Ξ²
toAddMonoidHom
.
iterate_map_neg: βˆ€ {G : Type ?u.54216} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (x : G), (↑f^[n]) (-x) = -(↑f^[n]) x
iterate_map_neg
n
x: R
x
#align ring_hom.iterate_map_neg
RingHom.iterate_map_neg: βˆ€ {R : Type u_1} [inst : Ring R] (f : R β†’+* R) (n : β„•) (x : R), (↑f^[n]) (-x) = -(↑f^[n]) x
RingHom.iterate_map_neg
theorem
iterate_map_zsmul: βˆ€ (n : β„•) (m : β„€) (x : R), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
iterate_map_zsmul
(n :
β„•: Type
β„•
) (m :
β„€: Type
β„€
) (
x: R
x
:
R: Type ?u.54273
R
) : (
f: R β†’+* R
f
^[n]) (m β€’
x: R
x
) = m β€’ (
f: R β†’+* R
f
^[n])
x: R
x
:=
f: R β†’+* R
f
.
toAddMonoidHom: {Ξ± : Type ?u.55207} β†’ {Ξ² : Type ?u.55206} β†’ [inst : NonAssocSemiring Ξ±] β†’ [inst_1 : NonAssocSemiring Ξ²] β†’ (Ξ± β†’+* Ξ²) β†’ Ξ± β†’+ Ξ²
toAddMonoidHom
.
iterate_map_zsmul: βˆ€ {G : Type ?u.55351} [inst : AddGroup G] (f : G β†’+ G) (n : β„•) (m : β„€) (x : G), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
iterate_map_zsmul
n m
x: R
x
#align ring_hom.iterate_map_zsmul
RingHom.iterate_map_zsmul: βˆ€ {R : Type u_1} [inst : Ring R] (f : R β†’+* R) (n : β„•) (m : β„€) (x : R), (↑f^[n]) (m β€’ x) = m β€’ (↑f^[n]) x
RingHom.iterate_map_zsmul
end RingHom --what should be the namespace for this section? section Monoid variable [
Monoid: Type ?u.59884 β†’ Type ?u.59884
Monoid
G: Type ?u.55404
G
] (
a: G
a
:
G: Type ?u.55423
G
) (n :
β„•: Type
β„•
) @[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : AddMonoid G] (a : G) (n : β„•) [inst_1 : AddAction G H], (fun x => a +α΅₯ x)^[n] = fun x => n β€’ a +α΅₯ x
to_additive
(attr := simp)] theorem
smul_iterate: βˆ€ [inst : MulAction G H], (fun x => a β€’ x)^[n] = fun x => a ^ n β€’ x
smul_iterate
[
MulAction: (Ξ± : Type ?u.55437) β†’ Type ?u.55436 β†’ [inst : Monoid Ξ±] β†’ Type (max?u.55437?u.55436)
MulAction
G: Type ?u.55423
G
H: Type ?u.55426
H
] : (
a: G
a
β€’ Β· :
H: Type ?u.55426
H
β†’
H: Type ?u.55426
H
)^[n] = (
a: G
a
^ n β€’ Β·) :=
funext: βˆ€ {Ξ± : Sort ?u.59360} {Ξ² : Ξ± β†’ Sort ?u.59359} {f g : (x : Ξ±) β†’ Ξ² x}, (βˆ€ (x : Ξ±), f x = g x) β†’ f = g
funext
fun
b: ?m.59375
b
=>
Nat.recOn: βˆ€ {motive : β„• β†’ Sort ?u.59377} (t : β„•), motive Nat.zero β†’ (βˆ€ (n : β„•), motive n β†’ motive (Nat.succ n)) β†’ motive t
Nat.recOn
n (

Goals accomplished! πŸ™
M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


b = 1 β€’ b
M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n: β„•

inst✝: MulAction G H

b: H


b = b

Goals accomplished! πŸ™
) fun
n: ?m.59406
n
ih: ?m.59409
ih
=>

Goals accomplished! πŸ™
M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


((fun x => a β€’ x) ∘ (fun x => a β€’ x)^[n]) b = a ^ Nat.succ n β€’ b
M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


a β€’ a ^ n β€’ b = (a * a ^ n) β€’ b
M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


M: Type ?u.55417

N: Type ?u.55420

G: Type u_1

H: Type u_2

inst✝¹: Monoid G

a: G

n✝: β„•

inst✝: MulAction G H

b: H

n: β„•

ih: ((fun x => a β€’ x)^[n]) b = a ^ n β€’ b


a β€’ a ^ n β€’ b = a β€’ a ^ n β€’ b

Goals accomplished! πŸ™
#align smul_iterate
smul_iterate: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Monoid G] (a : G) (n : β„•) [inst_1 : MulAction G H], (fun x => a β€’ x)^[n] = fun x => a ^ n β€’ x
smul_iterate
#align vadd_iterate
vadd_iterate: βˆ€ {G : Type u_1} {H : Type u_2} [inst : AddMonoid G] (a : G) (n : β„•) [inst_1 : AddAction G H], (fun x => a +α΅₯ x)^[n] = fun x => n β€’ a +α΅₯ x
vadd_iterate
@[
to_additive: βˆ€ {G : Type u_1} [inst : AddMonoid G] (a : G) (n : β„•), (fun x => a + x)^[n] = fun x => n β€’ a + x
to_additive
(attr := simp)] theorem
mul_left_iterate: (fun x => a * x)^[n] = fun x => a ^ n * x
mul_left_iterate
: (
a: G
a
* Β·)^[n] = (
a: G
a
^ n * Β·) :=
smul_iterate: βˆ€ {G : Type ?u.63109} {H : Type ?u.63110} [inst : Monoid G] (a : G) (n : β„•) [inst_1 : MulAction G H], (fun x => a β€’ x)^[n] = fun x => a ^ n β€’ x
smul_iterate
a: G
a
n #align mul_left_iterate
mul_left_iterate: βˆ€ {G : Type u_1} [inst : Monoid G] (a : G) (n : β„•), (fun x => a * x)^[n] = fun x => a ^ n * x
mul_left_iterate
#align add_left_iterate
add_left_iterate: βˆ€ {G : Type u_1} [inst : AddMonoid G] (a : G) (n : β„•), (fun x => a + x)^[n] = fun x => n β€’ a + x
add_left_iterate
@[
to_additive: βˆ€ {G : Type u_1} [inst : AddMonoid G] (a : G) (n : β„•), (fun x => x + a)^[n] = fun x => x + n β€’ a
to_additive
(attr := simp)] theorem
mul_right_iterate: (fun x => x * a)^[n] = fun x => x * a ^ n
mul_right_iterate
: (Β· *
a: G
a
)^[n] = (Β· *
a: G
a
^ n) :=
smul_iterate: βˆ€ {G : Type ?u.67134} {H : Type ?u.67135} [inst : Monoid G] (a : G) (n : β„•) [inst_1 : MulAction G H], (fun x => a β€’ x)^[n] = fun x => a ^ n β€’ x
smul_iterate
(
MulOpposite.op: {Ξ± : Type ?u.67139} β†’ Ξ± β†’ αᡐᡒᡖ
MulOpposite.op
a: G
a
) n #align mul_right_iterate
mul_right_iterate: βˆ€ {G : Type u_1} [inst : Monoid G] (a : G) (n : β„•), (fun x => x * a)^[n] = fun x => x * a ^ n
mul_right_iterate
#align add_right_iterate
add_right_iterate: βˆ€ {G : Type u_1} [inst : AddMonoid G] (a : G) (n : β„•), (fun x => x + a)^[n] = fun x => x + n β€’ a
add_right_iterate
@[
to_additive: βˆ€ {G : Type u_1} [inst : AddMonoid G] (a : G) (n : β„•), ((fun x => x + a)^[n]) 0 = n β€’ a
to_additive
] theorem
mul_right_iterate_apply_one: ((fun x => x * a)^[n]) 1 = a ^ n
mul_right_iterate_apply_one
: ((Β· *
a: G
a
)^[n])
1: ?m.67892
1
=
a: G
a
^ n :=

Goals accomplished! πŸ™
M: Type ?u.67258

N: Type ?u.67261

G: Type u_1

H: Type ?u.67267

inst✝: Monoid G

a: G

n: β„•


((fun x => x * a)^[n]) 1 = a ^ n

Goals accomplished! πŸ™
#align mul_right_iterate_apply_one
mul_right_iterate_apply_one: βˆ€ {G : Type u_1} [inst : Monoid G] (a : G) (n : β„•), ((fun x => x * a)^[n]) 1 = a ^ n
mul_right_iterate_apply_one
#align add_right_iterate_apply_zero
add_right_iterate_apply_zero: βˆ€ {G : Type u_1} [inst : AddMonoid G] (a : G) (n : β„•), ((fun x => x + a)^[n]) 0 = n β€’ a
add_right_iterate_apply_zero
@[
to_additive: βˆ€ {G : Type u_1} [inst : AddMonoid G] (n j : β„•), (fun x => n β€’ x)^[j] = fun x => n ^ j β€’ x
to_additive
(attr := simp)] theorem
pow_iterate: βˆ€ (n j : β„•), (fun x => x ^ n)^[j] = fun x => x ^ n ^ j
pow_iterate
(n :
β„•: Type
β„•
) (j :
β„•: Type
β„•
) : (fun
x: G
x
:
G: Type ?u.71290
G
=>
x: G
x
^ n)^[j] = fun
x: G
x
:
G: Type ?u.71290
G
=>
x: G
x
^ n ^ j := letI :
MulAction: (Ξ± : Type ?u.76351) β†’ Type ?u.76350 β†’ [inst : Monoid Ξ±] β†’ Type (max?u.76351?u.76350)
MulAction
β„•: Type
β„•
G: Type ?u.71290
G
:= { smul := fun
n: ?m.76376
n
g: ?m.76379
g
=>
g: ?m.76379
g
^
n: ?m.76376
n
one_smul :=
pow_one: βˆ€ {M : Type ?u.78906} [inst : Monoid M] (a : M), a ^ 1 = a
pow_one
mul_smul := fun
m: ?m.78952
m
n: ?m.78955
n
g: ?m.78958
g
=>
pow_mul': βˆ€ {M : Type ?u.78960} [inst : Monoid M] (a : M) (m n : β„•), a ^ (m * n) = (a ^ n) ^ m
pow_mul'
g: ?m.78958
g
m: ?m.78952
m
n: ?m.78955
n
}
smul_iterate: βˆ€ {G : Type ?u.78970} {H : Type ?u.78971} [inst : Monoid G] (a : G) (n : β„•) [inst_1 : MulAction G H], (fun x => a β€’ x)^[n] = fun x => a ^ n β€’ x
smul_iterate
n j #align pow_iterate
pow_iterate: βˆ€ {G : Type u_1} [inst : Monoid G] (n j : β„•), (fun x => x ^ n)^[j] = fun x => x ^ n ^ j
pow_iterate
#align nsmul_iterate
nsmul_iterate: βˆ€ {G : Type u_1} [inst : AddMonoid G] (n j : β„•), (fun x => n β€’ x)^[j] = fun x => n ^ j β€’ x
nsmul_iterate
end Monoid section Group variable [
Group: Type ?u.79093 β†’ Type ?u.79093
Group
G: Type ?u.79087
G
] @[
to_additive: βˆ€ {G : Type u_1} [inst : AddGroup G] (n : β„€) (j : β„•), (fun x => n β€’ x)^[j] = fun x => n ^ j β€’ x
to_additive
(attr := simp)] theorem
zpow_iterate: βˆ€ (n : β„€) (j : β„•), (fun x => x ^ n)^[j] = fun x => x ^ n ^ j
zpow_iterate
(n :
β„€: Type
β„€
) (j :
β„•: Type
β„•
) : (fun
x: G
x
:
G: Type ?u.79102
G
=>
x: G
x
^ n)^[j] = fun
x: ?m.81762
x
=>
x: ?m.81762
x
^ n ^ j := letI :
MulAction: (Ξ± : Type ?u.82077) β†’ Type ?u.82076 β†’ [inst : Monoid Ξ±] β†’ Type (max?u.82077?u.82076)
MulAction
β„€: Type
β„€
G: Type ?u.79102
G
:= { smul := fun
n: ?m.82101
n
g: ?m.82104
g
=>
g: ?m.82104
g
^
n: ?m.82101
n
one_smul :=
zpow_one: βˆ€ {G : Type ?u.84696} [inst : DivInvMonoid G] (a : G), a ^ 1 = a
zpow_one
mul_smul := fun
m: ?m.84749
m
n: ?m.84752
n
g: ?m.84755
g
=>
zpow_mul': βˆ€ {Ξ± : Type ?u.84757} [inst : DivisionMonoid Ξ±] (a : Ξ±) (m n : β„€), a ^ (m * n) = (a ^ n) ^ m
zpow_mul'
g: ?m.84755
g
m: ?m.84749
m
n: ?m.84752
n
}
smul_iterate: βˆ€ {G : Type ?u.84806} {H : Type ?u.84807} [inst : Monoid G] (a : G) (n : β„•) [inst_1 : MulAction G H], (fun x => a β€’ x)^[n] = fun x => a ^ n β€’ x
smul_iterate
n j #align zpow_iterate
zpow_iterate: βˆ€ {G : Type u_1} [inst : Group G] (n : β„€) (j : β„•), (fun x => x ^ n)^[j] = fun x => x ^ n ^ j
zpow_iterate
#align zsmul_iterate
zsmul_iterate: βˆ€ {G : Type u_1} [inst : AddGroup G] (n : β„€) (j : β„•), (fun x => n β€’ x)^[j] = fun x => n ^ j β€’ x
zsmul_iterate
end Group section Semigroup variable [
Semigroup: Type ?u.89663 β†’ Type ?u.89663
Semigroup
G: Type ?u.87808
G
] {
a: G
a
b: G
b
c: G
c
:
G: Type ?u.84944
G
} -- Porting note: need `dsimp only`, see https://leanprover.zulipchat.com/#narrow/stream/ -- 287929-mathlib4/topic/dsimp.20before.20rw/near/317063489 @[
to_additive: βˆ€ {G : Type u_1} [inst : AddSemigroup G] {a b c : G}, AddSemiconjBy a b c β†’ Semiconj (fun x => a + x) (fun x => b + x) fun x => c + x
to_additive
] theorem
SemiconjBy.function_semiconj_mul_left: βˆ€ {G : Type u_1} [inst : Semigroup G] {a b c : G}, SemiconjBy a b c β†’ Semiconj (fun x => a * x) (fun x => b * x) fun x => c * x
SemiconjBy.function_semiconj_mul_left
(
h: SemiconjBy a b c
h
:
SemiconjBy: {M : Type ?u.84959} β†’ [inst : Mul M] β†’ M β†’ M β†’ M β†’ Prop
SemiconjBy
a: G
a
b: G
b
c: G
c
) :
Function.Semiconj: {Ξ± : Type ?u.85486} β†’ {Ξ² : Type ?u.85485} β†’ (Ξ± β†’ Ξ²) β†’ (Ξ± β†’ Ξ±) β†’ (Ξ² β†’ Ξ²) β†’ Prop
Function.Semiconj
(
a: G
a
* Β·) (
b: G
b
* Β·) (
c: G
c
* Β·) := fun
j: ?m.87126
j
=>

Goals accomplished! πŸ™
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


(fun x => a * x) ((fun x => b * x) j) = (fun x => c * x) ((fun x => a * x) j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


a * (b * j) = c * (a * j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


a * (b * j) = c * (a * j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


(fun x => a * x) ((fun x => b * x) j) = (fun x => c * x) ((fun x => a * x) j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


a * (b * j) = c * (a * j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


a * b * j = c * (a * j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


a * (b * j) = c * (a * j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


c * a * j = c * (a * j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


a * (b * j) = c * (a * j)
M: Type ?u.84938

N: Type ?u.84941

G: Type u_1

H: Type ?u.84947

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


c * (a * j) = c * (a * j)

Goals accomplished! πŸ™
#align semiconj_by.function_semiconj_mul_left
SemiconjBy.function_semiconj_mul_left: βˆ€ {G : Type u_1} [inst : Semigroup G] {a b c : G}, SemiconjBy a b c β†’ Semiconj (fun x => a * x) (fun x => b * x) fun x => c * x
SemiconjBy.function_semiconj_mul_left
#align add_semiconj_by.function_semiconj_add_left
AddSemiconjBy.function_semiconj_add_left: βˆ€ {G : Type u_1} [inst : AddSemigroup G] {a b c : G}, AddSemiconjBy a b c β†’ Semiconj (fun x => a + x) (fun x => b + x) fun x => c + x
AddSemiconjBy.function_semiconj_add_left
@[
to_additive: βˆ€ {G : Type u_1} [inst : AddSemigroup G] {a b : G}, AddCommute a b β†’ Function.Commute (fun x => a + x) fun x => b + x
to_additive
] theorem
Commute.function_commute_mul_left: βˆ€ {G : Type u_1} [inst : Semigroup G] {a b : G}, _root_.Commute a b β†’ Function.Commute (fun x => a * x) fun x => b * x
Commute.function_commute_mul_left
(h :
_root_.Commute: {S : Type ?u.87823} β†’ [inst : Mul S] β†’ S β†’ S β†’ Prop
_root_.Commute
a: G
a
b: G
b
) :
Function.Commute: {Ξ± : Type ?u.88349} β†’ (Ξ± β†’ Ξ±) β†’ (Ξ± β†’ Ξ±) β†’ Prop
Function.Commute
(
a: G
a
* Β·) (
b: G
b
* Β·) :=
SemiconjBy.function_semiconj_mul_left: βˆ€ {G : Type ?u.89575} [inst : Semigroup G] {a b c : G}, SemiconjBy a b c β†’ Semiconj (fun x => a * x) (fun x => b * x) fun x => c * x
SemiconjBy.function_semiconj_mul_left
h #align commute.function_commute_mul_left
Commute.function_commute_mul_left: βˆ€ {G : Type u_1} [inst : Semigroup G] {a b : G}, _root_.Commute a b β†’ Function.Commute (fun x => a * x) fun x => b * x
Commute.function_commute_mul_left
#align add_commute.function_commute_add_left
AddCommute.function_commute_add_left: βˆ€ {G : Type u_1} [inst : AddSemigroup G] {a b : G}, AddCommute a b β†’ Function.Commute (fun x => a + x) fun x => b + x
AddCommute.function_commute_add_left
@[
to_additive: βˆ€ {G : Type u_1} [inst : AddSemigroup G] {a b c : G}, AddSemiconjBy a b c β†’ Semiconj (fun x => x + a) (fun x => x + c) fun x => x + b
to_additive
] theorem
SemiconjBy.function_semiconj_mul_right_swap: SemiconjBy a b c β†’ Semiconj (fun x => x * a) (fun x => x * c) fun x => x * b
SemiconjBy.function_semiconj_mul_right_swap
(
h: SemiconjBy a b c
h
:
SemiconjBy: {M : Type ?u.89672} β†’ [inst : Mul M] β†’ M β†’ M β†’ M β†’ Prop
SemiconjBy
a: G
a
b: G
b
c: G
c
) :
Function.Semiconj: {Ξ± : Type ?u.90199} β†’ {Ξ² : Type ?u.90198} β†’ (Ξ± β†’ Ξ²) β†’ (Ξ± β†’ Ξ±) β†’ (Ξ² β†’ Ξ²) β†’ Prop
Function.Semiconj
(Β· *
a: G
a
) (Β· *
c: G
c
) (Β· *
b: G
b
) := fun
j: ?m.91839
j
=>

Goals accomplished! πŸ™
M: Type ?u.89651

N: Type ?u.89654

G: Type u_1

H: Type ?u.89660

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


(fun x => x * a) ((fun x => x * c) j) = (fun x => x * b) ((fun x => x * a) j)
M: Type ?u.89651

N: Type ?u.89654

G: Type u_1

H: Type ?u.89660

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


j * c * a = j * a * b
M: Type ?u.89651

N: Type ?u.89654

G: Type u_1

H: Type ?u.89660

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


j * (c * a) = j * (a * b)
M: Type ?u.89651

N: Type ?u.89654

G: Type u_1

H: Type ?u.89660

inst✝: Semigroup G

a, b, c: G

h: SemiconjBy a b c

j: G


(fun x => x * a) ((fun x => x * c) j) = (fun x => x * b) ((fun x => x * a) j)

Goals accomplished! πŸ™

Goals accomplished! πŸ™
#align semiconj_by.function_semiconj_mul_right_swap
SemiconjBy.function_semiconj_mul_right_swap: βˆ€ {G : Type u_1} [inst : Semigroup G] {a b c : G}, SemiconjBy a b c β†’ Semiconj (fun x => x * a) (fun x => x * c) fun x => x * b
SemiconjBy.function_semiconj_mul_right_swap
#align add_semiconj_by.function_semiconj_add_right_swap
AddSemiconjBy.function_semiconj_add_right_swap: βˆ€ {G : Type u_1} [inst : AddSemigroup G] {a b c : G}, AddSemiconjBy a b c β†’ Semiconj (fun x => x + a) (fun x => x + c) fun x => x + b
AddSemiconjBy.function_semiconj_add_right_swap
@[
to_additive: βˆ€ {G : Type u_1} [inst : AddSemigroup G] {a b : G}, AddCommute a b β†’ Function.Commute (fun x => x + a) fun x => x + b
to_additive
] theorem
Commute.function_commute_mul_right: βˆ€ {G : Type u_1} [inst : Semigroup G] {a b : G}, _root_.Commute a b β†’ Function.Commute (fun x => x * a) fun x => x * b
Commute.function_commute_mul_right
(h :
_root_.Commute: {S : Type ?u.92576} β†’ [inst : Mul S] β†’ S β†’ S β†’ Prop
_root_.Commute
a: G
a
b: G
b
) :
Function.Commute: {Ξ± : Type ?u.93102} β†’ (Ξ± β†’ Ξ±) β†’ (Ξ± β†’ Ξ±) β†’ Prop
Function.Commute
(Β· *
a: G
a
) (Β· *
b: G
b
) :=
SemiconjBy.function_semiconj_mul_right_swap: βˆ€ {G : Type ?u.94328} [inst : Semigroup G] {a b c : G}, SemiconjBy a b c β†’ Semiconj (fun x => x * a) (fun x => x * c) fun x => x * b
SemiconjBy.function_semiconj_mul_right_swap
h #align commute.function_commute_mul_right
Commute.function_commute_mul_right: βˆ€ {G : Type u_1} [inst : Semigroup G] {a b : G}, _root_.Commute a b β†’ Function.Commute (fun x => x * a) fun x => x * b
Commute.function_commute_mul_right
#align add_commute.function_commute_add_right
AddCommute.function_commute_add_right: βˆ€ {G : Type u_1} [inst : AddSemigroup G] {a b : G}, AddCommute a b β†’ Function.Commute (fun x => x + a) fun x => x + b
AddCommute.function_commute_add_right
end Semigroup