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) 2015 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jeremy Avigad, Robert Y. Lewis

! This file was ported from Lean 3 source module algebra.group_power.basic
! leanprover-community/mathlib commit 9b2660e1b25419042c8da10bf411aa3c67f14383
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Divisibility.Basic
import Mathlib.Algebra.Group.Commute
import Mathlib.Algebra.Group.TypeTags

/-!
# Power operations on monoids and groups

The power operation on monoids and groups.
We separate this from group, because it depends on `ℕ`,
which in turn depends on other parts of algebra.

This module contains lemmas about `a ^ n` and `n • a`, where `n : ℕ` or `n : ℤ`.
Further lemmas can be found in `Algebra.GroupPower.Lemmas`.

The analogous results for groups with zero can be found in `Algebra.GroupWithZero.Power`.

## Notation

- `a ^ n` is used as notation for `Pow.pow a n`; in this file `n : ℕ` or `n : ℤ`.
- `n • a` is used as notation for `SMul.smul n a`; in this file `n : ℕ` or `n : ℤ`.

## Implementation details

We adopt the convention that `0^0 = 1`.
-/

universe u v w x y z u₁ u₂

variable {
α: Type ?u.2
α
:
Type _: Type (?u.21+1)
Type _
} {
M: Type u
M
:
Type u: Type (u+1)
Type u
} {
N: Type v
N
:
Type v: Type (v+1)
Type v
} {
G: Type w
G
:
Type w: Type (w+1)
Type w
} {
H: Type x
H
:
Type x: Type (x+1)
Type x
} {
A: Type y
A
:
Type y: Type (y+1)
Type y
} {
B: Type z
B
:
Type z: Type (z+1)
Type z
} {
R: Type u₁
R
:
Type u₁: Type (u₁+1)
Type u₁
} {
S: Type u₂
S
:
Type u₂: Type (u₂+1)
Type u₂
} /-! ### Commutativity First we prove some facts about `SemiconjBy` and `Commute`. They do not require any theory about `pow` and/or `nsmul` and will be useful later in this file. -/ section Pow variable [
Pow: Type ?u.4449 → Type ?u.4448 → Type (max?u.4449?u.4448)
Pow
M: Type u
M
: Type
] @[simp] theorem
pow_ite: ∀ {M : Type u} [inst : Pow M ] (P : Prop) [inst_1 : Decidable P] (a : M) (b c : ), (a ^ if P then b else c) = if P then a ^ b else a ^ c
pow_ite
(
P: Prop
P
:
Prop: Type
Prop
) [
Decidable: PropType
Decidable
P: Prop
P
] (
a: M
a
:
M: Type u
M
) (
b:
b
c:
c
:
: Type
) : (
a: M
a
^ if
P: Prop
P
then
b:
b
else
c:
c
) = if
P: Prop
P
then
a: M
a
^
b:
b
else
a: M
a
^
c:
c
:=

Goals accomplished! 🐙
α: Type ?u.44

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a: M

b, c:


(a ^ if P then b else c) = if P then a ^ b else a ^ c
α: Type ?u.44

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a: M

b, c:

h✝: P


inl
a ^ b = a ^ b
α: Type ?u.44

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a: M

b, c:

h✝: ¬P


inr
a ^ c = a ^ c
α: Type ?u.44

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a: M

b, c:


(a ^ if P then b else c) = if P then a ^ b else a ^ c
α: Type ?u.44

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a: M

b, c:

h✝: P


inl
a ^ b = a ^ b
α: Type ?u.44

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a: M

b, c:

h✝: ¬P


inr
a ^ c = a ^ c
α: Type ?u.44

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a: M

b, c:


(a ^ if P then b else c) = if P then a ^ b else a ^ c

Goals accomplished! 🐙
#align pow_ite
pow_ite: ∀ {M : Type u} [inst : Pow M ] (P : Prop) [inst_1 : Decidable P] (a : M) (b c : ), (a ^ if P then b else c) = if P then a ^ b else a ^ c
pow_ite
@[simp] theorem
ite_pow: ∀ {M : Type u} [inst : Pow M ] (P : Prop) [inst_1 : Decidable P] (a b : M) (c : ), (if P then a else b) ^ c = if P then a ^ c else b ^ c
ite_pow
(
P: Prop
P
:
Prop: Type
Prop
) [
Decidable: PropType
Decidable
P: Prop
P
] (
a: M
a
b: M
b
:
M: Type u
M
) (
c:
c
:
: Type
) : (if
P: Prop
P
then
a: M
a
else
b: M
b
) ^
c:
c
= if
P: Prop
P
then
a: M
a
^
c:
c
else
b: M
b
^
c:
c
:=

