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) 2022 Damiano Testa. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Damiano Testa

! This file was ported from Lean 3 source module algebra.parity
! leanprover-community/mathlib commit 8631e2d5ea77f6c13054d9151d82b83069680cb1
! 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.Data.Nat.Cast.Basic

/-!  # Squares, even and odd elements

This file proves some general facts about squares, even and odd elements of semirings.

In the implementation, we define `IsSquare` and we let `Even` be the notion transported by
`to_additive`.  The definition are therefore as follows:
```lean
IsSquare a ↔ ∃ r, a = r * r
Even a ↔ ∃ r, a = r + r
```

Odd elements are not unified with a multiplicative notion.

## Future work

* TODO: Try to generalize further the typeclass assumptions on `IsSquare/Even`.
  For instance, in some cases, there are `Semiring` assumptions that I (DT) am not convinced are
  necessary.
* TODO: Consider moving the definition and lemmas about `Odd` to a separate file.
* TODO: The "old" definition of `Even a` asked for the existence of an element `c` such that
  `a = 2 * c`.  For this reason, several fixes introduce an extra `two_mul` or `← two_mul`.
  It might be the case that by making a careful choice of `simp` lemma, this can be avoided.
 -/


open MulOpposite

variable {
F: Type ?u.75153
F
α: Type ?u.5
α
β: Type ?u.75159
β
R: Type ?u.75162
R
:
Type _: Type (?u.11+1)
Type _
} section Mul variable [
Mul: Type ?u.146 → Type ?u.146
Mul
α: Type ?u.32
α
] /-- An element `a` of a type `α` with multiplication satisfies `IsSquare a` if `a = r * r`, for some `r : α`. -/ @[
to_additive: {α : Type u_1} → [inst : Add α] → αProp
to_additive
"An element `a` of a type `α` with addition satisfies `Even a` if `a = r + r`, for some `r : α`."] def
IsSquare: {α : Type u_1} → [inst : Mul α] → αProp
IsSquare
(
a: α
a
:
α: Type ?u.32
α
) :
Prop: Type
Prop
:= ∃
r: ?m.51
r
,
a: α
a
=
r: ?m.51
r
*
r: ?m.51
r
#align is_square
IsSquare: {α : Type u_1} → [inst : Mul α] → αProp
IsSquare
#align even
Even: {α : Type u_1} → [inst : Add α] → αProp
Even
@[
to_additive: ∀ {α : Type u_1} [inst : Add α] (m : α), Even (m + m)
to_additive
(attr := simp)] theorem
isSquare_mul_self: ∀ (m : α), IsSquare (m * m)
isSquare_mul_self
(
m: α
m
:
α: Type ?u.137
α
) :
IsSquare: {α : Type ?u.151} → [inst : Mul α] → αProp
IsSquare
(
m: α
m
*
m: α
m
) := ⟨
m: α
m
,
rfl: ∀ {α : Sort ?u.249} {a : α}, a = a
rfl
#align is_square_mul_self
isSquare_mul_self: ∀ {α : Type u_1} [inst : Mul α] (m : α), IsSquare (m * m)
isSquare_mul_self
#align even_add_self
even_add_self: ∀ {α : Type u_1} [inst : Add α] (m : α), Even (m + m)
even_add_self
@[
to_additive: ∀ {α : Type u_1} [inst : Add α] (a : α), Even (AddOpposite.op a) Even a
to_additive
] theorem
isSquare_op_iff: ∀ (a : α), IsSquare (op a) IsSquare a
isSquare_op_iff
(
a: α
a
:
α: Type ?u.314
α
) :
IsSquare: {α : Type ?u.328} → [inst : Mul α] → αProp
IsSquare
(
op: {α : Type ?u.331} → ααᵐᵒᵖ
op
a: α
a
) ↔
IsSquare: {α : Type ?u.356} → [inst : Mul α] → αProp
IsSquare
a: α
a
:= ⟨func,
hc: op a = c * c
hc
⟩ => ⟨
unop: {α : Type ?u.419} → αᵐᵒᵖα
unop
c,

Goals accomplished! 🐙
F: Type ?u.311

α: Type u_1

β: Type ?u.317

R: Type ?u.320

inst✝: Mul α

a: α

x✝: IsSquare (op a)

c: αᵐᵒᵖ

hc: op a = c * c


a = unop c * unop c
F: Type ?u.311

α: Type u_1

β: Type ?u.317

R: Type ?u.320

inst✝: Mul α

a: α

x✝: IsSquare (op a)

c: αᵐᵒᵖ

hc: op a = c * c


a = unop c * unop c
F: Type ?u.311

α: Type u_1

β: Type ?u.317

R: Type ?u.320

inst✝: Mul α

a: α

x✝: IsSquare (op a)

c: αᵐᵒᵖ

hc: op a = c * c


a = unop (c * c)
F: Type ?u.311

α: Type u_1

β: Type ?u.317

R: Type ?u.320

inst✝: Mul α

a: α

x✝: IsSquare (op a)

c: αᵐᵒᵖ

hc: op a = c * c


a = unop c * unop c
F: Type ?u.311

α: Type u_1

β: Type ?u.317

R: Type ?u.320

inst✝: Mul α

a: α

x✝: IsSquare (op a)

c: αᵐᵒᵖ

hc: op a = c * c


a = unop (op a)
F: Type ?u.311

α: Type u_1

β: Type ?u.317

R: Type ?u.320

inst✝: Mul α

a: α

x✝: IsSquare (op a)

c: αᵐᵒᵖ

hc: op a = c * c


a = unop c * unop c
F: Type ?u.311

α: Type u_1

β: Type ?u.317

R: Type ?u.320

inst✝: Mul α

a: α

x✝: IsSquare (op a)

c: αᵐᵒᵖ

hc: op a = c * c


a = a

Goals accomplished! 🐙
⟩, fun
c: α
c
,
hc: a = c * c
hc
⟩ =>

Goals accomplished! 🐙
F: Type ?u.311

α: Type u_1

β: Type ?u.317

R: Type ?u.320

inst✝: Mul α

a: α

x✝: IsSquare a

c: α

hc: a = c * c



Goals accomplished! 🐙
#align is_square_op_iff
isSquare_op_iff: ∀ {α : Type u_1} [inst : Mul α] (a : α), IsSquare (op a) IsSquare a
isSquare_op_iff
#align even_op_iff
even_op_iff: ∀ {α : Type u_1} [inst : Add α] (a : α), Even (AddOpposite.op a) Even a
even_op_iff
end Mul @[
to_additive: ∀ {α : Type u_1} [inst : AddZeroClass α], Even 0
to_additive
(attr := simp)] theorem
isSquare_one: ∀ [inst : MulOneClass α], IsSquare 1
isSquare_one
[
MulOneClass: Type ?u.888 → Type ?u.888
MulOneClass
α: Type ?u.879
α
] :
IsSquare: {α : Type ?u.891} → [inst : Mul α] → αProp
IsSquare
(
1: ?m.919
1
:
α: Type ?u.879
α
) := ⟨
1: ?m.1662
1
, (
mul_one: ∀ {M : Type ?u.2125} [inst : MulOneClass M] (a : M), a * 1 = a
mul_one
_: ?m.2126
_
).
symm: ∀ {α : Sort ?u.2140} {a b : α}, a = bb = a
symm
#align is_square_one
isSquare_one: ∀ {α : Type u_1} [inst : MulOneClass α], IsSquare 1
isSquare_one
#align even_zero
even_zero: ∀ {α : Type u_1} [inst : AddZeroClass α], Even 0
even_zero
@[
to_additive: ∀ {F : Type u_3} {α : Type u_1} {β : Type u_2} [inst : AddZeroClass α] [inst_1 : AddZeroClass β] [inst_2 : AddMonoidHomClass F α β] {m : α} (f : F), Even mEven (f m)
to_additive
] theorem
IsSquare.map: ∀ [inst : MulOneClass α] [inst_1 : MulOneClass β] [inst_2 : MonoidHomClass F α β] {m : α} (f : F), IsSquare mIsSquare (f m)
IsSquare.map
[
MulOneClass: Type ?u.2221 → Type ?u.2221
MulOneClass
α: Type ?u.2212
α
] [
MulOneClass: Type ?u.2224 → Type ?u.2224
MulOneClass
β: Type ?u.2215
β
] [
MonoidHomClass: Type ?u.2229 → (M : outParam (Type ?u.2228)) → (N : outParam (Type ?u.2227)) → [inst : MulOneClass M] → [inst : MulOneClass N] → Type (max(max?u.2229?u.2228)?u.2227)
MonoidHomClass
F: Type ?u.2209
F
α: Type ?u.2212
α
β: Type ?u.2215
β
] {
m: α
m
:
α: Type ?u.2212
α
} (
f: F
f
:
F: Type ?u.2209
F
) :
IsSquare: {α : Type ?u.2249} → [inst : Mul α] → αProp
IsSquare
m: α
m
IsSquare: {α : Type ?u.2588} → [inst : Mul α] → αProp
IsSquare
(
f: F
f
m: α
m
) :=

Goals accomplished! 🐙
F: Type u_3

α: Type u_1

β: Type u_2

R: Type ?u.2218

inst✝²: MulOneClass α

inst✝¹: MulOneClass β

inst✝: MonoidHomClass F α β

m: α

f: F


IsSquare mIsSquare (f m)
F: Type u_3

