Andrew Sneap \begin{code} {-# OPTIONS --safe --without-K #-} open import MLTT.Spartan renaming (_+_ to _∔_) open import Naturals.Addition renaming (_+_ to _ℕ+_) open import Naturals.Multiplication renaming (_*_ to _ℕ*_) open import Integers.Multiplication open import Integers.Type open import Naturals.Exponentiation module Integers.Exponentiation where \end{code} Integers exponentiation is defined in the same way as natural number exponentiation. Note that (pos 1) is used as the base element, and that we allow positive exponents, since exponentiation is not closed for negative exponents. \begin{code} _pos^_ : ℤ → ℕ → ℤ a pos^ b = ((a *_) ^ b) (pos 1) ℤ-exp-zero-base : (a : ℤ) → a pos^ 0 = pos 1 ℤ-exp-zero-base a = refl ℤ-exp-addition : (n : ℤ) (a b : ℕ) → (n pos^ (a ℕ+ b)) = (n pos^ a) * (n pos^ b) ℤ-exp-addition n a 0 = refl ℤ-exp-addition n a (succ b) = γ where γ : (n pos^ (a ℕ+ succ b)) = (n pos^ a) * (n pos^ succ b) γ = (n pos^ (a ℕ+ succ b)) =⟨ i ⟩ n * ((n pos^ a) * (n pos^ b)) =⟨ ii ⟩ n * (n pos^ a) * (n pos^ b) =⟨ iii ⟩ (n pos^ a) * n * (n pos^ b) =⟨ iv ⟩ (n pos^ a) * (n pos^ succ b) ∎ where i = ap (n *_) (ℤ-exp-addition n a b) ii = ℤ*-assoc n (n pos^ a) (n pos^ b) ⁻¹ iii = ap (_* (n pos^ b)) (ℤ*-comm n (n pos^ a)) iv = ℤ*-assoc (n pos^ a) n (n pos^ b) exponents-not-zero' : (m : ℕ) → not-zero (pos (2^ m)) exponents-not-zero' m iz = exponents-not-zero m (pos-lc I) where I : pos (2^ m) = pos 0 I = from-is-zero (pos (2^ m)) iz exponents-of-two-positive : (k : ℕ) → is-pos-succ (pos (2^ k)) exponents-of-two-positive 0 = ⋆ exponents-of-two-positive (succ k) = γ where I : is-pos-succ (pos (2^ k)) I = exponents-of-two-positive k II : is-pos-succ (pos 2 * pos (2^ k)) II = is-pos-succ-mult (pos 2) (pos (2^ k)) ⋆ I III : pos 2 * pos (2^ k) = pos (2 ℕ* 2^ k) III = pos-multiplication-equiv-to-ℕ 2 (2^ k) γ : is-pos-succ (pos (2 ℕ* 2^ k)) γ = transport is-pos-succ III II \end{code}