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

! This file was ported from Lean 3 source module data.int.order.units
! leanprover-community/mathlib commit d012cd09a9b256d870751284dd6a29882b0be105
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Int.Order.Basic
import Mathlib.Data.Int.Units
import Mathlib.Algebra.GroupPower.Order

/-!
# Lemmas about units in `ℤ`, which interact with the order structure.
-/


namespace Int

theorem 
isUnit_iff_abs_eq: ∀ {x : }, IsUnit x abs x = 1
isUnit_iff_abs_eq
{
x:
x
:
: Type
} :
IsUnit: {M : Type ?u.4} → [inst : Monoid M] → MProp
IsUnit
x:
x
abs: {α : Type ?u.15} → [self : Abs α] → αα
abs
x:
x
=
1: ?m.121
1
:=

Goals accomplished! 🐙
x:


IsUnit x abs x = 1
x:


IsUnit x abs x = 1
x:


natAbs x = 1 abs x = 1
x:


IsUnit x abs x = 1
x:


natAbs x = 1 ↑(natAbs x) = 1
x:


IsUnit x abs x = 1
x:


natAbs x = 1 ↑(natAbs x) = 1
x:


IsUnit x abs x = 1
x:


natAbs x = 1 natAbs x = 1

Goals accomplished! 🐙
#align int.is_unit_iff_abs_eq
Int.isUnit_iff_abs_eq: ∀ {x : }, IsUnit x abs x = 1
Int.isUnit_iff_abs_eq
theorem
isUnit_sq: ∀ {a : }, IsUnit aa ^ 2 = 1
isUnit_sq
{
a:
a
:
: Type
} (
ha: IsUnit a
ha
:
IsUnit: {M : Type ?u.198} → [inst : Monoid M] → MProp
IsUnit
a:
a
) :
a:
a
^
2: ?m.232
2
=
1: ?m.246
1
:=

Goals accomplished! 🐙
a:

ha: IsUnit a


a ^ 2 = 1
a:

ha: IsUnit a


a ^ 2 = 1
a:

ha: IsUnit a


a * a = 1
a:

ha: IsUnit a


a ^ 2 = 1
a:

ha: IsUnit a


1 = 1

Goals accomplished! 🐙
#align int.is_unit_sq
Int.isUnit_sq: ∀ {a : }, IsUnit aa ^ 2 = 1
Int.isUnit_sq
@[simp] theorem
units_sq: ∀ (u : ˣ), u ^ 2 = 1
units_sq
(u :
: Type
ˣ) : u ^
2: ?m.533
2
=
1: ?m.547
1
:=

Goals accomplished! 🐙

u ^ 2 = 1

u ^ 2 = 1

↑(u ^ 2) = 1

u ^ 2 = 1

u ^ 2 = 1

u ^ 2 = 1

u ^ 2 = 1

u ^ 2 = 1

1 = 1

Goals accomplished! 🐙
#align int.units_sq
Int.units_sq: ∀ (u : ˣ), u ^ 2 = 1
Int.units_sq
alias
units_sq: ∀ (u : ˣ), u ^ 2 = 1
units_sq
units_pow_two: ∀ (u : ˣ), u ^ 2 = 1
units_pow_two
#align int.units_pow_two
Int.units_pow_two: ∀ (u : ˣ), u ^ 2 = 1
Int.units_pow_two
@[simp] theorem
units_mul_self: ∀ (u : ˣ), u * u = 1
units_mul_self
(u :
: Type
ˣ) : u * u =
1: ?m.1441
1
:=

Goals accomplished! 🐙

u * u = 1

u * u = 1

u ^ 2 = 1

u * u = 1

1 = 1

Goals accomplished! 🐙
#align int.units_mul_self
Int.units_mul_self: ∀ (u : ˣ), u * u = 1
Int.units_mul_self
@[simp] theorem
units_inv_eq_self: ∀ (u : ˣ), u⁻¹ = u
units_inv_eq_self
(u :
: Type
ˣ) : u⁻¹ = u :=

Goals accomplished! 🐙

u * u = 1

1 = 1