α: Type u_1

β: Type u_2

R: Type ?u.2218

inst✝²: MulOneClass α

inst✝¹: MulOneClass β

inst✝: MonoidHomClass F α β

f: F

m: α


intro
IsSquare (f (m * m))
F: Type u_3

α: Type u_1

β: Type u_2

R: Type ?u.2218

inst✝²: MulOneClass α

inst✝¹: MulOneClass β

inst✝: MonoidHomClass F α β

m: α

f: F


IsSquare mIsSquare (f m)
F: Type u_3

α: Type u_1

β: Type u_2

R: Type ?u.2218

inst✝²: MulOneClass α

inst✝¹: MulOneClass β

inst✝: MonoidHomClass F α β

f: F

m: α


intro
IsSquare (f (m * m))

Goals accomplished! 🐙
F: Type u_3

α: Type u_1

β: Type u_2

R: Type ?u.2218

inst✝²: MulOneClass α

inst✝¹: MulOneClass β

inst✝: MonoidHomClass F α β

f: F

m: α


f (m * m) = f m * f m

Goals accomplished! 🐙

Goals accomplished! 🐙
#align is_square.map
IsSquare.map: ∀ {F : Type u_3} {α : Type u_1} {β : Type u_2} [inst : MulOneClass α] [inst_1 : MulOneClass β] [inst_2 : MonoidHomClass F α β] {m : α} (f : F), IsSquare mIsSquare (f m)
IsSquare.map
#align even.map
Even.map: ∀ {F : Type u_3} {α : Type u_1} {β : Type u_2} [inst : AddZeroClass α] [inst_1 : AddZeroClass β] [inst_2 : AddMonoidHomClass F α β] {m : α} (f : F), Even mEven (f m)
Even.map
section Monoid variable [
Monoid: Type ?u.19696 → Type ?u.19696
Monoid
α: Type ?u.5152
α
] {
n:
n
:
: Type
} {
a: α
a
:
α: Type ?u.5152
α
} @[to_additive
even_iff_exists_two_nsmul: ∀ {α : Type u_1} [inst : AddMonoid α] (m : α), Even m c, m = 2 c
even_iff_exists_two_nsmul
] theorem
isSquare_iff_exists_sq: ∀ {α : Type u_1} [inst : Monoid α] (m : α), IsSquare m c, m = c ^ 2
isSquare_iff_exists_sq
(
m: α
m
:
α: Type ?u.5171
α
) :
IsSquare: {α : Type ?u.5189} → [inst : Mul α] → αProp
IsSquare
m: α
m
↔ ∃
c: ?m.5520
c
,
m: α
m
=
c: ?m.5520
c
^
2: ?m.5527
2
:=

Goals accomplished! 🐙
F: Type ?u.5168

α: Type u_1

β: Type ?u.5174

R: Type ?u.5177

inst✝: Monoid α

n:

a, m: α


IsSquare m c, m = c ^ 2

Goals accomplished! 🐙
#align is_square_iff_exists_sq
isSquare_iff_exists_sq: ∀ {α : Type u_1} [inst : Monoid α] (m : α), IsSquare m c, m = c ^ 2
isSquare_iff_exists_sq
#align even_iff_exists_two_nsmul
even_iff_exists_two_nsmul: ∀ {α : Type u_1} [inst : AddMonoid α] (m : α), Even m c, m = 2 c
even_iff_exists_two_nsmul
alias
isSquare_iff_exists_sq: ∀ {α : Type u_1} [inst : Monoid α] (m : α), IsSquare m c, m = c ^ 2
isSquare_iff_exists_sq
IsSquare.exists_sq: ∀ {α : Type u_1} [inst : Monoid α] (m : α), IsSquare mc, m = c ^ 2
IsSquare.exists_sq
isSquare_of_exists_sq: ∀ {α : Type u_1} [inst : Monoid α] (m : α), (c, m = c ^ 2) → IsSquare m
isSquare_of_exists_sq
#align is_square.exists_sq
IsSquare.exists_sq: ∀ {α : Type u_1} [inst : Monoid α] (m : α), IsSquare mc, m = c ^ 2
IsSquare.exists_sq
#align is_square_of_exists_sq
isSquare_of_exists_sq: ∀ {α : Type u_1} [inst : Monoid α] (m : α), (c, m = c ^ 2) → IsSquare m
isSquare_of_exists_sq
attribute [to_additive
Even.exists_two_nsmul: ∀ {α : Type u_1} [inst : AddMonoid α] (m : α), Even mc, m = 2 c
Even.exists_two_nsmul
"Alias of the forwards direction of `even_iff_exists_two_nsmul`."]
IsSquare.exists_sq: ∀ {α : Type u_1} [inst : Monoid α] (m : α), IsSquare mc, m = c ^ 2
IsSquare.exists_sq
#align even.exists_two_nsmul
Even.exists_two_nsmul: ∀ {α : Type u_1} [inst : AddMonoid α] (m : α), Even mc, m = 2 c
Even.exists_two_nsmul
@[
to_additive: ∀ {α : Type u_1} [inst : AddMonoid α] {a : α} (n : ), Even aEven (n a)
to_additive
] theorem
IsSquare.pow: ∀ {α : Type u_1} [inst : Monoid α] {a : α} (n : ), IsSquare aIsSquare (a ^ n)
IsSquare.pow
(
n:
n
:
: Type
) :
IsSquare: {α : Type ?u.8168} → [inst : Mul α] → αProp
IsSquare
a: α
a
IsSquare: {α : Type ?u.8520} → [inst : Mul α] → αProp
IsSquare
(
a: α
a
^
n:
n
) :=

Goals accomplished! 🐙
F: Type ?u.8146

α: Type u_1

β: Type ?u.8152

R: Type ?u.8155

inst✝: Monoid α

n✝:

a: α

n:


IsSquare aIsSquare (a ^ n)
F: Type ?u.8146

α: Type u_1

β: Type ?u.8152

R: Type ?u.8155

inst✝: Monoid α

n✝, n:

a: α


intro
IsSquare ((a * a) ^ n)
F: Type ?u.8146

α: Type u_1

β: Type ?u.8152

R: Type ?u.8155

inst✝: Monoid α

n✝:

a: α

n:


IsSquare aIsSquare (a ^ n)

Goals accomplished! 🐙
#align is_square.pow
IsSquare.pow: ∀ {α : Type u_1} [inst : Monoid α] {a : α} (n : ), IsSquare aIsSquare (a ^ n)
IsSquare.pow
#align even.nsmul
Even.nsmul: ∀ {α : Type u_1} [inst : AddMonoid α] {a : α} (n : ), Even aEven (n a)
Even.nsmul
/- Porting note: `simp` attribute removed because linter reports: simp can prove this: by simp only [even_two, Even.nsmul'] -/ @[to_additive
Even.nsmul': ∀ {α : Type u_1} [inst : AddMonoid α] {n : }, Even n∀ (a : α), Even (n a)
Even.nsmul'
] theorem
Even.isSquare_pow: ∀ {α : Type u_1} [inst : Monoid α] {n : }, Even n∀ (a : α), IsSquare (a ^ n)
Even.isSquare_pow
:
Even: {α : Type ?u.14092} → [inst : Add α] → αProp
Even
n:
n
→ ∀
a: α
a
:
α: Type ?u.14075
α
,
IsSquare: {α : Type ?u.14125} → [inst : Mul α] → αProp
IsSquare
(
a: α
a
^
n:
n
) :=

Goals accomplished! 🐙
F: Type ?u.14072

α: Type u_1

β: Type ?u.14078

R: Type ?u.14081

inst✝: Monoid α

n:

a: α


Even n∀ (a : α), IsSquare (a ^ n)
F: Type ?u.14072

α: Type u_1

β: Type ?u.14078

R: Type ?u.14081

inst✝: Monoid α

a✝: α

n:

a: α


intro
IsSquare (a ^ (n + n))
F: Type ?u.14072

α: Type u_1

β: Type ?u.14078

R: Type ?u.14081

inst✝: Monoid α

n:

a: α


Even n∀ (a : α), IsSquare (a ^ n)

Goals accomplished! 🐙
#align even.is_square_pow
Even.isSquare_pow: ∀ {α : Type u_1} [inst : Monoid α] {n : }, Even n∀ (a : α), IsSquare (a ^ n)
Even.isSquare_pow
#align even.nsmul'
Even.nsmul': ∀ {α : Type u_1} [inst : AddMonoid α] {n : }, Even n∀ (a : α), Even (n a)
Even.nsmul'
/- Porting note: `simp` attribute removed because linter reports: simp can prove this: by simp only [even_two, Even.is_square_pow] -/ @[to_additive
even_two_nsmul: ∀ {α : Type u_1} [inst : AddMonoid α] (a : α), Even (2 a)
even_two_nsmul
] theorem
IsSquare_sq: ∀ {α : Type u_1} [inst : Monoid α] (a : α), IsSquare (a ^ 2)
IsSquare_sq
(
a: α
a
:
α: Type ?u.19687
α
) :
IsSquare: {α : Type ?u.19705} → [inst : Mul α] → αProp
IsSquare
(
a: α
a
^
2: ?m.19735
2
) := ⟨
a: α
a
,
pow_two: ∀ {M : Type ?u.20303} [inst : Monoid M] (a : M), a ^ 2 = a * a
pow_two
_: ?m.20304
_
#align is_square_sq
IsSquare_sq: ∀ {α : Type u_1} [inst : Monoid α] (a : α), IsSquare (a ^ 2)
IsSquare_sq
#align even_two_nsmul
even_two_nsmul: ∀ {α : Type u_1} [inst : AddMonoid α] (a : α), Even (2 a)
even_two_nsmul
variable [
HasDistribNeg: (α : Type ?u.24643) → [inst : Mul α] → Type ?u.24643
HasDistribNeg
α: Type ?u.20715
α
] theorem
Even.neg_pow: Even n∀ (a : α), (-a) ^ n = a ^ n
Even.neg_pow
:
Even: {α : Type ?u.21061} → [inst : Add α] → αProp
Even
n:
n
→ ∀
a: α
a
:
α: Type ?u.20715
α
, (-
a: α
a
) ^
n:
n
=
a: α
a
^
n:
n
:=