Goals accomplished! 🐙
α: Type ?u.4429

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a, b: M

c:


(if P then a else b) ^ c = if P then a ^ c else b ^ c
α: Type ?u.4429

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a, b: M

c:

h✝: P


inl
a ^ c = a ^ c
α: Type ?u.4429

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a, b: M

c:

h✝: ¬P


inr
b ^ c = b ^ c
α: Type ?u.4429

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a, b: M

c:


(if P then a else b) ^ c = if P then a ^ c else b ^ c
α: Type ?u.4429

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a, b: M

c:

h✝: P


inl
a ^ c = a ^ c
α: Type ?u.4429

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a, b: M

c:

h✝: ¬P


inr
b ^ c = b ^ c
α: Type ?u.4429

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Pow M

P: Prop

inst✝: Decidable P

a, b: M

c:


(if P then a else b) ^ c = if P then a ^ c else b ^ c

Goals accomplished! 🐙
#align ite_pow
ite_pow: ∀ {M : Type u} [inst : Pow M ] (P : Prop) [inst_1 : Decidable P] (a b : M) (c : ), (if P then a else b) ^ c = if P then a ^ c else b ^ c
ite_pow
end Pow /-! ### Monoids -/ section Monoid variable [
Monoid: Type ?u.12784 → Type ?u.12784
Monoid
M: Type u
M
] [
AddMonoid: Type ?u.8659 → Type ?u.8659
AddMonoid
A: Type y
A
] theorem
nsmul_zero: ∀ {A : Type y} [inst : AddMonoid A] (n : ), n 0 = 0
nsmul_zero
(
n:
n
:
: Type
) :
n:
n
• (
0: ?m.8700
0
:
A: Type y
A
) =
0: ?m.8880
0
:=

Goals accomplished! 🐙
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:


n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A


zero
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
Nat.succ n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:


n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A


zero
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A


zero
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
Nat.succ n 0 = 0

Goals accomplished! 🐙
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:


n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
Nat.succ n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
Nat.succ n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
Nat.succ n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
0 + n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
Nat.succ n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
0 + 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
Nat.succ n 0 = 0
α: Type ?u.8662

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: n 0 = 0


succ
0 = 0

Goals accomplished! 🐙
#align nsmul_zero
nsmul_zero: ∀ {A : Type y} [inst : AddMonoid A] (n : ), n 0 = 0
nsmul_zero
@[simp] theorem
one_nsmul: ∀ {A : Type y} [inst : AddMonoid A] (a : A), 1 a = a
one_nsmul
(
a: A
a
:
A: Type y
A
) :
1: ?m.9086
1
a: A
a
=
a: A
a
:=

Goals accomplished! 🐙
α: Type ?u.9049

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A


1 a = a
α: Type ?u.9049

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A


1 a = a
α: Type ?u.9049

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A


a + 0 a = a
α: Type ?u.9049

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A


1 a = a
α: Type ?u.9049

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A


a + 0 = a
α: Type ?u.9049

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A


1 a = a
α: Type ?u.9049

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A


a = a

Goals accomplished! 🐙
#align one_nsmul
one_nsmul: ∀ {A : Type y} [inst : AddMonoid A] (a : A), 1 a = a
one_nsmul
theorem
add_nsmul: ∀ (a : A) (m n : ), (m + n) a = m a + n a
add_nsmul
(
a: A
a
:
A: Type y
A
) (
m:
m
n:
n
:
: Type
) : (
m:
m
+
n:
n
) •
a: A
a
=
m:
m
a: A
a
+
n:
n
a: A
a
:=

Goals accomplished! 🐙
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

m, n:


(m + n) a = m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

m, n:


(m + n) a = m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n:


zero
(Nat.zero + n) a = Nat.zero a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n:


zero
(Nat.zero + n) a = Nat.zero a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n:


zero
n a = Nat.zero a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n:


zero
(Nat.zero + n) a = Nat.zero a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n:


zero
n a = 0 + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n:


zero
(Nat.zero + n) a = Nat.zero a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n:


zero
n a = n a

Goals accomplished! 🐙
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

m, n:


(m + n) a = m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
(Nat.succ m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
(Nat.succ m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
Nat.succ (m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
(Nat.succ m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
(m + n + 1) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
(Nat.succ m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
a + (m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
(Nat.succ m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
a + (m a + n a) = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
(Nat.succ m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
a + (m a + n a) = a + m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
(Nat.succ m + n) a = Nat.succ m a + n a
α: Type ?u.9319

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: A

n, m:

ih: (m + n) a = m a + n a


succ
a + (m a + n a) = a + (m a + n a)

Goals accomplished! 🐙
#align add_nsmul
add_nsmul: ∀ {A : Type y} [inst : AddMonoid A] (a : A) (m n : ), (m + n) a = m a + n a
add_nsmul
-- the attributes are intentionally out of order. @[to_additive existing
nsmul_zero: ∀ {A : Type y} [inst : AddMonoid A] (n : ), n 0 = 0
nsmul_zero
, simp] theorem
one_pow: ∀ (n : ), 1 ^ n = 1
one_pow
(
n:
n
:
: Type
) : (
1: ?m.9874
1
:
M: Type u
M
) ^
n:
n
=
1: ?m.9972
1
:=

Goals accomplished! 🐙
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:


1 ^ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A


zero
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 ^ Nat.succ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:


1 ^ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A


zero
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A


zero
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 ^ Nat.succ n = 1

Goals accomplished! 🐙
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:


1 ^ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 ^ Nat.succ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 ^ Nat.succ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 ^ Nat.succ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 * 1 ^ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 ^ Nat.succ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 * 1 = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 ^ Nat.succ n = 1
α: Type ?u.9841

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

n:

ih: 1 ^ n = 1


succ
1 = 1

Goals accomplished! 🐙
#align one_pow
one_pow: ∀ {M : Type u} [inst : Monoid M] (n : ), 1 ^ n = 1
one_pow
@[to_additive existing (attr := simp)
one_nsmul: ∀ {A : Type y} [inst : AddMonoid A] (a : A), 1 a = a
one_nsmul
] theorem
pow_one: ∀ (a : M), a ^ 1 = a
pow_one
(
a: M
a
:
M: Type u
M
) :
a: M
a
^
1: ?m.11525
1
=
a: M
a
:=

Goals accomplished! 🐙
α: Type ?u.11493

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 1 = a
α: Type ?u.11493

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 1 = a
α: Type ?u.11493

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a * a ^ 0 = a
α: Type ?u.11493

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 1 = a
α: Type ?u.11493

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a * 1 = a
α: Type ?u.11493

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 1 = a
α: Type ?u.11493

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a = a

Goals accomplished! 🐙
#align pow_one
pow_one: ∀ {M : Type u} [inst : Monoid M] (a : M), a ^ 1 = a
pow_one
/-- Note that most of the lemmas about powers of two refer to it as `sq`. -/ @[to_additive
two_nsmul: ∀ {M : Type u} [inst : AddMonoid M] (a : M), 2 a = a + a
two_nsmul
""] theorem
pow_two: ∀ (a : M), a ^ 2 = a * a
pow_two
(
a: M
a
:
M: Type u
M
) :
a: M
a
^
2: ?m.11901
2
=
a: M
a
*
a: M
a
:=

Goals accomplished! 🐙
α: Type ?u.11869

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 2 = a * a
α: Type ?u.11869

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 2 = a * a
α: Type ?u.11869

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a * a ^ 1 = a * a
α: Type ?u.11869

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 2 = a * a
α: Type ?u.11869

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a * a = a * a

Goals accomplished! 🐙
#align pow_two
pow_two: ∀ {M : Type u} [inst : Monoid M] (a : M), a ^ 2 = a * a
pow_two
#align two_nsmul
two_nsmul: ∀ {M : Type u} [inst : AddMonoid M] (a : M), 2 a = a + a
two_nsmul
alias
pow_two: ∀ {M : Type u} [inst : Monoid M] (a : M), a ^ 2 = a * a
pow_two
sq: ∀ {M : Type u} [inst : Monoid M] (a : M), a ^ 2 = a * a
sq
#align sq
sq: ∀ {M : Type u} [inst : Monoid M] (a : M), a ^ 2 = a * a
sq
theorem
pow_three': ∀ (a : M), a ^ 3 = a * a * a
pow_three'
(
a: M
a
:
M: Type u
M
) :
a: M
a
^
3: ?m.12320
3
=
a: M
a
*
a: M
a
*
a: M
a
:=

Goals accomplished! 🐙
α: Type ?u.12288

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 3 = a * a * a
α: Type ?u.12288

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 3 = a * a * a
α: Type ?u.12288

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 2 * a = a * a * a
α: Type ?u.12288

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 3 = a * a * a
α: Type ?u.12288

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a * a * a = a * a * a

Goals accomplished! 🐙
#align pow_three'
pow_three': ∀ {M : Type u} [inst : Monoid M] (a : M), a ^ 3 = a * a * a
pow_three'
theorem
pow_three: ∀ (a : M), a ^ 3 = a * (a * a)
pow_three
(
a: M
a
:
M: Type u
M
) :
a: M
a
^
3: ?m.12797
3
=
a: M
a
* (
a: M
a
*
a: M
a
) :=

Goals accomplished! 🐙
α: Type ?u.12765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 3 = a * (a * a)
α: Type ?u.12765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 3 = a * (a * a)
α: Type ?u.12765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a * a ^ 2 = a * (a * a)
α: Type ?u.12765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a ^ 3 = a * (a * a)
α: Type ?u.12765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M


a * (a * a) = a * (a * a)

Goals accomplished! 🐙
#align pow_three
pow_three: ∀ {M : Type u} [inst : Monoid M] (a : M), a ^ 3 = a * (a * a)
pow_three
@[to_additive existing
add_nsmul: ∀ {A : Type y} [inst : AddMonoid A] (a : A) (m n : ), (m + n) a = m a + n a
add_nsmul
] theorem
pow_add: ∀ (a : M) (m n : ), a ^ (m + n) = a ^ m * a ^ n
pow_add
(
a: M
a
:
M: Type u
M
) (
m:
m
n:
n
:
: Type
) :
a: M
a
^ (
m:
m
+
n:
n
) =
a: M
a
^
m:
m
*
a: M
a
^
n:
n
:=

Goals accomplished! 🐙
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m + n) = a ^ m * a ^ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m + Nat.zero) = a ^ m * a ^ Nat.zero
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m + n) = a ^ m * a ^ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m + Nat.zero) = a ^ m * a ^ Nat.zero
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m + Nat.zero) = a ^ m * a ^ Nat.zero
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m + Nat.zero) = a ^ m * a ^ Nat.zero
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ m = a ^ m * a ^ Nat.zero
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m + Nat.zero) = a ^ m * a ^ Nat.zero
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ m = a ^ m * 1
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m + Nat.zero) = a ^ m * a ^ Nat.zero
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ m = a ^ m

