# The integers ```agda module elementary-number-theory.integers where ``` <details><summary>Imports</summary> ```agda open import elementary-number-theory.equality-natural-numbers open import elementary-number-theory.natural-numbers open import foundation.action-on-identifications-functions open import foundation.coproduct-types open import foundation.dependent-pair-types open import foundation.embeddings open import foundation.empty-types open import foundation.equality-coproduct-types open import foundation.equivalences open import foundation.function-types open import foundation.homotopies open import foundation.identity-types open import foundation.injective-maps open import foundation.negated-equality open import foundation.negation open import foundation.propositions open import foundation.retractions open import foundation.sections open import foundation.sets open import foundation.unit-type open import foundation.universe-levels open import structured-types.types-equipped-with-endomorphisms ``` </details> ## Idea The type of integers is an extension of the type of natural numbers including negative whole numbers. ## Definitions ### The type of integers ```agda ℤ : UU lzero ℤ = ℕ + (unit + ℕ) {-# BUILTIN INTEGER ℤ #-} ``` ### Inclusion of the negative integers ```agda in-neg-ℤ : ℕ → ℤ in-neg-ℤ n = inl n neg-one-ℤ : ℤ neg-one-ℤ = in-neg-ℤ zero-ℕ is-neg-one-ℤ : ℤ → UU lzero is-neg-one-ℤ x = (x = neg-one-ℤ) ``` ### Zero ```agda zero-ℤ : ℤ zero-ℤ = inr (inl star) is-zero-ℤ : ℤ → UU lzero is-zero-ℤ x = (x = zero-ℤ) eq-is-zero-ℤ : {a b : ℤ} → is-zero-ℤ a → is-zero-ℤ b → a = b eq-is-zero-ℤ {a} {b} H K = H ∙ inv K ``` ### Inclusion of the positive integers ```agda in-pos-ℤ : ℕ → ℤ in-pos-ℤ n = inr (inr n) one-ℤ : ℤ one-ℤ = in-pos-ℤ zero-ℕ is-one-ℤ : ℤ → UU lzero is-one-ℤ x = (x = one-ℤ) ``` ### Inclusion of the natural numbers ```agda int-ℕ : ℕ → ℤ int-ℕ zero-ℕ = zero-ℤ int-ℕ (succ-ℕ n) = in-pos-ℤ n is-injective-int-ℕ : is-injective int-ℕ is-injective-int-ℕ {zero-ℕ} {zero-ℕ} refl = refl is-injective-int-ℕ {succ-ℕ x} {succ-ℕ y} refl = refl ``` ### Induction principle on the type of integers ```agda ind-ℤ : {l : Level} (P : ℤ → UU l) → P neg-one-ℤ → ((n : ℕ) → P (inl n) → P (inl (succ-ℕ n))) → P zero-ℤ → P one-ℤ → ((n : ℕ) → P (inr (inr (n))) → P (inr (inr (succ-ℕ n)))) → (k : ℤ) → P k ind-ℤ P p-1 p-S p0 p1 pS (inl zero-ℕ) = p-1 ind-ℤ P p-1 p-S p0 p1 pS (inl (succ-ℕ x)) = p-S x (ind-ℤ P p-1 p-S p0 p1 pS (inl x)) ind-ℤ P p-1 p-S p0 p1 pS (inr (inl star)) = p0 ind-ℤ P p-1 p-S p0 p1 pS (inr (inr zero-ℕ)) = p1 ind-ℤ P p-1 p-S p0 p1 pS (inr (inr (succ-ℕ x))) = pS x (ind-ℤ P p-1 p-S p0 p1 pS (inr (inr (x)))) ``` ### The successor and predecessor functions on ℤ ```agda succ-ℤ : ℤ → ℤ succ-ℤ (inl zero-ℕ) = zero-ℤ succ-ℤ (inl (succ-ℕ x)) = inl x succ-ℤ (inr (inl star)) = one-ℤ succ-ℤ (inr (inr x)) = inr (inr (succ-ℕ x)) pred-ℤ : ℤ → ℤ pred-ℤ (inl x) = inl (succ-ℕ x) pred-ℤ (inr (inl star)) = inl zero-ℕ pred-ℤ (inr (inr zero-ℕ)) = inr (inl star) pred-ℤ (inr (inr (succ-ℕ x))) = inr (inr x) ℤ-Type-With-Endomorphism : Type-With-Endomorphism lzero pr1 ℤ-Type-With-Endomorphism = ℤ pr2 ℤ-Type-With-Endomorphism = succ-ℤ ``` ### The negative of an integer ```agda neg-ℤ : ℤ → ℤ neg-ℤ (inl x) = inr (inr x) neg-ℤ (inr (inl star)) = inr (inl star) neg-ℤ (inr (inr x)) = inl x ``` ## Properties ### The type of integers is a set ```agda abstract is-set-ℤ : is-set ℤ is-set-ℤ = is-set-coproduct is-set-ℕ (is-set-coproduct is-set-unit is-set-ℕ) ℤ-Set : Set lzero pr1 ℤ-Set = ℤ pr2 ℤ-Set = is-set-ℤ ``` ### The successor and predecessor functions on ℤ are mutual inverses ```agda abstract is-retraction-pred-ℤ : is-retraction succ-ℤ pred-ℤ is-retraction-pred-ℤ (inl zero-ℕ) = refl is-retraction-pred-ℤ (inl (succ-ℕ x)) = refl is-retraction-pred-ℤ (inr (inl _)) = refl is-retraction-pred-ℤ (inr (inr zero-ℕ)) = refl is-retraction-pred-ℤ (inr (inr (succ-ℕ x))) = refl is-section-pred-ℤ : is-section succ-ℤ pred-ℤ is-section-pred-ℤ (inl zero-ℕ) = refl is-section-pred-ℤ (inl (succ-ℕ x)) = refl is-section-pred-ℤ (inr (inl _)) = refl is-section-pred-ℤ (inr (inr zero-ℕ)) = refl is-section-pred-ℤ (inr (inr (succ-ℕ x))) = refl abstract is-equiv-succ-ℤ : is-equiv succ-ℤ pr1 (pr1 is-equiv-succ-ℤ) = pred-ℤ pr2 (pr1 is-equiv-succ-ℤ) = is-section-pred-ℤ pr1 (pr2 is-equiv-succ-ℤ) = pred-ℤ pr2 (pr2 is-equiv-succ-ℤ) = is-retraction-pred-ℤ equiv-succ-ℤ : ℤ ≃ ℤ pr1 equiv-succ-ℤ = succ-ℤ pr2 equiv-succ-ℤ = is-equiv-succ-ℤ abstract is-equiv-pred-ℤ : is-equiv pred-ℤ pr1 (pr1 is-equiv-pred-ℤ) = succ-ℤ pr2 (pr1 is-equiv-pred-ℤ) = is-retraction-pred-ℤ pr1 (pr2 is-equiv-pred-ℤ) = succ-ℤ pr2 (pr2 is-equiv-pred-ℤ) = is-section-pred-ℤ equiv-pred-ℤ : ℤ ≃ ℤ pr1 equiv-pred-ℤ = pred-ℤ pr2 equiv-pred-ℤ = is-equiv-pred-ℤ ``` ### The successor function on ℤ is injective and has no fixed points ```agda abstract is-injective-succ-ℤ : is-injective succ-ℤ is-injective-succ-ℤ {x} {y} p = inv (is-retraction-pred-ℤ x) ∙ ap pred-ℤ p ∙ is-retraction-pred-ℤ y has-no-fixed-points-succ-ℤ : (x : ℤ) → succ-ℤ x ≠ x has-no-fixed-points-succ-ℤ (inl zero-ℕ) () has-no-fixed-points-succ-ℤ (inl (succ-ℕ x)) () has-no-fixed-points-succ-ℤ (inr (inl star)) () ``` ### The negative function is an involution ```agda abstract neg-neg-ℤ : neg-ℤ ∘ neg-ℤ ~ id neg-neg-ℤ (inl n) = refl neg-neg-ℤ (inr (inl star)) = refl neg-neg-ℤ (inr (inr n)) = refl abstract is-equiv-neg-ℤ : is-equiv neg-ℤ pr1 (pr1 is-equiv-neg-ℤ) = neg-ℤ pr2 (pr1 is-equiv-neg-ℤ) = neg-neg-ℤ pr1 (pr2 is-equiv-neg-ℤ) = neg-ℤ pr2 (pr2 is-equiv-neg-ℤ) = neg-neg-ℤ equiv-neg-ℤ : ℤ ≃ ℤ pr1 equiv-neg-ℤ = neg-ℤ pr2 equiv-neg-ℤ = is-equiv-neg-ℤ abstract is-emb-neg-ℤ : is-emb neg-ℤ is-emb-neg-ℤ = is-emb-is-equiv is-equiv-neg-ℤ emb-neg-ℤ : ℤ ↪ ℤ pr1 emb-neg-ℤ = neg-ℤ pr2 emb-neg-ℤ = is-emb-neg-ℤ abstract neg-pred-ℤ : (k : ℤ) → neg-ℤ (pred-ℤ k) = succ-ℤ (neg-ℤ k) neg-pred-ℤ (inl x) = refl neg-pred-ℤ (inr (inl star)) = refl neg-pred-ℤ (inr (inr zero-ℕ)) = refl neg-pred-ℤ (inr (inr (succ-ℕ x))) = refl neg-succ-ℤ : (x : ℤ) → neg-ℤ (succ-ℤ x) = pred-ℤ (neg-ℤ x) neg-succ-ℤ (inl zero-ℕ) = refl neg-succ-ℤ (inl (succ-ℕ x)) = refl neg-succ-ℤ (inr (inl star)) = refl neg-succ-ℤ (inr (inr x)) = refl pred-neg-ℤ : (k : ℤ) → pred-ℤ (neg-ℤ k) = neg-ℤ (succ-ℤ k) pred-neg-ℤ (inl zero-ℕ) = refl pred-neg-ℤ (inl (succ-ℕ x)) = refl pred-neg-ℤ (inr (inl star)) = refl pred-neg-ℤ (inr (inr x)) = refl ``` ### The negative function is injective ```agda abstract is-injective-neg-ℤ : is-injective neg-ℤ is-injective-neg-ℤ {x} {y} p = inv (neg-neg-ℤ x) ∙ ap neg-ℤ p ∙ neg-neg-ℤ y ``` ### The integer successor of a natural number is the successor of the natural number ```agda abstract succ-int-ℕ : (x : ℕ) → succ-ℤ (int-ℕ x) = int-ℕ (succ-ℕ x) succ-int-ℕ zero-ℕ = refl succ-int-ℕ (succ-ℕ x) = refl ``` ### An integer is zero if its negative is zero ```agda abstract is-zero-is-zero-neg-ℤ : (x : ℤ) → is-zero-ℤ (neg-ℤ x) → is-zero-ℤ x is-zero-is-zero-neg-ℤ (inr (inl star)) H = refl ``` ## See also - We show in [`structured-types.initial-pointed-type-equipped-with-automorphism`](structured-types.initial-pointed-type-equipped-with-automorphism.md) that ℤ is the initial pointed type equipped with an automorphism. - The group of integers is constructed in [`elementary-number-theory.group-of-integers`](elementary-number-theory.group-of-integers.md).