Goals accomplished! 🐙
F: Type ?u.20712

α: Type u_1

β: Type ?u.20718

R: Type ?u.20721

inst✝¹: Monoid α

n:

a: α

inst✝: HasDistribNeg α


Even n∀ (a : α), (-a) ^ n = a ^ n
F: Type ?u.20712

α: Type u_1

β: Type ?u.20718

R: Type ?u.20721

inst✝¹: Monoid α

a✝: α

inst✝: HasDistribNeg α

c:

a: α


intro
(-a) ^ (c + c) = a ^ (c + c)
F: Type ?u.20712

α: Type u_1

β: Type ?u.20718

R: Type ?u.20721

inst✝¹: Monoid α

n:

a: α

inst✝: HasDistribNeg α


Even n∀ (a : α), (-a) ^ n = a ^ n
F: Type ?u.20712

α: Type u_1

β: Type ?u.20718

R: Type ?u.20721

inst✝¹: Monoid α

a✝: α

inst✝: HasDistribNeg α

c:

a: α


intro
(-a) ^ (c + c) = a ^ (c + c)
F: Type ?u.20712

α: Type u_1

β: Type ?u.20718

R: Type ?u.20721

inst✝¹: Monoid α

a✝: α

inst✝: HasDistribNeg α

c:

a: α


intro
(-a) ^ (2 * c) = a ^ (2 * c)
F: Type ?u.20712

α: Type u_1

β: Type ?u.20718

R: Type ?u.20721

inst✝¹: Monoid α

a✝: α

inst✝: HasDistribNeg α

c:

a: α


intro
(-a) ^ (c + c) = a ^ (c + c)
F: Type ?u.20712

α: Type u_1

β: Type ?u.20718

R: Type ?u.20721

inst✝¹: Monoid α

a✝: α

inst✝: HasDistribNeg α

c:

a: α


intro
((-a) ^ 2) ^ c = (a ^ 2) ^ c
F: Type ?u.20712

α: Type u_1

β: Type ?u.20718

R: Type ?u.20721

inst✝¹: Monoid α

a✝: α

inst✝: HasDistribNeg α

c:

a: α


intro
(-a) ^ (c + c) = a ^ (c + c)

Goals accomplished! 🐙

Goals accomplished! 🐙
#align even.neg_pow
Even.neg_pow: ∀ {α : Type u_1} [inst : Monoid α] {n : } [inst_1 : HasDistribNeg α], Even n∀ (a : α), (-a) ^ n = a ^ n
Even.neg_pow
theorem
Even.neg_one_pow: ∀ {α : Type u_1} [inst : Monoid α] {n : } [inst_1 : HasDistribNeg α], Even n(-1) ^ n = 1
Even.neg_one_pow
(
h: Even n
h
:
Even: {α : Type ?u.24972} → [inst : Add α] → αProp
Even
n:
n
) : (-
1: ?m.25010
1
:
α: Type ?u.24627
α
) ^
n:
n
=
1: ?m.25764
1
:=

Goals accomplished! 🐙
F: Type ?u.24624

α: Type u_1

β: Type ?u.24630

R: Type ?u.24633

inst✝¹: Monoid α

n:

a: α

inst✝: HasDistribNeg α

h: Even n


(-1) ^ n = 1
F: Type ?u.24624

α: Type u_1

β: Type ?u.24630

R: Type ?u.24633

inst✝¹: Monoid α

n:

a: α

inst✝: HasDistribNeg α

h: Even n


(-1) ^ n = 1
F: Type ?u.24624

α: Type u_1

β: Type ?u.24630

R: Type ?u.24633

inst✝¹: Monoid α

n:

a: α

inst✝: HasDistribNeg α

h: Even n


1 ^ n = 1
F: Type ?u.24624

α: Type u_1

β: Type ?u.24630

R: Type ?u.24633

inst✝¹: Monoid α

n:

a: α

inst✝: HasDistribNeg α

h: Even n


(-1) ^ n = 1
F: Type ?u.24624

α: Type u_1

β: Type ?u.24630

R: Type ?u.24633

inst✝¹: Monoid α

n:

a: α

inst✝: HasDistribNeg α

h: Even n


1 = 1

Goals accomplished! 🐙
#align even.neg_one_pow
Even.neg_one_pow: ∀ {α : Type u_1} [inst : Monoid α] {n : } [inst_1 : HasDistribNeg α], Even n(-1) ^ n = 1
Even.neg_one_pow
end Monoid @[
to_additive: ∀ {α : Type u_1} [inst : AddCommSemigroup α] {a b : α}, Even aEven bEven (a + b)
to_additive
] theorem
IsSquare.mul: ∀ {α : Type u_1} [inst : CommSemigroup α] {a b : α}, IsSquare aIsSquare bIsSquare (a * b)
IsSquare.mul
[
CommSemigroup: Type ?u.28476 → Type ?u.28476
CommSemigroup
α: Type ?u.28467
α
] {
a: α
a
b: α
b
:
α: Type ?u.28467
α
} :
IsSquare: {α : Type ?u.28484} → [inst : Mul α] → αProp
IsSquare
a: α
a
IsSquare: {α : Type ?u.29035} → [inst : Mul α] → αProp
IsSquare
b: α
b
IsSquare: {α : Type ?u.29062} → [inst : Mul α] → αProp
IsSquare
(
a: α
a
*
b: α
b
) :=

Goals accomplished! 🐙
F: Type ?u.28464

α: Type u_1

β: Type ?u.28470

R: Type ?u.28473

inst✝: CommSemigroup α

a, b: α


IsSquare aIsSquare bIsSquare (a * b)
F: Type ?u.28464

α: Type u_1

β: Type ?u.28470

R: Type ?u.28473

inst✝: CommSemigroup α

a, b: α


intro.intro
IsSquare (a * a * (b * b))
F: Type ?u.28464

α: Type u_1

β: Type ?u.28470

R: Type ?u.28473

inst✝: CommSemigroup α

a, b: α


IsSquare aIsSquare bIsSquare (a * b)

Goals accomplished! 🐙
#align is_square.mul
IsSquare.mul: ∀ {α : Type u_1} [inst : CommSemigroup α] {a b : α}, IsSquare aIsSquare bIsSquare (a * b)
IsSquare.mul
#align even.add
Even.add: ∀ {α : Type u_1} [inst : AddCommSemigroup α] {a b : α}, Even aEven bEven (a + b)
Even.add
variable (
α: ?m.31079
α
) @[simp] theorem
isSquare_zero: ∀ (α : Type u_1) [inst : MulZeroClass α], IsSquare 0
isSquare_zero
[
MulZeroClass: Type ?u.31094 → Type ?u.31094
MulZeroClass
α: Type ?u.31085
α
] :
IsSquare: {α : Type ?u.31097} → [inst : Mul α] → αProp
IsSquare
(
0: ?m.31125
0
:
α: Type ?u.31085
α
) := ⟨
0: ?m.31621
0
, (
mul_zero: ∀ {M₀ : Type ?u.31915} [self : MulZeroClass M₀] (a : M₀), a * 0 = 0
mul_zero
_: ?m.31916
_
).
symm: ∀ {α : Sort ?u.31927} {a b : α}, a = bb = a
symm
#align is_square_zero
isSquare_zero: ∀ (α : Type u_1) [inst : MulZeroClass α], IsSquare 0
isSquare_zero
variable {
α: ?m.31985
α
} section DivisionMonoid variable [
DivisionMonoid: Type ?u.34445 → Type ?u.34445
DivisionMonoid
α: Type ?u.32008
α
] {
a: α
a
:
α: Type ?u.31991
α
} @[
to_additive: ∀ {α : Type u_1} [inst : SubtractionMonoid α] {a : α}, Even (-a) Even a
to_additive
(attr := simp)] theorem
isSquare_inv: IsSquare a⁻¹ IsSquare a
isSquare_inv
:
IsSquare: {α : Type ?u.32022} → [inst : Mul α] → αProp
IsSquare
a: α
a
⁻¹ ↔
IsSquare: {α : Type ?u.32447} → [inst : Mul α] → αProp
IsSquare
a: α
a
:=

Goals accomplished! 🐙
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α


F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a


refine'_2
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α


F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a


refine'_2
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a⁻¹


refine'_1

Goals accomplished! 🐙
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α


F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a


refine'_2
F: Type ?u.32005

α: Type u_1

β: Type ?u.32011

R: Type ?u.32014

inst✝: DivisionMonoid α

a: α

h: IsSquare a


refine'_2