Goals accomplished! 🐙
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m + n) = a ^ m * a ^ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * (a ^ n * a)
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ n * a
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ (m + n) * a
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ (m + n + 1)
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ m * a ^ Nat.succ n
α: Type ?u.13242

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m + n) = a ^ m * a ^ n


succ
a ^ (m + Nat.succ n) = a ^ (m + (n + 1))

Goals accomplished! 🐙
#align pow_add
pow_add: ∀ {M : Type u} [inst : Monoid M] (a : M) (m n : ), a ^ (m + n) = a ^ m * a ^ n
pow_add
@[to_additive
mul_nsmul: ∀ {M : Type u} [inst : AddMonoid M] (a : M) (m n : ), (m * n) a = n m a
mul_nsmul
] theorem
pow_mul: ∀ {M : Type u} [inst : Monoid M] (a : M) (m n : ), a ^ (m * n) = (a ^ m) ^ n
pow_mul
(
a: M
a
:
M: Type u
M
) (
m:
m
n:
n
:
: Type
) :
a: M
a
^ (
m:
m
*
n:
n
) = (
a: M
a
^
m:
m
) ^
n:
n
:=

Goals accomplished! 🐙
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m * n) = (a ^ m) ^ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m * Nat.zero) = (a ^ m) ^ Nat.zero
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * Nat.succ n) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m * n) = (a ^ m) ^ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m * Nat.zero) = (a ^ m) ^ Nat.zero
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m * Nat.zero) = (a ^ m) ^ Nat.zero
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * Nat.succ n) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m * Nat.zero) = (a ^ m) ^ Nat.zero
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ 0 = (a ^ m) ^ Nat.zero
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m * Nat.zero) = (a ^ m) ^ Nat.zero
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
1 = (a ^ m) ^ Nat.zero
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
a ^ (m * Nat.zero) = (a ^ m) ^ Nat.zero
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m:


zero
1 = 1

Goals accomplished! 🐙
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m * n) = (a ^ m) ^ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * Nat.succ n) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * Nat.succ n) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * Nat.succ n) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * n + m) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * Nat.succ n) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * n) * a ^ m = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * Nat.succ n) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * n) * a ^ m = (a ^ m) ^ n * a ^ m
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
a ^ (m * Nat.succ n) = (a ^ m) ^ Nat.succ n
α: Type ?u.15094

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

ih: a ^ (m * n) = (a ^ m) ^ n


succ
(a ^ m) ^ n * a ^ m = (a ^ m) ^ n * a ^ m

Goals accomplished! 🐙
-- Porting note: we are taking the opportunity to swap the names `mul_nsmul` and `mul_nsmul'` -- using #align, so that in mathlib4 they will match the multiplicative ones. #align pow_mul
pow_mul: ∀ {M : Type u} [inst : Monoid M] (a : M) (m n : ), a ^ (m * n) = (a ^ m) ^ n
pow_mul
#align mul_nsmul'
mul_nsmul: ∀ {M : Type u} [inst : AddMonoid M] (a : M) (m n : ), (m * n) a = n m a
mul_nsmul
@[to_additive
mul_nsmul': ∀ {M : Type u} [inst : AddMonoid M] (a : M) (m n : ), (m * n) a = m n a
mul_nsmul'
] theorem
pow_mul': ∀ {M : Type u} [inst : Monoid M] (a : M) (m n : ), a ^ (m * n) = (a ^ n) ^ m
pow_mul'
(
a: M
a
:
M: Type u
M
) (
m:
m
n:
n
:
: Type
) :
a: M
a
^ (
m:
m
*
n:
n
) = (
a: M
a
^
n:
n
) ^
m:
m
:=

Goals accomplished! 🐙
α: Type ?u.16765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m * n) = (a ^ n) ^ m
α: Type ?u.16765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m * n) = (a ^ n) ^ m
α: Type ?u.16765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (n * m) = (a ^ n) ^ m
α: Type ?u.16765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m * n) = (a ^ n) ^ m
α: Type ?u.16765

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


(a ^ n) ^ m = (a ^ n) ^ m

Goals accomplished! 🐙
#align pow_mul'
pow_mul': ∀ {M : Type u} [inst : Monoid M] (a : M) (m n : ), a ^ (m * n) = (a ^ n) ^ m
pow_mul'
#align mul_nsmul
mul_nsmul': ∀ {M : Type u} [inst : AddMonoid M] (a : M) (m n : ), (m * n) a = m n a
mul_nsmul'
@[
to_additive: ∀ {M : Type u} [inst : AddMonoid M] {a b : M}, AddCommute a b∀ (n : ), n (a + b) = n a + n b
to_additive
] theorem
Commute.mul_pow: ∀ {a b : M}, Commute a b∀ (n : ), (a * b) ^ n = a ^ n * b ^ n
Commute.mul_pow
{
a: M
a
b: M
b
:
M: Type u
M
} (
h: Commute a b
h
:
Commute: {S : Type ?u.18307} → [inst : Mul S] → SSProp
Commute
a: M
a
b: M
b
) (
n:
n
:
: Type
) : (
a: M
a
*
b: M
b
) ^
n:
n
=
a: M
a
^
n:
n
*
b: M
b
^
n:
n
:=

Goals accomplished! 🐙
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b

n:


(a * b) ^ n = a ^ n * b ^ n
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b

n:

ih: (a * b) ^ n = a ^ n * b ^ n


