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
Cmd instead 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 : {α : Type ?u.15} → [self : Abs α ] → α → α abs x = 1 := by
rw [ isUnit_iff_natAbs_eq , abs_eq_natAbs , ← Int.ofNat_one , coe_nat_inj' : ∀ {m n : ℕ }, ↑m = ↑n ↔ m = n coe_nat_inj']
#align int.is_unit_iff_abs_eq Int.isUnit_iff_abs_eq
theorem isUnit_sq { a : ℤ } ( ha : IsUnit a ) : a ^ 2 = 1 := by rw [ sq , isUnit_mul_self : ∀ {a : ℤ }, IsUnit a → a * a = 1 isUnit_mul_self ha ]
#align int.is_unit_sq Int.isUnit_sq : ∀ {a : ℤ }, IsUnit a → a ^ 2 = 1 Int.isUnit_sq
@[ simp ]
theorem units_sq : ∀ (u : ℤ ˣ ), u ^ 2 = 1 units_sq ( u : ℤ ˣ) : u ^ 2 = 1 := by
rw [ Units.ext_iff : ∀ {α : Type ?u.1230} [inst : Monoid α ] {a b : α ˣ }, a = b ↔ ↑a = ↑b Units.ext_iff, Units.val_pow_eq_pow_val : ∀ {M : Type ?u.1276} [inst : Monoid M ] (u : M ˣ ) (n : ℕ ), ↑(u ^ n ) = ↑u ^ n Units.val_pow_eq_pow_val, Units.val_one : ∀ {α : Type ?u.1331} [inst : Monoid α ], ↑1 = 1 Units.val_one, isUnit_sq u . isUnit ]
#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 : ℤ ˣ) : u * u = 1 := by rw [ ← sq : ∀ {M : Type ?u.2331} [inst : Monoid M ] (a : M ), a ^ 2 = a * a sq, units_sq : ∀ (u : ℤ ˣ ), u ^ 2 = 1 units_sq]
#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 : ℤ ˣ) : u ⁻¹ = u := by rw [ inv_eq_iff_mul_eq_one : ∀ {G : Type ?u.2636} [inst : Group G ] {a b : G }, a ⁻¹ = b ↔ a * b = 1 inv_eq_iff_mul_eq_one, units_mul_self : ∀ (u : ℤ ˣ ), u * u = 1 units_mul_self]
#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 : ℤ ˣ) : ( u * u : ℤ ) = 1 := by
rw [ ← Units.val_mul : ∀ {α : Type ?u.5850} [inst : Monoid α ] (a b : α ˣ ), ↑(a * b ) = ↑a * ↑b Units.val_mul, units_mul_self : ∀ (u : ℤ ˣ ), u * u = 1 units_mul_self, Units.val_one : ∀ {α : Type ?u.5909} [inst : Monoid α ], ↑1 = 1 Units.val_one]
#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 : ℕ } : (- 1 : ℤ ) ^ n ≠ 0 :=
pow_ne_zero _ ( abs_pos . mp : ∀ {a b : Prop }, (a ↔ b ) → a → b mp ( by simp ))
#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 < 4 → x ≠ 0 → x ^ 2 = 1 sq_eq_one_of_sq_lt_four { x : ℤ } ( h1 : x ^ 2 < 4 ) ( h2 : x ≠ 0 ) : x ^ 2 = 1 :=
sq_eq_one_iff . mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr
(( abs_eq ( zero_le_one' ℤ )). mp : ∀ {a b : Prop }, (a ↔ b ) → a → b mp
( le_antisymm ( lt_add_one_iff : ∀ {a b : ℤ }, a < b + 1 ↔ a ≤ b lt_add_one_iff. mp : ∀ {a b : Prop }, (a ↔ b ) → a → b mp ( abs_lt_of_sq_lt_sq h1 zero_le_two ))
( sub_one_lt_iff : ∀ {a b : ℤ }, a - 1 < b ↔ a ≤ b sub_one_lt_iff. mp : ∀ {a b : Prop }, (a ↔ b ) → a → b mp ( abs_pos . mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr h2 ))))
#align int.sq_eq_one_of_sq_lt_four Int.sq_eq_one_of_sq_lt_four : ∀ {x : ℤ }, x ^ 2 < 4 → x ≠ 0 → x ^ 2 = 1 Int.sq_eq_one_of_sq_lt_four
theorem sq_eq_one_of_sq_le_three : ∀ {x : ℤ }, x ^ 2 ≤ 3 → x ≠ 0 → x ^ 2 = 1 sq_eq_one_of_sq_le_three { x : ℤ } ( h1 : x ^ 2 ≤ 3 ) ( h2 : x ≠ 0 ) : x ^ 2 = 1 :=
sq_eq_one_of_sq_lt_four : ∀ {x : ℤ }, x ^ 2 < 4 → x ≠ 0 → x ^ 2 = 1 sq_eq_one_of_sq_lt_four ( lt_of_le_of_lt : ∀ {α : Type ?u.8471} [inst : Preorder α ] {a b c : α }, a ≤ b → b < c → a < c lt_of_le_of_lt h1 ( lt_add_one ( 3 : ℤ ))) h2
#align int.sq_eq_one_of_sq_le_three Int.sq_eq_one_of_sq_le_three : ∀ {x : ℤ }, x ^ 2 ≤ 3 → x ≠ 0 → x ^ 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 : ℤ ˣ) ( n : ℕ ) : u ^ n = u ^ ( n % 2 ) := by
conv =>
lhs
rw [ ← Nat.mod_add_div : ∀ (m k : ℕ ), m % k + k * (m / k ) = m Nat.mod_add_div n 2 u ^ (n % 2 + 2 * (n / 2 ) )] u ^ (n % 2 + 2 * (n / 2 ) ); u ^ (n % 2 + 2 * (n / 2 ) )
rw [ u ^ (n % 2 + 2 * (n / 2 ) )pow_add : ∀ {M : Type ?u.12807} [inst : Monoid M ] (a : M ) (m n : ℕ ), a ^ (m + n ) = a ^ m * a ^ n pow_add, u ^ (n % 2 ) * u ^ (2 * (n / 2 ) ) u ^ (n % 2 + 2 * (n / 2 ) )pow_mul : ∀ {M : Type ?u.13038} [inst : Monoid M ] (a : M ) (m n : ℕ ), a ^ (m * n ) = (a ^ m ) ^ n pow_mul, u ^ (n % 2 ) * (u ^ 2 ) ^ (n / 2 ) u ^ (n % 2 + 2 * (n / 2 ) )units_sq : ∀ (u : ℤ ˣ ), u ^ 2 = 1 units_sq, u ^ (n % 2 ) * 1 ^ (n / 2 ) u ^ (n % 2 + 2 * (n / 2 ) )one_pow : ∀ {M : Type ?u.13124} [inst : Monoid M ] (n : ℕ ), 1 ^ n = 1 one_pow, u ^ (n % 2 + 2 * (n / 2 ) )mul_one ]
#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