Goals accomplished! 🐙
#align is_square_inv
isSquare_inv: ∀ {α : Type u_1} [inst : DivisionMonoid α] {a : α}, IsSquare a⁻¹ IsSquare a
isSquare_inv
#align even_neg
even_neg: ∀ {α : Type u_1} [inst : SubtractionMonoid α] {a : α}, Even (-a) Even a
even_neg
alias
isSquare_inv: ∀ {α : Type u_1} [inst : DivisionMonoid α] {a : α}, IsSquare a⁻¹ IsSquare a
isSquare_inv
↔ _
IsSquare.inv: ∀ {α : Type u_1} [inst : DivisionMonoid α] {a : α}, IsSquare aIsSquare a⁻¹
IsSquare.inv
#align is_square.inv
IsSquare.inv: ∀ {α : Type u_1} [inst : DivisionMonoid α] {a : α}, IsSquare aIsSquare a⁻¹
IsSquare.inv
attribute [
to_additive: ∀ {α : Type u_1} [inst : SubtractionMonoid α] {a : α}, Even aEven (-a)
to_additive
]
IsSquare.inv: ∀ {α : Type u_1} [inst : DivisionMonoid α] {a : α}, IsSquare aIsSquare a⁻¹
IsSquare.inv
#align even.neg
Even.neg: ∀ {α : Type u_1} [inst : SubtractionMonoid α] {a : α}, Even aEven (-a)
Even.neg
@[
to_additive: ∀ {α : Type u_1} [inst : SubtractionMonoid α] {a : α} (n : ), Even aEven (n a)
to_additive
] theorem
IsSquare.zpow: ∀ {α : Type u_1} [inst : DivisionMonoid α] {a : α} (n : ), IsSquare aIsSquare (a ^ n)
IsSquare.zpow
(
n:
n
:
: Type
) :
IsSquare: {α : Type ?u.34453} → [inst : Mul α] → αProp
IsSquare
a: α
a
IsSquare: {α : Type ?u.34841} → [inst : Mul α] → αProp
IsSquare
(
a: α
a
^
n:
n
) :=

Goals accomplished! 🐙
F: Type ?u.34433

α: Type u_1

β: Type ?u.34439

R: Type ?u.34442

inst✝: DivisionMonoid α

a: α

n:


IsSquare aIsSquare (a ^ n)
F: Type ?u.34433

α: Type u_1

β: Type ?u.34439

R: Type ?u.34442

inst✝: DivisionMonoid α

n:

a: α


intro
IsSquare ((a * a) ^ n)
F: Type ?u.34433

α: Type u_1

β: Type ?u.34439

R: Type ?u.34442

inst✝: DivisionMonoid α

a: α

n:


IsSquare aIsSquare (a ^ n)

Goals accomplished! 🐙
#align is_square.zpow
IsSquare.zpow: ∀ {α : Type u_1} [inst : DivisionMonoid α] {a : α} (n : ), IsSquare aIsSquare (a ^ n)
IsSquare.zpow
#align even.zsmul
Even.zsmul: ∀ {α : Type u_1} [inst : SubtractionMonoid α] {a : α} (n : ), Even aEven (n a)
Even.zsmul
variable [
HasDistribNeg: (α : Type ?u.44669) → [inst : Mul α] → Type ?u.44669
HasDistribNeg
α: Type ?u.40569
α
] {
n:
n
:
: Type
} theorem
Even.neg_zpow: Even n∀ (a : α), (-a) ^ n = a ^ n
Even.neg_zpow
:
Even: {α : Type ?u.41335} → [inst : Add α] → αProp
Even
n:
n
→ ∀
a: α
a
:
α: Type ?u.40953
α
, (-
a: α
a
) ^
n:
n
=
a: α
a
^
n:
n
:=

Goals accomplished! 🐙
F: Type ?u.40950

α: Type u_1

β: Type ?u.40956

R: Type ?u.40959

inst✝¹: DivisionMonoid α

a: α

inst✝: HasDistribNeg α

n:


Even n∀ (a : α), (-a) ^ n = a ^ n
F: Type ?u.40950

α: Type u_1

β: Type ?u.40956

R: Type ?u.40959

inst✝¹: DivisionMonoid α

a✝: α

inst✝: HasDistribNeg α

c:

a: α


intro
(-a) ^ (c + c) = a ^ (c + c)
F: Type ?u.40950

α: Type u_1

β: Type ?u.40956

R: Type ?u.40959

inst✝¹: DivisionMonoid α

a: α

inst✝: HasDistribNeg α

n:


Even n∀ (a : α), (-a) ^ n = a ^ n

Goals accomplished! 🐙
#align even.neg_zpow
Even.neg_zpow: ∀ {α : Type u_1} [inst : DivisionMonoid α] [inst_1 : HasDistribNeg α] {n : }, Even n∀ (a : α), (-a) ^ n = a ^ n
Even.neg_zpow
theorem
Even.neg_one_zpow: ∀ {α : Type u_1} [inst : DivisionMonoid α] [inst_1 : HasDistribNeg α] {n : }, Even n(-1) ^ n = 1
Even.neg_one_zpow
(
h: Even n
h
:
Even: {α : Type ?u.45036} → [inst : Add α] → αProp
Even
n:
n
) : (-
1: ?m.45074
1
:
α: Type ?u.44655
α
) ^
n:
n
=
1: ?m.45774
1
:=

Goals accomplished! 🐙
F: Type ?u.44652

α: Type u_1

β: Type ?u.44658

R: Type ?u.44661

inst✝¹: DivisionMonoid α

a: α

inst✝: HasDistribNeg α

n:

h: Even n


(-1) ^ n = 1
F: Type ?u.44652

α: Type u_1

β: Type ?u.44658

R: Type ?u.44661

inst✝¹: DivisionMonoid α

a: α

inst✝: HasDistribNeg α

n:

h: Even n


(-1) ^ n = 1
F: Type ?u.44652

α: Type u_1

β: Type ?u.44658

R: Type ?u.44661

inst✝¹: DivisionMonoid α

a: α

inst✝: HasDistribNeg α

n:

h: Even n


1 ^ n = 1
F: Type ?u.44652

α: Type u_1

β: Type ?u.44658

R: Type ?u.44661

inst✝¹: DivisionMonoid α

a: α

inst✝: HasDistribNeg α

n:

h: Even n


(-1) ^ n = 1
F: Type ?u.44652

α: Type u_1

β: Type ?u.44658

R: Type ?u.44661

inst✝¹: DivisionMonoid α

a: α

inst✝: HasDistribNeg α

n:

h: Even n


1 = 1

Goals accomplished! 🐙
#align even.neg_one_zpow
Even.neg_one_zpow: ∀ {α : Type u_1} [inst : DivisionMonoid α] [inst_1 : HasDistribNeg α] {n : }, Even n(-1) ^ n = 1
Even.neg_one_zpow
end DivisionMonoid theorem
even_abs: ∀ [inst : SubtractionMonoid α] [inst_1 : LinearOrder α] {a : α}, Even (abs a) Even a
even_abs
[
SubtractionMonoid: Type ?u.48538 → Type ?u.48538
SubtractionMonoid
α: Type ?u.48529
α
] [
LinearOrder: Type ?u.48541 → Type ?u.48541
LinearOrder
α: Type ?u.48529
α
] {
a: α
a
:
α: Type ?u.48529
α
} :
Even: {α : Type ?u.48546} → [inst : Add α] → αProp
Even
(|
a: α
a
|) ↔
Even: {α : Type ?u.49072} → [inst : Add α] → αProp
Even
a: α
a
:=

Goals accomplished! 🐙
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α


F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = a


inl
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = -a


inr
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α


F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = a


inl
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = a


inl
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = -a


inr
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = a


inl

Goals accomplished! 🐙
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = a


abs a = a

Goals accomplished! 🐙
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = a


inl

Goals accomplished! 🐙
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α


F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = -a


inr
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = -a


inr
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = -a


inr

Goals accomplished! 🐙
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = -a


abs a = -a

Goals accomplished! 🐙
F: Type ?u.48526

α: Type u_1

β: Type ?u.48532

R: Type ?u.48535

inst✝¹: SubtractionMonoid α

inst✝: LinearOrder α

a: α

h✝: abs a = -a


inr

Goals accomplished! 🐙
#align even_abs
even_abs: ∀ {α : Type u_1} [inst : SubtractionMonoid α] [inst_1 : LinearOrder α] {a : α}, Even (abs a) Even a
even_abs
@[
to_additive: ∀ {α : Type u_1} [inst : SubtractionCommMonoid α] {a b : α}, Even aEven bEven (a - b)
to_additive
] theorem
IsSquare.div: ∀ {α : Type u_1} [inst : DivisionCommMonoid α] {a b : α}, IsSquare aIsSquare bIsSquare (a / b)
IsSquare.div
[
DivisionCommMonoid: Type ?u.49659 → Type ?u.49659
DivisionCommMonoid
α: Type ?u.49650
α
] {
a: α
a
b: α
b
:
α: Type ?u.49650
α
} (
ha: IsSquare a
ha
:
IsSquare: {α : Type ?u.49666} → [inst : Mul α] → αProp
IsSquare
a: α
a
) (
hb: IsSquare b
hb
:
IsSquare: {α : Type ?u.50061} → [inst : Mul α] → αProp
IsSquare
b: α
b
) :
IsSquare: {α : Type ?u.50089} → [inst : Mul α] → αProp
IsSquare
(
a: α
a
/
b: α
b
) :=