succ
(a * b) ^ Nat.succ n = a ^ Nat.succ n * b ^ Nat.succ n
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b

n:


(a * b) ^ n = a ^ n * b ^ n
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b

n:

ih: (a * b) ^ n = a ^ n * b ^ n


succ
(a * b) ^ Nat.succ n = a ^ Nat.succ n * b ^ Nat.succ n
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
1 = 1 * b ^ Nat.zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
1 = 1 * 1
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b


zero
1 = 1

Goals accomplished! 🐙
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b

n:


(a * b) ^ n = a ^ n * b ^ n
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b

n:

ih: (a * b) ^ n = a ^ n * b ^ n


succ
(a * b) ^ Nat.succ n = a ^ Nat.succ n * b ^ Nat.succ n
α: Type ?u.18278

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a, b: M

h: Commute a b

n:

ih: (a * b) ^ n = a ^ n * b ^ n


succ
(a * b) ^ Nat.succ n = a ^ Nat.succ n * b ^ Nat.succ n

Goals accomplished! 🐙
#align commute.mul_pow
Commute.mul_pow: ∀ {M : Type u} [inst : Monoid M] {a b : M}, Commute a b∀ (n : ), (a * b) ^ n = a ^ n * b ^ n
Commute.mul_pow
#align add_commute.add_nsmul
AddCommute.add_nsmul: ∀ {M : Type u} [inst : AddMonoid M] {a b : M}, AddCommute a b∀ (n : ), n (a + b) = n a + n b
AddCommute.add_nsmul
@[
to_additive: ∀ {M : Type u} [inst : AddMonoid M] (a : M) (n : ), n a + a = a + n a
to_additive
] theorem
pow_mul_comm': ∀ (a : M) (n : ), a ^ n * a = a * a ^ n
pow_mul_comm'
(
a: M
a
:
M: Type u
M
) (
n:
n
:
: Type
) :
a: M
a
^
n:
n
*
a: M
a
=
a: M
a
*
a: M
a
^
n:
n
:=
Commute.pow_self: ∀ {M : Type ?u.22114} [inst : Monoid M] (a : M) (n : ), Commute (a ^ n) a
Commute.pow_self
a: M
a
n:
n
#align pow_mul_comm'
pow_mul_comm': ∀ {M : Type u} [inst : Monoid M] (a : M) (n : ), a ^ n * a = a * a ^ n
pow_mul_comm'
#align nsmul_add_comm'
nsmul_add_comm': ∀ {M : Type u} [inst : AddMonoid M] (a : M) (n : ), n a + a = a + n a
nsmul_add_comm'
theorem
pow_boole: ∀ (P : Prop) [inst : Decidable P] (a : M), (a ^ if P then 1 else 0) = if P then a else 1
pow_boole
(
P: Prop
P
:
Prop: Type
Prop
) [
Decidable: PropType
Decidable
P: Prop
P
] (
a: M
a
:
M: Type u
M
) : (
a: M
a
^ if
P: Prop
P
then
1: ?m.22184
1
else
0: ?m.22195
0
) = if
P: Prop
P
then
a: M
a
else
1: ?m.22219
1
:=

Goals accomplished! 🐙
α: Type ?u.22144

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M

inst✝¹: AddMonoid A

P: Prop

inst✝: Decidable P

a: M


(a ^ if P then 1 else 0) = if P then a else 1

Goals accomplished! 🐙
#align pow_boole
pow_boole: ∀ {M : Type u} [inst : Monoid M] (P : Prop) [inst_1 : Decidable P] (a : M), (a ^ if P then 1 else 0) = if P then a else 1
pow_boole
@[to_additive
nsmul_left_comm: ∀ {M : Type u} [inst : AddMonoid M] (a : M) (m n : ), n m a = m n a
nsmul_left_comm
] theorem
pow_right_comm: ∀ (a : M) (m n : ), (a ^ m) ^ n = (a ^ n) ^ m
pow_right_comm
(
a: M
a
:
M: Type u
M
) (
m:
m
n:
n
:
: Type
) : (
a: M
a
^
m:
m
) ^
n:
n
= (
a: M
a
^
n:
n
) ^
m:
m
:=

Goals accomplished! 🐙
α: Type ?u.22873

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