Goals accomplished! 🐙
#align int.units_inv_eq_self
Int.units_inv_eq_self: ∀ (u : ˣ), u⁻¹ = u
Int.units_inv_eq_self
-- `Units.val_mul` is a "wrong turn" for the simplifier, this undoes it and simplifies further @[simp] theorem
units_coe_mul_self: ∀ (u : ˣ), u * u = 1
units_coe_mul_self
(u :
: Type
ˣ) : (u * u :
: Type
) =
1: ?m.5822
1
:=

Goals accomplished! 🐙

u * u = 1

u * u = 1

↑(u * u) = 1

u * u = 1

1 = 1

u * u = 1

1 = 1

Goals accomplished! 🐙
#align int.units_coe_mul_self
Int.units_coe_mul_self: ∀ (u : ˣ), u * u = 1
Int.units_coe_mul_self
@[simp] theorem
neg_one_pow_ne_zero: ∀ {n : }, (-1) ^ n 0
neg_one_pow_ne_zero
{
n:
n
:
: Type
} : (-
1: ?m.6040
1
:
: Type
) ^
n:
n
0: ?m.6215
0
:=
pow_ne_zero: ∀ {M : Type ?u.6224} [inst : MonoidWithZero M] [inst_1 : NoZeroDivisors M] {a : M} (n : ), a 0a ^ n 0
pow_ne_zero
_:
_
(
abs_pos: ∀ {α : Type ?u.6311} [inst : AddGroup α] [inst_1 : LinearOrder α] [inst_2 : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1] {a : α}, 0 < abs a a 0
abs_pos
.
mp: ∀ {a b : Prop}, (a b) → ab
mp
(

Goals accomplished! 🐙
n:


0 < abs (-1)

Goals accomplished! 🐙
)) #align int.neg_one_pow_ne_zero
Int.neg_one_pow_ne_zero: ∀ {n : }, (-1) ^ n 0
Int.neg_one_pow_ne_zero
theorem
sq_eq_one_of_sq_lt_four: ∀ {x : }, x ^ 2 < 4x 0x ^ 2 = 1
sq_eq_one_of_sq_lt_four
{
x:
x
:
: Type
} (
h1: x ^ 2 < 4
h1
:
x:
x
^
2: ?m.6664
2
<
4: ?m.6678
4
) (
h2: x 0
h2
:
x:
x
0: ?m.6830
0
) :
x:
x
^
2: ?m.6843
2
=
1: ?m.6857
1
:=
sq_eq_one_iff: ∀ {R : Type ?u.7036} [inst : Ring R] {a : R} [inst_1 : NoZeroDivisors R], a ^ 2 = 1 a = 1 a = -1
sq_eq_one_iff
.
mpr: ∀ {a b : Prop}, (a b) → ba
mpr
((
abs_eq: ∀ {α : Type ?u.7090} [inst : LinearOrderedAddCommGroup α] {a b : α}, 0 b → (abs a = b a = b a = -b)
abs_eq
(
zero_le_one': ∀ (α : Type ?u.7095) [inst : Zero α] [inst_1 : One α] [inst_2 : LE α] [inst_3 : ZeroLEOneClass α], 0 1
zero_le_one'
: Type
)).
mp: ∀ {a b : Prop}, (a b) → ab
mp
(
le_antisymm: ∀ {α : Type ?u.7331} [inst : PartialOrder α] {a b : α}, a bb aa = b
le_antisymm
(
lt_add_one_iff: ∀ {a b : }, a < b + 1 a b
lt_add_one_iff
.
mp: ∀ {a b : Prop}, (a b) → ab
mp
(
abs_lt_of_sq_lt_sq: ∀ {R : Type ?u.7406} [inst : LinearOrderedRing R] {x y : R}, x ^ 2 < y ^ 20 yabs x < y
abs_lt_of_sq_lt_sq
h1: x ^ 2 < 4
h1
zero_le_two: ∀ {α : Type ?u.7506} [inst : AddMonoidWithOne α] [inst_1 : Preorder α] [inst_2 : ZeroLEOneClass α] [inst_3 : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1], 0 2
zero_le_two
)) (
sub_one_lt_iff: ∀ {a b : }, a - 1 < b a b
sub_one_lt_iff
.
mp: ∀ {a b : Prop}, (a b) → ab
mp
(
abs_pos: ∀ {α : Type ?u.7839} [inst : AddGroup α] [inst_1 : LinearOrder α] [inst_2 : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1] {a : α}, 0 < abs a a 0
abs_pos
.
mpr: ∀ {a b : Prop}, (a b) → ba
mpr
h2: x 0
h2
)))) #align int.sq_eq_one_of_sq_lt_four
Int.sq_eq_one_of_sq_lt_four: ∀ {x : }, x ^ 2 < 4x 0x ^ 2 = 1
Int.sq_eq_one_of_sq_lt_four
theorem
sq_eq_one_of_sq_le_three: ∀ {x : }, x ^ 2 3x 0x ^ 2 = 1
sq_eq_one_of_sq_le_three
{
x:
x
:
: Type
} (
h1: x ^ 2 3
h1
:
x:
x
^
2: ?m.8089
2
3: ?m.8103
3
) (
h2: x 0
h2
:
x:
x
0: ?m.8255
0
) :
x:
x
^
2: ?m.8268
2
=
1: ?m.8282
1
:=
sq_eq_one_of_sq_lt_four: ∀ {x : }, x ^ 2 < 4x 0x ^ 2 = 1
sq_eq_one_of_sq_lt_four
(
lt_of_le_of_lt: ∀ {α : Type ?u.8471} [inst : Preorder α] {a b c : α}, a bb < ca < c
lt_of_le_of_lt
h1: x ^ 2 3
h1
(
lt_add_one: ∀ {α : Type ?u.8552} [inst : One α] [inst_1 : AddZeroClass α] [inst_2 : PartialOrder α] [inst_3 : ZeroLEOneClass α] [inst_4 : NeZero 1] [inst_5 : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1] (a : α), a < a + 1
lt_add_one
(
3: ?m.8562
3
:
: Type
)))
h2: x 0
h2
#align int.sq_eq_one_of_sq_le_three
Int.sq_eq_one_of_sq_le_three: ∀ {x : }, x ^ 2 3x 0x ^ 2 = 1
Int.sq_eq_one_of_sq_le_three
theorem
units_pow_eq_pow_mod_two: ∀ (u : ˣ) (n : ), u ^ n = u ^ (n % 2)
units_pow_eq_pow_mod_two
(u :
: Type
ˣ) (
n:
n
:
: Type
) : u ^
n:
n
= u ^ (
n:
n
%
2: ?m.8912
2
) :=