Goals accomplished! 🐙
F: Type ?u.49647

α: Type u_1

β: Type ?u.49653

R: Type ?u.49656

inst✝: DivisionCommMonoid α

a, b: α

ha: IsSquare a

hb: IsSquare b


IsSquare (a / b)
F: Type ?u.49647

α: Type u_1

β: Type ?u.49653

R: Type ?u.49656

inst✝: DivisionCommMonoid α

a, b: α

ha: IsSquare a

hb: IsSquare b


IsSquare (a / b)
F: Type ?u.49647

α: Type u_1

β: Type ?u.49653

R: Type ?u.49656

inst✝: DivisionCommMonoid α

a, b: α

ha: IsSquare a

hb: IsSquare b


F: Type ?u.49647

α: Type u_1

β: Type ?u.49653

R: Type ?u.49656

inst✝: DivisionCommMonoid α

a, b: α

ha: IsSquare a

hb: IsSquare b


F: Type ?u.49647

α: Type u_1

β: Type ?u.49653

R: Type ?u.49656

inst✝: DivisionCommMonoid α

a, b: α

ha: IsSquare a

hb: IsSquare b


IsSquare (a / b)

Goals accomplished! 🐙
#align is_square.div
IsSquare.div: ∀ {α : Type u_1} [inst : DivisionCommMonoid α] {a b : α}, IsSquare aIsSquare bIsSquare (a / b)
IsSquare.div
#align even.sub
Even.sub: ∀ {α : Type u_1} [inst : SubtractionCommMonoid α] {a b : α}, Even aEven bEven (a - b)
Even.sub
@[to_additive (attr := simp)
Even.zsmul': ∀ {α : Type u_1} [inst : AddGroup α] {n : }, Even n∀ (a : α), Even (n a)
Even.zsmul'
] theorem
Even.isSquare_zpow: ∀ {α : Type u_1} [inst : Group α] {n : }, Even n∀ (a : α), IsSquare (a ^ n)
Even.isSquare_zpow
[
Group: Type ?u.50627 → Type ?u.50627
Group
α: Type ?u.50618
α
] {
n:
n
:
: Type
} :
Even: {α : Type ?u.50633} → [inst : Add α] → αProp
Even
n:
n
→ ∀
a: α
a
:
α: Type ?u.50618
α
,
IsSquare: {α : Type ?u.50666} → [inst : Mul α] → αProp
IsSquare
(
a: α
a
^
n:
n
) :=

Goals accomplished! 🐙
F: Type ?u.50615

α: Type u_1

β: Type ?u.50621

R: Type ?u.50624

inst✝: Group α

n:


Even n∀ (a : α), IsSquare (a ^ n)
F: Type ?u.50615

α: Type u_1

β: Type ?u.50621

R: Type ?u.50624

inst✝: Group α

n:

a: α


intro
IsSquare (a ^ (n + n))
F: Type ?u.50615

α: Type u_1

β: Type ?u.50621

R: Type ?u.50624

inst✝: Group α

n:


Even n∀ (a : α), IsSquare (a ^ n)

Goals accomplished! 🐙
#align even.is_square_zpow
Even.isSquare_zpow: ∀ {α : Type u_1} [inst : Group α] {n : }, Even n∀ (a : α), IsSquare (a ^ n)
Even.isSquare_zpow
#align even.zsmul'
Even.zsmul': ∀ {α : Type u_1} [inst : AddGroup α] {n : }, Even n∀ (a : α), Even (n a)
Even.zsmul'
-- `Odd.tsub` requires `CanonicallyLinearOrderedSemiring`, which we don't have theorem
Even.tsub: ∀ {α : Type u_1} [inst : CanonicallyLinearOrderedAddMonoid α] [inst_1 : Sub α] [inst_2 : OrderedSub α] [inst_3 : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1] {m n : α}, Even mEven nEven (m - n)
Even.tsub
[
CanonicallyLinearOrderedAddMonoid: Type ?u.56426 → Type ?u.56426
CanonicallyLinearOrderedAddMonoid
α: Type ?u.56417
α
] [
Sub: Type ?u.56429 → Type ?u.56429
Sub
α: Type ?u.56417
α
] [
OrderedSub: (α : Type ?u.56432) → [inst : LE α] → [inst : Add α] → [inst : Sub α] → Prop
OrderedSub
α: Type ?u.56417
α
] [
ContravariantClass: (M : Type ?u.57051) → (N : Type ?u.57050) → (MNN) → (NNProp) → Prop
ContravariantClass
α: Type ?u.56417
α
α: Type ?u.56417
α
(· + ·): ααα
(· + ·)
(· ≤ ·): ααProp
(· ≤ ·)
] {
m: α
m
n: α
n
:
α: Type ?u.56417
α
} (
hm: Even m
hm
:
Even: {α : Type ?u.57933} → [inst : Add α] → αProp
Even
m: α
m
) (
hn: Even n
hn
:
Even: {α : Type ?u.58295} → [inst : Add α] → αProp
Even
n: α
n
) :
Even: {α : Type ?u.58321} → [inst : Add α] → αProp
Even
(
m: α
m
-
n: α
n
) :=

Goals accomplished! 🐙
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

m, n: α

hm: Even m

hn: Even n


Even (m - n)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

n: α

hn: Even n

a: α


intro
Even (a + a - n)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

m, n: α

hm: Even m

hn: Even n


Even (m - n)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α


intro.intro
Even (a + a - (b + b))
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

m, n: α

hm: Even m

hn: Even n


Even (m - n)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α


intro.intro
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

m, n: α

hm: Even m

hn: Even n


Even (m - n)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: b a


intro.intro.inr
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

m, n: α

hm: Even m

hn: Even n


Even (m - n)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: b a


intro.intro.inr
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
a + a - (b + b) = 0 + 0
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
0 = 0 + 0
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: a b


intro.intro.inl
0 = 0

Goals accomplished! 🐙
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

m, n: α

hm: Even m

hn: Even n


Even (m - n)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: b a


intro.intro.inr
a + a - (b + b) = a - b + (a - b)
F: Type ?u.56414

α: Type u_1

β: Type ?u.56420

R: Type ?u.56423

inst✝³: CanonicallyLinearOrderedAddMonoid α

inst✝²: Sub α

inst✝¹: OrderedSub α

inst✝: ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1

a, b: α

h: b a


intro.intro.inr
a + a - (b + b) = a - b + (a - b)

Goals accomplished! 🐙
#align even.tsub
Even.tsub: ∀ {α : Type u_1} [inst : CanonicallyLinearOrderedAddMonoid α] [inst_1 : Sub α] [inst_2 : OrderedSub α] [inst_3 : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1] {m n : α}, Even mEven nEven (m - n)
Even.tsub
set_option linter.deprecated false in theorem
even_iff_exists_bit0: ∀ [inst : Add α] {a : α}, Even a b, a = bit0 b
even_iff_exists_bit0
[
Add: Type ?u.60365 → Type ?u.60365
Add
α: Type ?u.60356
α
] {
a: α
a
:
α: Type ?u.60356
α
} :
Even: {α : Type ?u.60370} → [inst : Add α] → αProp
Even
a: α
a
↔ ∃
b: ?m.60382
b
,
a: α
a
=
bit0: {α : Type ?u.60385} → [inst : Add α] → αα
bit0
b: ?m.60382
b
:=
Iff.rfl: ∀ {a : Prop}, a a
Iff.rfl
#align even_iff_exists_bit0
even_iff_exists_bit0: ∀ {α : Type u_1} [inst : Add α] {a : α}, Even a b, a = bit0 b
even_iff_exists_bit0
alias
even_iff_exists_bit0: ∀ {α : Type u_1} [inst : Add α] {a : α}, Even a b, a = bit0 b
even_iff_exists_bit0
Even.exists_bit0: ∀ {α : Type u_1} [inst : Add α] {a : α}, Even ab, a = bit0 b
Even.exists_bit0
_ #align even.exists_bit0
Even.exists_bit0: ∀ {α : Type u_1} [inst : Add α] {a : α}, Even ab, a = bit0 b
Even.exists_bit0
section Semiring variable [
Semiring: Type ?u.66764 → Type ?u.66764
Semiring
α: Type ?u.73988
α
] [
Semiring: Type ?u.60467 → Type ?u.60467
Semiring
β: Type ?u.60480
β
] {
m: α
m
n: α
n
:
α: Type ?u.60455
α
} theorem
even_iff_exists_two_mul: ∀ {α : Type u_1} [inst : Semiring α] (m : α), Even m c, m = 2 * c
even_iff_exists_two_mul
(
m: α
m
:
α: Type ?u.60477
α
) :
Even: {α : Type ?u.60498} → [inst : Add α] → αProp
Even
m: α
m
↔ ∃
c: ?m.60616
c
,
m: α
m
=
2: ?m.60623
2
*
c: ?m.60616
c
:=

Goals accomplished! 🐙
F: Type ?u.60474

α: Type u_1

β: Type ?u.60480

R: Type ?u.60483

inst✝¹: Semiring α

inst✝: Semiring β

m✝, n, m: α


Even m c, m = 2 * c