(a ^ m) ^ n = (a ^ n) ^ m
α: Type ?u.22873

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


(a ^ m) ^ n = (a ^ n) ^ m
α: Type ?u.22873

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (m * n) = (a ^ n) ^ m
α: Type ?u.22873

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


(a ^ m) ^ n = (a ^ n) ^ m
α: Type ?u.22873

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


a ^ (n * m) = (a ^ n) ^ m
α: Type ?u.22873

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


(a ^ m) ^ n = (a ^ n) ^ m
α: Type ?u.22873

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:


(a ^ n) ^ m = (a ^ n) ^ m

Goals accomplished! 🐙
#align pow_right_comm
pow_right_comm: ∀ {M : Type u} [inst : Monoid M] (a : M) (m n : ), (a ^ m) ^ n = (a ^ n) ^ m
pow_right_comm
#align nsmul_left_comm
nsmul_left_comm: ∀ {M : Type u} [inst : AddMonoid M] (a : M) (m n : ), n m a = m n a
nsmul_left_comm
@[to_additive
nsmul_add_sub_nsmul: ∀ {M : Type u} [inst : AddMonoid M] (a : M) {m n : }, m nm a + (n - m) a = n a
nsmul_add_sub_nsmul
] theorem
pow_mul_pow_sub: ∀ {M : Type u} [inst : Monoid M] (a : M) {m n : }, m na ^ m * a ^ (n - m) = a ^ n
pow_mul_pow_sub
(
a: M
a
:
M: Type u
M
) {
m:
m
n:
n
:
: Type
} (
h: m n
h
:
m:
m
n:
n
) :
a: M
a
^
m:
m
*
a: M
a
^ (
n:
n
-
m:
m
) =
a: M
a
^
n:
n
:=

Goals accomplished! 🐙
α: Type ?u.24421

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ m * a ^ (n - m) = a ^ n
α: Type ?u.24421

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ m * a ^ (n - m) = a ^ n
α: Type ?u.24421

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ (m + (n - m)) = a ^ n
α: Type ?u.24421

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ m * a ^ (n - m) = a ^ n
α: Type ?u.24421

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ (n - m + m) = a ^ n
α: Type ?u.24421

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ m * a ^ (n - m) = a ^ n
α: Type ?u.24421

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ n = a ^ n

Goals accomplished! 🐙
#align pow_mul_pow_sub
pow_mul_pow_sub: ∀ {M : Type u} [inst : Monoid M] (a : M) {m n : }, m na ^ m * a ^ (n - m) = a ^ n
pow_mul_pow_sub
#align nsmul_add_sub_nsmul
nsmul_add_sub_nsmul: ∀ {M : Type u} [inst : AddMonoid M] (a : M) {m n : }, m nm a + (n - m) a = n a
nsmul_add_sub_nsmul
@[to_additive
sub_nsmul_nsmul_add: ∀ {M : Type u} [inst : AddMonoid M] (a : M) {m n : }, m n(n - m) a + m a = n a
sub_nsmul_nsmul_add
] theorem
pow_sub_mul_pow: ∀ {M : Type u} [inst : Monoid M] (a : M) {m n : }, m na ^ (n - m) * a ^ m = a ^ n
pow_sub_mul_pow
(
a: M
a
:
M: Type u
M
) {
m:
m
n:
n
:
: Type
} (
h: m n
h
:
m:
m
n:
n
) :
a: M
a
^ (
n:
n
-
m:
m
) *
a: M
a
^
m:
m
=
a: M
a
^
n:
n
:=

Goals accomplished! 🐙
α: Type ?u.26055

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ (n - m) * a ^ m = a ^ n
α: Type ?u.26055

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ (n - m) * a ^ m = a ^ n
α: Type ?u.26055

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ (n - m + m) = a ^ n
α: Type ?u.26055

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ (n - m) * a ^ m = a ^ n
α: Type ?u.26055

M: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝¹: Monoid M

inst✝: AddMonoid A

a: M

m, n:

h: m n


a ^ n = a ^ n