Goals accomplished! 🐙
u: ˣ

n:


u ^ n = u ^ (n % 2)
u: ˣ

n:


u ^ (n % 2)
u: ˣ

n:


u ^ n = u ^ (n % 2)
u: ˣ

n:


u ^ n
u: ˣ

n:


u ^ n = u ^ (n % 2)
u: ˣ

n:


u ^ n
u: ˣ

n:


u ^ (n % 2 + 2 * (n / 2))
u: ˣ

n:


u ^ (n % 2 + 2 * (n / 2))
u: ˣ

n:


u ^ (n % 2 + 2 * (n / 2))
u: ˣ

n:


u ^ n = u ^ (n % 2)
u: ˣ

n:


u ^ (n % 2 + 2 * (n / 2))
u: ˣ

n:


u ^ (n % 2) * u ^ (2 * (n / 2))
u: ˣ

n:


u ^ (n % 2 + 2 * (n / 2))
u: ˣ

n:


u ^ (n % 2) * (u ^ 2) ^ (n / 2)
u: ˣ

n:


u ^ (n % 2 + 2 * (n / 2))
u: ˣ

n:


u ^ (n % 2) * 1 ^ (n / 2)
u: ˣ

n:


u ^ (n % 2 + 2 * (n / 2))
u: ˣ

n:


u ^ (n % 2) * 1
u: ˣ

n:


u ^ (n % 2 + 2 * (n / 2))
u: ˣ

n:


u ^ (n % 2)
u: ˣ

n:


u ^ (n % 2)
#align int.units_pow_eq_pow_mod_two
Int.units_pow_eq_pow_mod_two: ∀ (u : ˣ) (n : ), u ^ n = u ^ (n % 2)
Int.units_pow_eq_pow_mod_two
end Int