Goals accomplished! 🐙
#align even_iff_exists_two_mul
even_iff_exists_two_mul: ∀ {α : Type u_1} [inst : Semiring α] (m : α), Even m c, m = 2 * c
even_iff_exists_two_mul
theorem
even_iff_two_dvd: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Even a 2 a
even_iff_two_dvd
{
a: α
a
:
α: Type ?u.63450
α
} :
Even: {α : Type ?u.63471} → [inst : Add α] → αProp
Even
a: α
a
2: ?m.63590
2
a: α
a
:=

Goals accomplished! 🐙
F: Type ?u.63447

α: Type u_1

β: Type ?u.63453

R: Type ?u.63456

inst✝¹: Semiring α

inst✝: Semiring β

m, n, a: α


Even a 2 a

Goals accomplished! 🐙
#align even_iff_two_dvd
even_iff_two_dvd: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Even a 2 a
even_iff_two_dvd
alias
even_iff_two_dvd: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Even a 2 a
even_iff_two_dvd
Even.two_dvd: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Even a2 a
Even.two_dvd
_ #align even.two_dvd
Even.two_dvd: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Even a2 a
Even.two_dvd
theorem
Even.trans_dvd: ∀ {α : Type u_1} [inst : Semiring α] {m n : α}, Even mm nEven n
Even.trans_dvd
(
hm: Even m
hm
:
Even: {α : Type ?u.65976} → [inst : Add α] → αProp
Even
m: α
m
) (
hn: m n
hn
:
m: α
m
n: α
n
) :
Even: {α : Type ?u.66218} → [inst : Add α] → αProp
Even
n: α
n
:=
even_iff_two_dvd: ∀ {α : Type ?u.66247} [inst : Semiring α] {a : α}, Even a 2 a
even_iff_two_dvd
.
2: ∀ {a b : Prop}, (a b) → ba
2
<|
hm: Even m
hm
.
two_dvd: ∀ {α : Type ?u.66279} [inst : Semiring α] {a : α}, Even a2 a
two_dvd
.
trans: ∀ {α : Type ?u.66292} [inst : Semigroup α] {a b c : α}, a bb ca c
trans
hn: m n
hn
#align even.trans_dvd
Even.trans_dvd: ∀ {α : Type u_1} [inst : Semiring α] {m n : α}, Even mm nEven n
Even.trans_dvd
theorem
Dvd.dvd.even: ∀ {α : Type u_1} [inst : Semiring α] {m n : α}, m nEven mEven n
Dvd.dvd.even
(
hn: m n
hn
:
m: α
m
n: α
n
) (
hm: Even m
hm
:
Even: {α : Type ?u.66555} → [inst : Add α] → αProp
Even
m: α
m
) :
Even: {α : Type ?u.66682} → [inst : Add α] → αProp
Even
n: α
n
:=
hm: Even m
hm
.
trans_dvd: ∀ {α : Type ?u.66711} [inst : Semiring α] {m n : α}, Even mm nEven n
trans_dvd
hn: m n
hn
#align has_dvd.dvd.even
Dvd.dvd.even: ∀ {α : Type u_1} [inst : Semiring α] {m n : α}, m nEven mEven n
Dvd.dvd.even
@[simp] theorem
range_two_mul: ∀ (α : Type u_1) [inst : Semiring α], (Set.range fun x => 2 * x) = { a | Even a }
range_two_mul
(
α: ?m.66774
α
) [
Semiring: Type ?u.66777 → Type ?u.66777
Semiring
α: ?m.66774
α
] : (
Set.range: {α : Type ?u.66782} → {ι : Sort ?u.66781} → (ια) → Set α
Set.range
fun
x: α
x
:
α: ?m.66774
α
=>
2: ?m.66791
2
*
x: α
x
) = {
a: ?m.67069
a
|
Even: {α : Type ?u.67071} → [inst : Add α] → αProp
Even
a: ?m.67069
a
} :=

Goals accomplished! 🐙
F: Type ?u.66752

α✝: Type ?u.66755

β: Type ?u.66758

R: Type ?u.66761

inst✝²: Semiring α✝

inst✝¹: Semiring β

m, n: α✝

α: Type u_1

inst✝: Semiring α


(Set.range fun x => 2 * x) = { a | Even a }
F: Type ?u.66752

α✝: Type ?u.66755

β: Type ?u.66758

R: Type ?u.66761

inst✝²: Semiring α✝

inst✝¹: Semiring β

m, n: α✝

α: Type u_1

inst✝: Semiring α

x: α


h
(x Set.range fun x => 2 * x) x { a | Even a }
F: Type ?u.66752

α✝: Type ?u.66755

β: Type ?u.66758

R: Type ?u.66761

inst✝²: Semiring α✝

inst✝¹: Semiring β

m, n: α✝

α: Type u_1

inst✝: Semiring α


(Set.range fun x => 2 * x) = { a | Even a }

Goals accomplished! 🐙
#align range_two_mul
range_two_mul: ∀ (α : Type u_1) [inst : Semiring α], (Set.range fun x => 2 * x) = { a | Even a }
range_two_mul
set_option linter.deprecated false in @[simp] theorem
even_bit0: ∀ {α : Type u_1} [inst : Semiring α] (a : α), Even (bit0 a)
even_bit0
(
a: α
a
:
α: Type ?u.71899
α
) :
Even: {α : Type ?u.71920} → [inst : Add α] → αProp
Even
(
bit0: {α : Type ?u.71944} → [inst : Add α] → αα
bit0
a: α
a
) := ⟨
a: α
a
,
rfl: ∀ {α : Sort ?u.72095} {a : α}, a = a
rfl
#align even_bit0
even_bit0: ∀ {α : Type u_1} [inst : Semiring α] (a : α), Even (bit0 a)
even_bit0
@[simp] theorem
even_two: ∀ {α : Type u_1} [inst : Semiring α], Even 2
even_two
:
Even: {α : Type ?u.72144} → [inst : Add α] → αProp
Even
(
2: ?m.72170
2
:
α: Type ?u.72125
α
) := ⟨
1: ?m.72329
1
,

Goals accomplished! 🐙
F: Type ?u.72122

α: Type u_1

β: Type ?u.72128

R: Type ?u.72131

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


2 = 1 + 1
F: Type ?u.72122

α: Type u_1

β: Type ?u.72128

R: Type ?u.72131

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


2 = 1 + 1
F: Type ?u.72122

α: Type u_1

β: Type ?u.72128

R: Type ?u.72131

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


2 = 2

Goals accomplished! 🐙
#align even_two
even_two: ∀ {α : Type u_1} [inst : Semiring α], Even 2
even_two
@[simp] theorem
Even.mul_left: ∀ {α : Type u_1} [inst : Semiring α] {m : α}, Even m∀ (n : α), Even (n * m)
Even.mul_left
(
hm: Even m
hm
:
Even: {α : Type ?u.72553} → [inst : Add α] → αProp
Even
m: α
m
) (
n: ?m.72691
n
) :
Even: {α : Type ?u.72694} → [inst : Add α] → αProp
Even
(
n: ?m.72691
n
*
m: α
m
) :=
hm: Even m
hm
.
map: ∀ {F : Type ?u.72925} {α : Type ?u.72923} {β : Type ?u.72924} [inst : AddZeroClass α] [inst_1 : AddZeroClass β] [inst_2 : AddMonoidHomClass F α β] {m : α} (f : F), Even mEven (f m)
map
(
AddMonoidHom.mulLeft: {R : Type ?u.72942} → [inst : NonUnitalNonAssocSemiring R] → RR →+ R
AddMonoidHom.mulLeft
n: α
n
) #align even.mul_left
Even.mul_left: ∀ {α : Type u_1} [inst : Semiring α] {m : α}, Even m∀ (n : α), Even (n * m)
Even.mul_left
@[simp] theorem
Even.mul_right: Even m∀ (n : α), Even (m * n)
Even.mul_right
(
hm: Even m
hm
:
Even: {α : Type ?u.73280} → [inst : Add α] → αProp
Even
m: α
m
) (
n: α
n
) :
Even: {α : Type ?u.73421} → [inst : Add α] → αProp
Even
(
m: α
m
*
n: ?m.73418
n
) :=
hm: Even m
hm
.
map: ∀ {F : Type ?u.73652} {α : Type ?u.73650} {β : Type ?u.73651} [inst : AddZeroClass α] [inst_1 : AddZeroClass β] [inst_2 : AddMonoidHomClass F α β] {m : α} (f : F), Even mEven (f m)
map
(
AddMonoidHom.mulRight: {R : Type ?u.73669} → [inst : NonUnitalNonAssocSemiring R] → RR →+ R
AddMonoidHom.mulRight
n: α
n
) #align even.mul_right
Even.mul_right: ∀ {α : Type u_1} [inst : Semiring α] {m : α}, Even m∀ (n : α), Even (m * n)
Even.mul_right
theorem
even_two_mul: ∀ {α : Type u_1} [inst : Semiring α] (m : α), Even (2 * m)
even_two_mul
(
m: α
m
:
α: Type ?u.73988
α
) :
Even: {α : Type ?u.74009} → [inst : Add α] → αProp
Even
(
2: ?m.74037
2
*
m: α
m
) := ⟨
m: α
m
,
two_mul: ∀ {α : Type ?u.74405} [inst : NonAssocSemiring α] (n : α), 2 * n = n + n
two_mul
_: ?m.74406
_
#align even_two_mul
even_two_mul: ∀ {α : Type u_1} [inst : Semiring α] (m : α), Even (2 * m)
even_two_mul
theorem
Even.pow_of_ne_zero: Even m∀ {a : }, a 0Even (m ^ a)
Even.pow_of_ne_zero
(
hm: Even m
hm
:
Even: {α : Type ?u.74486} → [inst : Add α] → αProp
Even
m: α
m
) : ∀ {
a:
a
:
: Type
},
a:
a
0: ?m.74631
0
Even: {α : Type ?u.74642} → [inst : Add α] → αProp
Even
(
m: α
m
^
a:
a
) |
0:
0
,
a0: 0 0
a0
=> (
a0: 0 0
a0
rfl: ∀ {α : Sort ?u.74815} {a : α}, a = a
rfl
).
elim: ∀ {C : Sort ?u.74821}, FalseC
elim
|
a:
a
+ 1, _ =>