Goals accomplished! 🐙
#align pow_sub_mul_pow
pow_sub_mul_pow: ∀ {M : Type u} [inst : Monoid M] (a : M) {m n : }, m na ^ (n - m) * a ^ m = a ^ n
pow_sub_mul_pow
#align sub_nsmul_nsmul_add
sub_nsmul_nsmul_add: ∀ {M : Type u} [inst : AddMonoid M] (a : M) {m n : }, m n(n - m) a + m a = n a
sub_nsmul_nsmul_add
/-- If `x ^ n = 1`, then `x ^ m` is the same as `x ^ (m % n)` -/ @[to_additive
nsmul_eq_mod_nsmul: ∀ {M : Type u_1} [inst : AddMonoid M] {x : M} (m : ) {n : }, n x = 0m x = (m % n) x
nsmul_eq_mod_nsmul
"If `n • x = 0`, then `m • x` is the same as `(m % n) • x`"] theorem
pow_eq_pow_mod: ∀ {M : Type u_1} [inst : Monoid M] {x : M} (m : ) {n : }, x ^ n = 1x ^ m = x ^ (m % n)
pow_eq_pow_mod
{
M: Type ?u.27699
M
:
Type _: Type (?u.27699+1)
Type _
} [
Monoid: Type ?u.27702 → Type ?u.27702
Monoid
M: Type ?u.27699
M
] {
x: M
x
:
M: Type ?u.27699
M
} (
m:
m
:
: Type
) {
n:
n
:
: Type
} (
h: x ^ n = 1
h
:
x: M
x
^
n:
n
=
1: ?m.27716
1
) :
x: M
x
^
m:
m
=
x: M
x
^ (
m:
m
%
n:
n
) :=

Goals accomplished! 🐙
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ (n * (m / n) + m % n) = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ (n * (m / n)) * x ^ (m % n) = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


(x ^ n) ^ (m / n) * x ^ (m % n) = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


1 ^ (m / n) * x ^ (m % n) = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


1 * x ^ (m % n) = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ m = x ^ (m % n)
α: Type ?u.27674

M✝: Type u

N: Type v

G: Type w

H: Type x

A: Type y

B: Type z

R: Type u₁

S: Type u₂

inst✝²: Monoid M✝

inst✝¹: AddMonoid A

M: Type u_1

inst✝: Monoid M

x: M

m, n:

h: x ^ n = 1

t: x ^ m = x ^ (n * (m / n) + m % n)


x ^ (m % n) = x ^ (m % n)

Goals accomplished! 🐙
#align pow_eq_pow_mod
pow_eq_pow_mod: ∀ {M : Type u_1} [inst : Monoid M] {x : M} (m : ) {n : }, x ^ n = 1x ^ m = x ^ (m % n)
pow_eq_pow_mod
#align nsmul_eq_mod_nsmul
nsmul_eq_mod_nsmul: ∀ {M : Type u_1} [inst : AddMonoid M] {x : M} (m : ) {n : }, n x = 0m x = (m % n) x
nsmul_eq_mod_nsmul
@[
to_additive: ∀ {M : Type u} [inst : AddMonoid M] (a : M) (m n : ), m a + n a = n a + m a
to_additive
] theorem
pow_mul_comm: ∀ (a : M) (m n : ), a ^ m * a ^ n = a ^ n * a ^ m
pow_mul_comm
(
a: M
a
:
M: Type u
M
) (
m:
m
n:
n
:
: Type
) :
a: M
a
^
m:
m
*
a: M
a
^
n:
n
=
a: M
a
^
n:
n
*
a: M
a
^
m:
m
:=
Commute.pow_pow_self: ∀ {M : Type ?u.33835} [inst : Monoid M] (a : M) (m n : ), Commute (a ^ m) (a ^ n)
Commute.pow_pow_self
a: M
a
m:
m
n:
n
#align pow_mul_comm
pow_mul_comm: ∀ {M : Type u} [inst : Monoid M] (a : M) (m n : ), a ^ m * a ^ n = a ^ n * a ^ m
pow_mul_comm
#align nsmul_add_comm
nsmul_add_comm: ∀ {M : Type u} [inst : AddMonoid M] (a : M) (m n : ), m a + n a = n a + m a
nsmul_add_comm
section Bit set_option linter.deprecated false @[to_additive
bit0_nsmul: ∀ {M : Type u} [inst : AddMonoid M] (a : M) (n : ), bit0 n a = n a + n a
bit0_nsmul
] theorem