Andrew Sneap, 27 April 2021 This file arises as a result of using an equivalence relation to facilitate proofs of property of rational numbers. We can prove that two fractions which are in lowest terms, and satisfy an equivalence relation are equal. This proof relies on Bezout's lemma, particularly the version of Bezout's lemma which involves the highest common factor of integers. This files defines such a highest common factor, and proves the required property. \begin{code} {-# OPTIONS --safe --without-K #-} open import MLTT.Spartan hiding (_+_) open import Naturals.Addition renaming (_+_ to _ℕ+_) open import Naturals.Order open import Notation.Order open import UF.Base open import UF.Subsingletons open import Integers.Type open import Integers.Addition open import Integers.Negation open import Integers.Division open import Integers.Multiplication open import Naturals.Division renaming (_∣_ to _ℕ∣_) open import Naturals.Multiplication renaming (_*_ to _ℕ*_) open import Naturals.HCF module Integers.HCF where ℤ-is-common-divisor : (d x y : ℤ) → 𝓤₀ ̇ ℤ-is-common-divisor d x y = (d ∣ x) × (d ∣ y) ℤ-is-common-divisor-is-prop : (d x y : ℤ) → not-zero d → is-prop (ℤ-is-common-divisor d x y) ℤ-is-common-divisor-is-prop d x y nz = ×-is-prop γ₁ γ₂ where γ₁ : is-prop (d ∣ x) γ₁ = (d ℤ∣ x -is-prop) nz γ₂ : is-prop (d ∣ y) γ₂ = (d ℤ∣ y -is-prop) nz ℤ-is-hcf : (d : ℕ) → (x y : ℤ) → 𝓤₀ ̇ ℤ-is-hcf d x y = ℤ-is-common-divisor (pos d) x y × ((f : ℕ) → ℤ-is-common-divisor (pos f) x y → pos f ∣ pos d) ℤ-HCF : (a b : ℕ) → Σ h ꞉ ℕ , (is-hcf h a b) × (Σ (x , y) ꞉ ℤ × ℤ , pos h = (pos a) * x + (pos b) * y) ℤ-HCF = course-of-values-induction (λ a → (b : ℕ) → Σ h ꞉ ℕ , is-hcf h a b × (Σ (x , y) ꞉ ℤ × ℤ , pos h = pos a * x + pos b * y)) step where step : (n : ℕ) → ((a : ℕ) → a < n → (b : ℕ) → Σ h ꞉ ℕ , is-hcf h a b × (Σ (x , y) ꞉ ℤ × ℤ , pos h = pos a * x + pos b * y)) → (b : ℕ) → Σ h ꞉ ℕ , is-hcf h n b × (Σ (x , y) ꞉ ℤ × ℤ , pos h = pos n * x + pos b * y) step 0 IH b = b , hcf-zero-left , (pos 0 , pos 1) , ℤ+-comm (pos b) (pos 0) step (succ n) IH b = γ (division b n) where γ : Σ q ꞉ ℕ , Σ r ꞉ ℕ , (b = q ℕ* succ n ℕ+ r) × (r < succ n) → Σ h ꞉ ℕ , is-hcf h (succ n) b × (Σ (x , y) ꞉ ℤ × ℤ , pos h = pos (succ n) * x + pos b * y) γ (q , r , e₀ , l) = γ' (IH r l (succ n)) where γ' : Σ h ꞉ ℕ , is-hcf h r (succ n) × (Σ (x , y) ꞉ ℤ × ℤ , pos h = pos r * x + pos (succ n) * y) → Σ h ꞉ ℕ , is-hcf h (succ n) b × (Σ (x , y) ꞉ ℤ × ℤ , pos h = pos (succ n) * x + pos b * y) γ' (h , (((α , αₚ) , β , βₚ) , γ) , (x , y) , e₁) = γ'' where I-lemma : h ℕ* (q ℕ* β ℕ+ α) = b I-lemma = h ℕ* (q ℕ* β ℕ+ α) =⟨ i ⟩ h ℕ* (q ℕ* β) ℕ+ h ℕ* α =⟨ ii ⟩ h ℕ* (q ℕ* β) ℕ+ r =⟨ iii ⟩ h ℕ* q ℕ* β ℕ+ r =⟨ iv ⟩ q ℕ* h ℕ* β ℕ+ r =⟨ v ⟩ q ℕ* (h ℕ* β) ℕ+ r =⟨ vi ⟩ q ℕ* succ n ℕ+ r =⟨ e₀ ⁻¹ ⟩ b ∎ where i = distributivity-mult-over-addition h (q ℕ* β) α ii = ap (λ z → h ℕ* (q ℕ* β) ℕ+ z) αₚ iii = ap (_ℕ+ r) (mult-associativity h q β) ⁻¹ iv = ap (λ z → z ℕ* β ℕ+ r) (mult-commutativity h q) v = ap (_ℕ+ r) (mult-associativity q h β) vi = ap (λ z → q ℕ* z ℕ+ r) βₚ I : h ℕ∣ b I = (q ℕ* β ℕ+ α) , I-lemma II : (f : ℕ) → is-common-divisor f (succ n) b → f ℕ∣ h II f ((μ , μₚ) , ν , νₚ) = γ f (ψ₁ , ψ₂) where ψ : f ℕ* ν = f ℕ* (q ℕ* μ) ℕ+ r ψ = f ℕ* ν =⟨ νₚ ⟩ b =⟨ e₀ ⟩ q ℕ* succ n ℕ+ r =⟨ i ⟩ q ℕ* (f ℕ* μ) ℕ+ r =⟨ ii ⟩ q ℕ* f ℕ* μ ℕ+ r =⟨ iii ⟩ f ℕ* q ℕ* μ ℕ+ r =⟨ iv ⟩ f ℕ* (q ℕ* μ) ℕ+ r ∎ where i = ap (λ z → q ℕ* z ℕ+ r) (μₚ ⁻¹) ii = ap (_ℕ+ r) (mult-associativity q f μ ⁻¹) iii = ap (λ z → z ℕ* μ ℕ+ r) (mult-commutativity q f) iv = ap (_ℕ+ r ) (mult-associativity f q μ) ψ₁ : f ℕ∣ r ψ₁ = factor-of-sum-consequence f ν (q ℕ* μ) r ψ ψ₂ : f ℕ∣ succ n ψ₂ = μ , μₚ III : Σ (x' , y') ꞉ ℤ × ℤ , pos h = pos (succ n) * x' + pos b * y' III = (y + (- pos q * x) , x) , V where n' = pos (succ n) q' = pos q r' = pos r IV : pos b = q' * n' + r' IV = pos b =⟨ ap pos e₀ ⟩ pos (q ℕ* succ n ℕ+ r) =⟨ i ⟩ pos (q ℕ* succ n) + r' =⟨ ii ⟩ q' * n' + r' ∎ where i = distributivity-pos-addition (q ℕ* (succ n)) r ⁻¹ ii = ap (_+ r') (pos-multiplication-equiv-to-ℕ q (succ n)) ⁻¹ V : pos h = n' * (y + (- q' * x)) + pos b * x V = pos h =⟨ e₁ ⟩ r' * x + n' * y =⟨ i ⟩ n' * y + r' * x =⟨ refl ⟩ n' * (y + pos 0) + r' * x =⟨ ii ⟩ n' * (y + (q' * x + (- q' * x))) + r' * x =⟨ iii ⟩ n' * (y + ((- q' * x) + q' * x)) + r' * x =⟨ iv ⟩ n' * (y + (- q' * x) + q' * x) + r' * x =⟨ v ⟩ n' * (y + (- q' * x) + x * q') + r' * x =⟨ vi ⟩ n' * (y + (- q' * x)) + n' * (x * q') + r' * x =⟨ vii ⟩ n' * (y + (- q' * x)) + (x * q') * n' + r' * x =⟨ viii ⟩ n' * (y + (- q' * x)) + x * (q' * n') + r' * x =⟨ ix ⟩ n' * (y + (- q' * x)) + (q' * n') * x + r' * x =⟨ xi ⟩ n' * (y + (- q' * x)) + ((q' * n') * x + r' * x) =⟨ xii ⟩ n' * (y + (- q' * x)) + (q' * n' + r') * x =⟨ xiii ⟩ n' * (y + (- q' * x)) + pos b * x ∎ where iiₐₚ : pos 0 = q' * x + (- q' * x) iiₐₚ = ℤ-sum-of-inverse-is-zero (q' * x) ⁻¹ iiiₐₚ : q' * x - q' * x = (- q' * x) + q' * x iiiₐₚ = ℤ+-comm (q' * x) (- q' * x) ivₐₚ : y + ((- q' * x) + q' * x) = y - q' * x + q' * x ivₐₚ = ℤ+-assoc y (- q' * x) (q' * x) ⁻¹ vₐₚ : q' * x = x * q' vₐₚ = ℤ*-comm q' x viₐₚ : n' * (y - q' * x + x * q') = n' * (y - q' * x) + n' * (x * q') viₐₚ = distributivity-mult-over-ℤ' (y + (- q' * x)) (x * q') n' viiₐₚ : n' * (x * q') = x * q' * n' viiₐₚ = ℤ*-comm n' (x * q') viiiₐₚ : x * q' * n' = x * (q' * n') viiiₐₚ = ℤ*-assoc x q' n' ixₐₚ : x * (q' * n') = q' * n' * x ixₐₚ = ℤ*-comm x (q' * n') xiiₐₚ : q' * n' * x + r' * x = (q' * n' + r') * x xiiₐₚ = distributivity-mult-over-ℤ (q' * n') r' x ⁻¹ i = ℤ+-comm (r' * x) (n' * y) ii = ap (λ z → n' * (y + z) + r' * x) iiₐₚ iii = ap (λ z → n' * (y + z) + r' * x) iiiₐₚ iv = ap (λ z → n' * z + r' * x) ivₐₚ v = ap (λ z → n' * (y + (- q' * x) + z) + r' * x) vₐₚ vi = ap (_+ r' * x) viₐₚ vii = ap (λ z → n' * (y + (- q' * x)) + z + r' * x ) viiₐₚ viii = ap (λ z → n' * (y + (- q' * x)) + z + r' * x ) viiiₐₚ ix = ap (λ z → n' * (y + (- q' * x)) + z + r' * x ) ixₐₚ xi = ℤ+-assoc (n' * (y + (- q' * x))) (q' * n' * x) (r' * x) xii = ap (λ z → n' * (y + (- q' * x)) + z) xiiₐₚ xiii = ap (λ z → n' * (y + (- q' * x)) + z * x) (IV ⁻¹) γ'' : Σ h ꞉ ℕ , is-hcf h (succ n) b × (Σ (x , y) ꞉ ℤ × ℤ , pos h = pos (succ n) * x + pos b * y) γ'' = h , (((β , βₚ) , I) , II) , III ℤ-HCF' : (a b : ℕ) → Σ h ꞉ ℕ , is-hcf h a b ℤ-HCF' a b = I (ℤ-HCF a b) where I : Σ h ꞉ ℕ , is-hcf h a b × (Σ (x , y) ꞉ ℤ × ℤ , pos h = (pos a) * x + (pos b) * y) → Σ h ꞉ ℕ , is-hcf h a b I (h , is-hcf , _) = h , is-hcf coprime-bezout : (a b : ℕ) → coprime a b → Σ (x , y) ꞉ ℤ × ℤ , pos 1 = pos a * x + pos b * y coprime-bezout a b = I (ℤ-HCF a b) where I : Σ h ꞉ ℕ , (is-hcf h a b) × (Σ (x , y) ꞉ ℤ × ℤ , pos h = (pos a) * x + (pos b) * y) → coprime a b → Σ (x , y) ꞉ ℤ × ℤ , pos 1 = pos a * x + pos b * y I (h , is-hcf , (x , y) , α) h' = (x , y) , (III ⁻¹ ∙ α) where II : h = 1 II = hcf-unique a b (h , is-hcf) (1 , h') III : pos h = pos 1 III = ap pos II coprime-with-division : (a b c : ℕ) → coprime a b → a ℕ∣ b ℕ* c → a ℕ∣ c coprime-with-division a b c coprime (α , αₚ) = I (coprime-bezout a b coprime) where a' = pos a b' = pos b c' = pos c I : Σ (x , y) ꞉ ℤ × ℤ , pos 1 = a' * x + b' * y → a ℕ∣ c I ((x , y) , e₁) = pos-div-to-nat-div a c IV where II : a' * (x * c') + (b' * c') * y = c' II = a' * (x * c') + (b' * c') * y =⟨ i ⟩ a' * x * c' + y * (b' * c') =⟨ ii ⟩ a' * x * c' + y * b' * c' =⟨ iii ⟩ (a' * x + y * b') * c' =⟨ iv ⟩ (a' * x + b' * y) * c' =⟨ v ⟩ pos 1 * c' =⟨ vi ⟩ c' ∎ where i = ap₂ _+_ (ℤ*-assoc a' x c' ⁻¹) (ℤ*-comm (b' * c') y) ii = ap (λ - → a' * x * c' + -) (ℤ*-assoc y b' c' ⁻¹) iii = distributivity-mult-over-ℤ (a' * x) (y * b') c' ⁻¹ iv = ap (λ - → (a' * x + -) * c') (ℤ*-comm y b') v = ap (_* c') (e₁ ⁻¹) vi = ℤ-mult-left-id c' III : a' ∣ a' * (x * c') + (b' * c') * y III = ℤ-∣-respects-addition-of-multiples a' a' (b' * c') (x * c') y i ii where i : a' ∣ a' i = pos 1 , refl ii : a' ∣ (b' * c') ii = pos α , δ where δ : a' * pos α = b' * c' δ = a' * pos α =⟨ pos-multiplication-equiv-to-ℕ a α ⟩ pos (a ℕ* α) =⟨ ap pos αₚ ⟩ pos (b ℕ* c) =⟨ pos-multiplication-equiv-to-ℕ b c ⁻¹ ⟩ b' * c' ∎ IV : a' ∣ c' IV = transport (a' ∣_) II III \end{code}