Goals accomplished! 🐙
F: Type ?u.74464

α: Type u_1

β: Type ?u.74470

R: Type ?u.74473

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Even m

a:

x✝: a + 1 0


Even (m ^ (a + 1))
F: Type ?u.74464

α: Type u_1

β: Type ?u.74470

R: Type ?u.74473

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Even m

a:

x✝: a + 1 0


Even (m ^ (a + 1))
F: Type ?u.74464

α: Type u_1

β: Type ?u.74470

R: Type ?u.74473

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Even m

a:

x✝: a + 1 0


Even (m * m ^ a)
F: Type ?u.74464

α: Type u_1

β: Type ?u.74470

R: Type ?u.74473

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Even m

a:

x✝: a + 1 0


Even (m * m ^ a)
F: Type ?u.74464

α: Type u_1

β: Type ?u.74470

R: Type ?u.74473

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Even m

a:

x✝: a + 1 0


Even (m ^ (a + 1))

Goals accomplished! 🐙
#align even.pow_of_ne_zero
Even.pow_of_ne_zero: ∀ {α : Type u_1} [inst : Semiring α] {m : α}, Even m∀ {a : }, a 0Even (m ^ a)
Even.pow_of_ne_zero
section WithOdd /-- An element `a` of a semiring is odd if there exists `k` such `a = 2*k + 1`. -/ def
Odd: {α : Type u_1} → [inst : Semiring α] → αProp
Odd
(
a: α
a
:
α: Type ?u.75156
α
) :
Prop: Type
Prop
:= ∃
k: ?m.75182
k
,
a: α
a
=
2: ?m.75192
2
*
k: ?m.75182
k
+
1: ?m.75202
1
#align odd
Odd: {α : Type u_1} → [inst : Semiring α] → αProp
Odd
set_option linter.deprecated false in theorem
odd_iff_exists_bit1: ∀ {a : α}, Odd a b, a = bit1 b
odd_iff_exists_bit1
{
a: α
a
:
α: Type ?u.75710
α
} :
Odd: {α : Type ?u.75731} → [inst : Semiring α] → αProp
Odd
a: α
a
↔ ∃
b: ?m.75745
b
,
a: α
a
=
bit1: {α : Type ?u.75748} → [inst : One α] → [inst : Add α] → αα
bit1
b: ?m.75745
b
:=
exists_congr: ∀ {α : Sort ?u.75997} {p q : αProp}, (∀ (a : α), p a q a) → ((a, p a) a, q a)
exists_congr
fun
b: ?m.76013
b
=>

Goals accomplished! 🐙
F: Type ?u.75707

α: Type u_1

β: Type ?u.75713

R: Type ?u.75716

inst✝¹: Semiring α

inst✝: Semiring β

m, n, a, b: α


a = 2 * b + 1 a = bit1 b
F: Type ?u.75707

α: Type u_1

β: Type ?u.75713

R: Type ?u.75716

inst✝¹: Semiring α

inst✝: Semiring β

m, n, a, b: α


a = 2 * b + 1 a = bit1 b
F: Type ?u.75707

α: Type u_1

β: Type ?u.75713

R: Type ?u.75716

inst✝¹: Semiring α

inst✝: Semiring β

m, n, a, b: α


a = b + b + 1 a = bit1 b
F: Type ?u.75707

α: Type u_1

β: Type ?u.75713

R: Type ?u.75716

inst✝¹: Semiring α

inst✝: Semiring β

m, n, a, b: α


a = b + b + 1 a = bit1 b
F: Type ?u.75707

α: Type u_1

β: Type ?u.75713

R: Type ?u.75716

inst✝¹: Semiring α

inst✝: Semiring β

m, n, a, b: α


a = 2 * b + 1 a = bit1 b

Goals accomplished! 🐙
#align odd_iff_exists_bit1
odd_iff_exists_bit1: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Odd a b, a = bit1 b
odd_iff_exists_bit1
alias
odd_iff_exists_bit1: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Odd a b, a = bit1 b
odd_iff_exists_bit1
Odd.exists_bit1: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Odd ab, a = bit1 b
Odd.exists_bit1
_ #align odd.exists_bit1
Odd.exists_bit1: ∀ {α : Type u_1} [inst : Semiring α] {a : α}, Odd ab, a = bit1 b
Odd.exists_bit1
set_option linter.deprecated false in @[simp] theorem
odd_bit1: ∀ (a : α), Odd (bit1 a)
odd_bit1
(
a: α
a
:
α: Type ?u.76131
α
) :
Odd: {α : Type ?u.76152} → [inst : Semiring α] → αProp
Odd
(
bit1: {α : Type ?u.76163} → [inst : One α] → [inst : Add α] → αα
bit1
a: α
a
) :=
odd_iff_exists_bit1: ∀ {α : Type ?u.76366} [inst : Semiring α] {a : α}, Odd a b, a = bit1 b
odd_iff_exists_bit1
.
2: ∀ {a b : Prop}, (a b) → ba
2
a: α
a
,
rfl: ∀ {α : Sort ?u.76398} {a : α}, a = a
rfl
#align odd_bit1
odd_bit1: ∀ {α : Type u_1} [inst : Semiring α] (a : α), Odd (bit1 a)
odd_bit1
@[simp] theorem
range_two_mul_add_one: ∀ (α : Type u_1) [inst : Semiring α], (Set.range fun x => 2 * x + 1) = { a | Odd a }
range_two_mul_add_one
(
α: Type u_1
α
:
Type _: Type (?u.76455+1)
Type _
) [
Semiring: Type ?u.76458 → Type ?u.76458
Semiring
α: Type ?u.76455
α
] : (
Set.range: {α : Type ?u.76463} → {ι : Sort ?u.76462} → (ια) → Set α
Set.range
fun
x: α
x
:
α: Type ?u.76455
α
=>
2: ?m.76475
2
*
x: α
x
+
1: ?m.76485
1
) = {
a: ?m.76990
a
|
Odd: {α : Type ?u.76992} → [inst : Semiring α] → αProp
Odd
a: ?m.76990
a
} :=

Goals accomplished! 🐙
F: Type ?u.76433

α✝: Type ?u.76436

β: Type ?u.76439

R: Type ?u.76442

inst✝²: Semiring α✝

inst✝¹: Semiring β

m, n: α✝

α: Type u_1

inst✝: Semiring α


(Set.range fun x => 2 * x + 1) = { a | Odd a }
F: Type ?u.76433

α✝: Type ?u.76436

β: Type ?u.76439

R: Type ?u.76442

inst✝²: Semiring α✝

inst✝¹: Semiring β

m, n: α✝

α: Type u_1

inst✝: Semiring α

x: α


h
(x Set.range fun x => 2 * x + 1) x { a | Odd a }
F: Type ?u.76433

α✝: Type ?u.76436

β: Type ?u.76439

R: Type ?u.76442

inst✝²: Semiring α✝

inst✝¹: Semiring β

m, n: α✝

α: Type u_1

inst✝: Semiring α


(Set.range fun x => 2 * x + 1) = { a | Odd a }

Goals accomplished! 🐙
#align range_two_mul_add_one
range_two_mul_add_one: ∀ (α : Type u_1) [inst : Semiring α], (Set.range fun x => 2 * x + 1) = { a | Odd a }
range_two_mul_add_one
theorem
Even.add_odd: Even mOdd nOdd (m + n)
Even.add_odd
:
Even: {α : Type ?u.81639} → [inst : Add α] → αProp
Even
m: α
m
Odd: {α : Type ?u.81777} → [inst : Semiring α] → αProp
Odd
n: α
n
Odd: {α : Type ?u.81795} → [inst : Semiring α] → αProp
Odd
(
m: α
m
+
n: α
n
) :=

Goals accomplished! 🐙
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Even mOdd nOdd (m + n)
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
Odd (m + m + (2 * n + 1))
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Even mOdd nOdd (m + n)
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
Odd (m + m + (2 * n + 1))

Goals accomplished! 🐙
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


m + m + (2 * n + 1) = 2 * (m + n) + 1
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


m + m + (2 * n + 1) = 2 * (m + n) + 1
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


m + m + (2 * n + 1) = 2 * m + 2 * n + 1
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


m + m + (2 * n + 1) = 2 * (m + n) + 1
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


2 * m + (2 * n + 1) = 2 * m + 2 * n + 1
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


m + m + (2 * n + 1) = 2 * (m + n) + 1
F: Type ?u.81616

α: Type u_1

β: Type ?u.81622

R: Type ?u.81625

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


2 * m + (2 * n + 1) = 2 * m + (2 * n + 1)

