Andrew Sneap - November 2021 In this file I define the free rationals. They are rationals they may not be in the lowest terms, with (a , b) : ℤ × ℕ were ℤ is the numerator, and b represents a denominator of b+1, ruling out the possibility of a zero-denominator. \begin{code} {-# OPTIONS --safe --without-K #-} open import MLTT.Spartan renaming (_+_ to _∔_) open import Integers.Abs open import Integers.HCF open import Integers.Multiplication open import Integers.Order open import Integers.Type open import Naturals.Division open import Naturals.HCF open import Naturals.Multiplication renaming (_*_ to _ℕ*_) open import Naturals.Properties open import TypeTopology.SigmaDiscreteAndTotallySeparated open import UF.Base hiding (_≈_) open import UF.DiscreteAndSeparated open import UF.Sets open import UF.Subsingletons module Rationals.Fractions where 𝔽 : 𝓤₀ ̇ 𝔽 = ℤ × ℕ is-in-lowest-terms : 𝔽 → 𝓤₀ ̇ is-in-lowest-terms (x , y) = coprime' (abs x) (succ y) is-in-lowest-terms' : 𝔽 → 𝓤₀ ̇ is-in-lowest-terms' (x , y) = coprime (abs x) (succ y) denom-zero-lt : (x : ℤ) → is-in-lowest-terms (x , 0) denom-zero-lt x = γ where I : (d : ℕ) → is-common-divisor d (abs x) 1 → d ∣ 1 I d (_ , d-divides-1) = d-divides-1 II : coprime (abs x) 1 II = ((1-divides-all (abs x)) , 1-divides-all 1) , I γ : coprime' (abs x) 1 γ = coprime-to-coprime' (abs x) 1 II is-in-lowest-terms-is-prop : (q : 𝔽) → is-prop (is-in-lowest-terms q) is-in-lowest-terms-is-prop (x , y) = coprime'-is-prop (abs x) (succ y) 𝔽-is-discrete : is-discrete 𝔽 𝔽-is-discrete = Σ-is-discrete ℤ-is-discrete (λ _ → ℕ-is-discrete) 𝔽-is-set : is-set 𝔽 𝔽-is-set = discrete-types-are-sets 𝔽-is-discrete _≈_ : (p q : 𝔽) → 𝓤₀ ̇ (x , a) ≈ (y , b) = x * pos (succ b) = y * pos (succ a) ≈-refl : (q : 𝔽) → q ≈ q ≈-refl q = refl ≈-sym : (p q : 𝔽) → p ≈ q → q ≈ p ≈-sym p q e = e ⁻¹ ≈-trans : (p q r : 𝔽) → p ≈ q → q ≈ r → p ≈ r ≈-trans (x , a) (y , b) (z , c) e₁ e₂ = conclusion where a' = pos (succ a) b' = pos (succ b) c' = pos (succ c) I : b' * (x * c') = b' * (z * a') I = b' * (x * c') =⟨ ℤ*-assoc b' x c' ⁻¹ ⟩ b' * x * c' =⟨ ap (_* c') (ℤ*-comm b' x) ⟩ x * b' * c' =⟨ ap (_* c') e₁ ⟩ y * a' * c' =⟨ ap (_* c') (ℤ*-comm y a') ⟩ a' * y * c' =⟨ ℤ*-assoc a' y c' ⟩ a' * (y * c') =⟨ ap (a' *_) e₂ ⟩ a' * (z * b') =⟨ ℤ-mult-rearrangement' z b' a' ⟩ b' * (z * a') ∎ conclusion : (x , a) ≈ (z , c) conclusion = ℤ-mult-left-cancellable (x * c') (z * a') b' id I equiv-with-lowest-terms-is-equal : (a b : 𝔽) → a ≈ b → is-in-lowest-terms a → is-in-lowest-terms b → a = b equiv-with-lowest-terms-is-equal (x , a) (y , b) e lt₁ lt₂ = γ where α : coprime (abs x) (succ a) α = coprime'-to-coprime (abs x) (succ a) lt₁ β : coprime (abs y) (succ b) β = coprime'-to-coprime (abs y) (succ b) lt₂ δ : abs x ℕ* succ b = abs y ℕ* succ a δ = abs x ℕ* abs (pos (succ b)) =⟨ abs-over-mult x (pos (succ b)) ⁻¹ ⟩ abs (x * pos (succ b)) =⟨ ap abs e ⟩ abs (y * pos (succ a)) =⟨ abs-over-mult y (pos (succ a)) ⟩ abs y ℕ* abs (pos (succ a)) ∎ I : succ a ℕ* abs y = abs x ℕ* succ b I = succ a ℕ* abs y =⟨ mult-commutativity (succ a) (abs y) ⟩ abs y ℕ* succ a =⟨ δ ⁻¹ ⟩ abs x ℕ* succ b ∎ II : (succ a) ∣ (abs x) ℕ* (succ b) II = abs y , I III : succ b ℕ* abs x = abs y ℕ* succ a III = succ b ℕ* abs x =⟨ mult-commutativity (succ b) (abs x) ⟩ abs x ℕ* succ b =⟨ δ ⟩ abs y ℕ* succ a ∎ IV : succ b ∣ abs y ℕ* succ a IV = abs x , III V : coprime (succ a) (abs x) V = hcf-comm (abs x) (succ a) 1 α VI : coprime (succ b) (abs y) VI = hcf-comm (abs y) (succ b) 1 β a-divides-b : succ a ∣ succ b a-divides-b = coprime-with-division (succ a) (abs x) (succ b) V II b-divides-a : succ b ∣ succ a b-divides-a = coprime-with-division (succ b) (abs y) (succ a) VI IV γ₁ : a = b γ₁ = succ-lc (∣-anti (succ a) (succ b) a-divides-b b-divides-a) e'' : x * pos (succ a) = y * pos (succ a) e'' = x * pos (succ a) =⟨ ap (x *_) (ap pos (ap succ γ₁)) ⟩ x * pos (succ b) =⟨ e ⟩ y * pos (succ a) ∎ γ₂ : x = y γ₂ = ℤ-mult-right-cancellable x y (pos (succ a)) id e'' γ : x , a = y , b γ = to-×-= γ₂ γ₁ open import Notation.CanonicalMap ℤ-to-𝔽 : ℤ → 𝔽 ℤ-to-𝔽 z = z , 0 instance canonical-map-ℤ-to-𝔽 : Canonical-Map ℤ 𝔽 ι {{canonical-map-ℤ-to-𝔽}} = ℤ-to-𝔽 ℕ-to-𝔽 : ℕ → 𝔽 ℕ-to-𝔽 n = ι (ι n) instance canonical-map-ℕ-to-𝔽 : Canonical-Map ℕ 𝔽 ι {{canonical-map-ℕ-to-𝔽}} = ℕ-to-𝔽 \end{code}