Goals accomplished! 🐙

Goals accomplished! 🐙
#align even.add_odd
Even.add_odd: ∀ {α : Type u_1} [inst : Semiring α] {m n : α}, Even mOdd nOdd (m + n)
Even.add_odd
theorem
Odd.add_even: ∀ {α : Type u_1} [inst : Semiring α] {m n : α}, Odd mEven nOdd (m + n)
Odd.add_even
(
hm: Odd m
hm
:
Odd: {α : Type ?u.82997} → [inst : Semiring α] → αProp
Odd
m: α
m
) (
hn: Even n
hn
:
Even: {α : Type ?u.83018} → [inst : Add α] → αProp
Even
n: α
n
) :
Odd: {α : Type ?u.83154} → [inst : Semiring α] → αProp
Odd
(
m: α
m
+
n: α
n
) :=

Goals accomplished! 🐙
F: Type ?u.82975

α: Type u_1

β: Type ?u.82981

R: Type ?u.82984

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Odd m

hn: Even n


Odd (m + n)
F: Type ?u.82975

α: Type u_1

β: Type ?u.82981

R: Type ?u.82984

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Odd m

hn: Even n


Odd (m + n)
F: Type ?u.82975

α: Type u_1

β: Type ?u.82981

R: Type ?u.82984

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Odd m

hn: Even n


Odd (n + m)
F: Type ?u.82975

α: Type u_1

β: Type ?u.82981

R: Type ?u.82984

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Odd m

hn: Even n


Odd (n + m)
F: Type ?u.82975

α: Type u_1

β: Type ?u.82981

R: Type ?u.82984

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α

hm: Odd m

hn: Even n


Odd (m + n)

Goals accomplished! 🐙
#align odd.add_even
Odd.add_even: ∀ {α : Type u_1} [inst : Semiring α] {m n : α}, Odd mEven nOdd (m + n)
Odd.add_even
theorem
Odd.add_odd: Odd mOdd nEven (m + n)
Odd.add_odd
:
Odd: {α : Type ?u.83729} → [inst : Semiring α] → αProp
Odd
m: α
m
Odd: {α : Type ?u.83750} → [inst : Semiring α] → αProp
Odd
n: α
n
Even: {α : Type ?u.83762} → [inst : Add α] → αProp
Even
(
m: α
m
+
n: α
n
) :=

Goals accomplished! 🐙
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Odd mOdd nEven (m + n)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
Even (2 * m + 1 + (2 * n + 1))
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Odd mOdd nEven (m + n)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
2 * m + 1 + (2 * n + 1) = n + m + 1 + (n + m + 1)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Odd mOdd nEven (m + n)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
2 * m + 1 + (2 * n + 1) = n + m + 1 + (n + m + 1)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
m + m + 1 + (2 * n + 1) = n + m + 1 + (n + m + 1)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
2 * m + 1 + (2 * n + 1) = n + m + 1 + (n + m + 1)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
m + m + 1 + (n + n + 1) = n + m + 1 + (n + m + 1)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
m + m + 1 + (n + n + 1) = n + m + 1 + (n + m + 1)
F: Type ?u.83706

α: Type u_1

β: Type ?u.83712

R: Type ?u.83715

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Odd mOdd nEven (m + n)

Goals accomplished! 🐙
#align odd.add_odd
Odd.add_odd: ∀ {α : Type u_1} [inst : Semiring α] {m n : α}, Odd mOdd nEven (m + n)
Odd.add_odd
@[simp] theorem
odd_one: ∀ {α : Type u_1} [inst : Semiring α], Odd 1
odd_one
:
Odd: {α : Type ?u.85288} → [inst : Semiring α] → αProp
Odd
(
1: ?m.85301
1
:
α: Type ?u.85269
α
) := ⟨
0: ?m.85358
0
, (
zero_add: ∀ {M : Type ?u.85490} [inst : AddZeroClass M] (a : M), 0 + a = a
zero_add
_: ?m.85491
_
).
symm: ∀ {α : Sort ?u.85508} {a b : α}, a = bb = a
symm
.
trans: ∀ {α : Sort ?u.85515} {a b c : α}, a = bb = ca = c
trans
(
congr_arg: ∀ {α : Sort ?u.85530} {β : Sort ?u.85529} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congr_arg
(· + (1 :
α: Type ?u.85269
α
)) (
mul_zero: ∀ {M₀ : Type ?u.85885} [self : MulZeroClass M₀] (a : M₀), a * 0 = 0
mul_zero
_: ?m.85886
_
).
symm: ∀ {α : Sort ?u.85899} {a b : α}, a = bb = a
symm
)⟩ #align odd_one
odd_one: ∀ {α : Type u_1} [inst : Semiring α], Odd 1
odd_one
@[simp] theorem
odd_two_mul_add_one: ∀ {α : Type u_1} [inst : Semiring α] (m : α), Odd (2 * m + 1)
odd_two_mul_add_one
(
m: α
m
:
α: Type ?u.86027
α
) :
Odd: {α : Type ?u.86048} → [inst : Semiring α] → αProp
Odd
(
2: ?m.86066
2
*
m: α
m
+
1: ?m.86076
1
) := ⟨
m: α
m
,
rfl: ∀ {α : Sort ?u.86590} {a : α}, a = a
rfl
#align odd_two_mul_add_one
odd_two_mul_add_one: ∀ {α : Type u_1} [inst : Semiring α] (m : α), Odd (2 * m + 1)
odd_two_mul_add_one
theorem
Odd.map: ∀ [inst : RingHomClass F α β] (f : F), Odd mOdd (f m)
Odd.map
[
RingHomClass: Type ?u.86657 → (α : outParam (Type ?u.86656)) → (β : outParam (Type ?u.86655)) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (max(max?u.86657?u.86656)?u.86655)
RingHomClass
F: Type ?u.86633
F
α: Type ?u.86636
α
β: Type ?u.86639
β
] (
f: F
f
:
F: Type ?u.86633
F
) :
Odd: {α : Type ?u.86695} → [inst : Semiring α] → αProp
Odd
m: α
m
Odd: {α : Type ?u.86713} → [inst : Semiring α] → αProp
Odd
(
f: F
f
m: α
m
) :=

Goals accomplished! 🐙
F: Type u_1

α: Type u_2

β: Type u_3

R: Type ?u.86642

inst✝²: Semiring α

inst✝¹: Semiring β

m, n: α

inst✝: RingHomClass F α β

f: F


Odd mOdd (f m)
F: Type u_1

α: Type u_2

β: Type u_3

R: Type ?u.86642

inst✝²: Semiring α

inst✝¹: Semiring β

n: α

inst✝: RingHomClass F α β

f: F

m: α


intro
Odd (f (2 * m + 1))
F: Type u_1

α: Type u_2

β: Type u_3

R: Type ?u.86642

inst✝²: Semiring α

inst✝¹: Semiring β

m, n: α

inst✝: RingHomClass F α β

f: F


Odd mOdd (f m)
F: Type u_1

α: Type u_2

β: Type u_3

R: Type ?u.86642

inst✝²: Semiring α

inst✝¹: Semiring β

n: α

inst✝: RingHomClass F α β

f: F

m: α


intro
Odd (f (2 * m + 1))

Goals accomplished! 🐙
F: Type u_1

α: Type u_2

β: Type u_3

R: Type ?u.86642

inst✝²: Semiring α

inst✝¹: Semiring β

n: α

inst✝: RingHomClass F α β

f: F

m: α


f (2 * m + 1) = 2 * f m + 1

Goals accomplished! 🐙

Goals accomplished! 🐙
#align odd.map
Odd.map: ∀ {F : Type u_1} {α : Type u_2} {β : Type u_3} [inst : Semiring α] [inst_1 : Semiring β] {m : α} [inst_2 : RingHomClass F α β] (f : F), Odd mOdd (f m)
Odd.map
@[simp] theorem
Odd.mul: Odd mOdd nOdd (m * n)
Odd.mul
:
Odd: {α : Type ?u.88882} → [inst : Semiring α] → αProp
Odd
m: α
m
Odd: {α : Type ?u.88903} → [inst : Semiring α] → αProp
Odd
n: α
n
Odd: {α : Type ?u.88915} → [inst : Semiring α] → αProp
Odd
(
m: α
m
*
n: α
n
) :=

Goals accomplished! 🐙
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Odd mOdd nOdd (m * n)
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
Odd ((2 * m + 1) * (2 * n + 1))
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Odd mOdd nOdd (m * n)
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
(2 * m + 1) * (2 * n + 1) = 2 * (2 * m * n + n + m) + 1
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


Odd mOdd nOdd (m * n)
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
(2 * m + 1) * (2 * n + 1) = 2 * (2 * m * n + n + m) + 1
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
(2 * m + 1) * (2 * n) + (2 * m + 1) * 1 = 2 * (2 * m * n + n + m) + 1
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
(2 * m + 1) * (2 * n + 1) = 2 * (2 * m * n + n + m) + 1
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
2 * m * (2 * n) + 1 * (2 * n) + (2 * m + 1) * 1 = 2 * (2 * m * n + n + m) + 1
F: Type ?u.88859

α: Type u_1

β: Type ?u.88865

R: Type ?u.88868

inst✝¹: Semiring α

inst✝: Semiring β

m, n: α


intro.intro
(2 * m + 1) * (2 * n + 1) = 2 * (2 * m * n + n + m) + 1