Andrew Sneap, January-March 2021
Updated January-March 2022
In this file I define multiplication of rationals, and prove
properties of multiplication.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import MLTT.Spartan renaming (_+_ to _∔_)
open import UF.Base hiding (_≈_)
open import Naturals.Properties
open import Integers.Type
open import Integers.Multiplication renaming (_*_ to _ℤ*_)
open import Naturals.Multiplication renaming (_*_ to _ℕ*_)
open import Rationals.Fractions
open import Rationals.FractionsOperations renaming (_*_ to _𝔽*_ ; _+_ to _𝔽+_)
open import Rationals.Type
open import Rationals.Addition
module Rationals.Multiplication where
_*_ : ℚ → ℚ → ℚ
(p , _) * (q , _) = toℚ (p 𝔽* q)
infixl 33 _*_
toℚ-* : (p q : 𝔽) → toℚ (p 𝔽* q) = toℚ p * toℚ q
toℚ-* p q = equiv→equality (p 𝔽* q) (p' 𝔽* q') conclusion
where
p' = to𝔽 (toℚ p)
q' = to𝔽 (toℚ q)
I : p ≈ p'
I = ≈-toℚ p
II : q ≈ q'
II = ≈-toℚ q
III : p 𝔽* q ≈ p' 𝔽* q
III = ≈-over-* p p' q I
IV : q 𝔽* p' ≈ q' 𝔽* p'
IV = ≈-over-* q q' p' II
V : p' 𝔽* q ≈ p' 𝔽* q'
V = transport₂ _≈_ (𝔽*-comm q p') (𝔽*-comm q' p') IV
conclusion : p 𝔽* q ≈ p' 𝔽* q'
conclusion = ≈-trans (p 𝔽* q) (p' 𝔽* q) (p' 𝔽* q') III V
ℚ*-comm : (p q : ℚ) → p * q = q * p
ℚ*-comm (p , _) (q , _) = ap toℚ (𝔽*-comm p q)
ℚ*-assoc : (p q r : ℚ) → p * q * r = p * (q * r)
ℚ*-assoc (p , α) (q , β) (r , δ) = γ
where
γ : (p , α) * (q , β) * (r , δ) = (p , α) * ((q , β) * (r , δ))
γ = (p , α) * (q , β) * (r , δ) =⟨ refl ⟩
toℚ (p 𝔽* q) * (r , δ) =⟨ i ⟩
toℚ (p 𝔽* q) * toℚ r =⟨ ii ⟩
toℚ (p 𝔽* q 𝔽* r) =⟨ iii ⟩
toℚ (p 𝔽* (q 𝔽* r)) =⟨ iv ⟩
toℚ p * toℚ (q 𝔽* r) =⟨ v ⟩
(p , α) * toℚ (q 𝔽* r) =⟨ refl ⟩
(p , α) * ((q , β) * (r , δ)) ∎
where
i = ap (toℚ (p 𝔽* q) *_) (toℚ-to𝔽 (r , δ))
ii = toℚ-* (p 𝔽* q) r ⁻¹
iii = ap toℚ (𝔽*-assoc p q r)
iv = toℚ-* p (q 𝔽* r)
v = ap (_* toℚ (q 𝔽* r)) (toℚ-to𝔽 (p , α) ⁻¹)
ℚ-zero-left-is-zero : (q : ℚ) → 0ℚ * q = 0ℚ
ℚ-zero-left-is-zero ((x , a) , q) = γ
where
γ : 0ℚ * ((x , a) , q) = 0ℚ
γ = 0ℚ * ((x , a) , q) =⟨ i ⟩
toℚ (pos 0 , 0) * toℚ (x , a) =⟨ ii ⟩
toℚ ((pos 0 , 0) 𝔽* (x , a)) =⟨ iii ⟩
0ℚ ∎
where
iiiₐₚ : ((pos 0 , 0) 𝔽* (x , a)) ≈ (pos 0 , 0)
iiiₐₚ = 𝔽-zero-left-is-zero (x , a)
i = ap (0ℚ *_) (toℚ-to𝔽 ((x , a) , q))
ii = toℚ-* (pos 0 , 0) (x , a) ⁻¹
iii = equiv→equality ((pos 0 , 0) 𝔽* (x , a)) (pos 0 , 0) iiiₐₚ
ℚ-zero-right-is-zero : (q : ℚ) → q * 0ℚ = 0ℚ
ℚ-zero-right-is-zero q = ℚ*-comm q 0ℚ ∙ ℚ-zero-left-is-zero q
ℚ-mult-left-id : (q : ℚ) → 1ℚ * q = q
ℚ-mult-left-id (q , α) = γ
where
γ : 1ℚ * (q , α) = (q , α)
γ = 1ℚ * (q , α) =⟨ ap (toℚ (pos 1 , 0) *_) (toℚ-to𝔽 (q , α)) ⟩
toℚ (pos 1 , 0) * toℚ q =⟨ toℚ-* (pos 1 , 0) q ⁻¹ ⟩
toℚ ((pos 1 , 0) 𝔽* q) =⟨ ap toℚ (𝔽-mult-left-id q) ⟩
toℚ q =⟨ toℚ-to𝔽 (q , α) ⁻¹ ⟩
(q , α) ∎
ℚ-mult-right-id : (q : ℚ) → q * 1ℚ = q
ℚ-mult-right-id q = ℚ*-comm q 1ℚ ∙ ℚ-mult-left-id q
ℚ-distributivity : (p q r : ℚ) → p * (q + r) = p * q + p * r
ℚ-distributivity (p , α) (q , β) (r , δ) = γ
where
γ : (p , α) * ((q , β) + (r , δ)) = (p , α) * (q , β) + (p , α) * (r , δ)
γ = (p , α) * ((q , β) + (r , δ)) =⟨ refl ⟩
(p , α) * toℚ (q 𝔽+ r) =⟨ i ⟩
toℚ p * toℚ (q 𝔽+ r) =⟨ ii ⟩
toℚ (p 𝔽* (q 𝔽+ r)) =⟨ iii ⟩
toℚ (p 𝔽* q 𝔽+ p 𝔽* r) =⟨ iv ⟩
toℚ (p 𝔽* q) + toℚ (p 𝔽* r) =⟨ v ⟩
toℚ (p 𝔽* q) + toℚ p * toℚ r =⟨ vi ⟩
toℚ p * toℚ q + toℚ p * toℚ r =⟨ vii ⟩
(p , α) * toℚ q + (p , α) * toℚ r =⟨ viii ⟩
(p , α) * (q , β) + (p , α) * toℚ r =⟨ ix ⟩
(p , α) * (q , β) + (p , α) * (r , δ) ∎
where
i = ap (_* toℚ (q 𝔽+ r)) (toℚ-to𝔽 (p , α))
ii = toℚ-* p (q 𝔽+ r) ⁻¹
iii = equiv→equality (p 𝔽* (q 𝔽+ r)) (p 𝔽* q 𝔽+ p 𝔽* r) (𝔽-dist p q r)
iv = toℚ-+ (p 𝔽* q) (p 𝔽* r)
v = ap (toℚ (p 𝔽* q) +_) (toℚ-* p r)
vi = ap (_+ toℚ p * toℚ r) (toℚ-* p q)
vii = ap (λ - → - * toℚ q + - * toℚ r) (toℚ-to𝔽 (p , α) ⁻¹)
viii = ap (λ - → (p , α) * - + (p , α) * toℚ r) (toℚ-to𝔽 (q , β) ⁻¹)
ix = ap (λ - → (p , α) * (q , β) + (p , α) * -) (toℚ-to𝔽 (r , δ) ⁻¹)
ℚ-distributivity' : (p q r : ℚ) → (q + r) * p = q * p + r * p
ℚ-distributivity' p q r = γ
where
γ : (q + r) * p = q * p + r * p
γ = (q + r) * p =⟨ ℚ*-comm (q + r) p ⟩
p * (q + r) =⟨ ℚ-distributivity p q r ⟩
p * q + p * r =⟨ ap₂ _+_ (ℚ*-comm p q) (ℚ*-comm p r) ⟩
q * p + r * p ∎
ℚ*-inv : (q : ℚ) → ¬ (q = 0ℚ) → ℚ
ℚ*-inv ((pos 0 , a) , p) nz = 𝟘-elim (nz γ)
where
γ : (pos 0 , a) , p = 0ℚ
γ = numerator-zero-is-zero (((pos 0 , a) , p)) refl
ℚ*-inv ((pos (succ x) , a) , p) nz = toℚ ((pos (succ a)) , x)
ℚ*-inv ((negsucc x , a) , p) nz = toℚ ((negsucc a) , x)
ℚ*-inverse-product : (q : ℚ)
→ (nz : ¬ (q = 0ℚ))
→ q * ℚ*-inv q nz = 1ℚ
ℚ*-inverse-product ((pos 0 , a) , α) nz = 𝟘-elim (nz γ)
where
γ : (pos 0 , a) , α = 0ℚ
γ = numerator-zero-is-zero ((pos 0 , a) , α) refl
ℚ*-inverse-product ((pos (succ x) , a) , α) nz = γ
where
px = pos (succ x)
pa = pos (succ a)
I : ((px , a) 𝔽* (pa , x)) ≈ (pos 1 , 0)
I = px ℤ* pa =⟨ i ⟩
pa ℤ* px =⟨ ii ⟩
pos 1 ℤ* (pa ℤ* px) =⟨ iii ⟩
pos 1 ℤ* pos (succ (pred (succ a ℕ* succ x))) ∎
where
i = ℤ*-comm px pa
ii = ℤ-mult-left-id (pa ℤ* px) ⁻¹
iii = ap (pos 1 ℤ*_) (denom-setup a x ⁻¹)
γ : ((px , a) , α) * toℚ (pa , x) = 1ℚ
γ = ((px , a) , α) * toℚ (pa , x) =⟨ i ⟩
toℚ (px , a) * toℚ (pa , x) =⟨ ii ⟩
toℚ ((px , a) 𝔽* (pa , x)) =⟨ iii ⟩
toℚ (pos 1 , 0) ∎
where
i = ap (_* toℚ (pa , x)) (toℚ-to𝔽 ((px , a) , α))
ii = toℚ-* (px , a) (pa , x) ⁻¹
iii = equiv→equality ((px , a) 𝔽* (pa , x)) (pos 1 , 0) I
ℚ*-inverse-product ((negsucc x , a) , α) nz = γ
where
px = pos (succ x)
pa = pos (succ a)
I : ((negsucc x , a) 𝔽* (negsucc a , x)) ≈ (pos 1 , 0)
I = negsucc x ℤ* negsucc a =⟨ i ⟩
px ℤ* pa =⟨ ii ⟩
pa ℤ* px =⟨ iii ⟩
pos 1 ℤ* (pa ℤ* px) =⟨ iv ⟩
pos 1 ℤ* pos (succ (pred (succ a ℕ* succ x))) ∎
where
i = minus-times-minus-is-positive px pa
ii = ℤ*-comm px pa
iii = ℤ-mult-left-id (pa ℤ* px) ⁻¹
iv = ap (pos 1 ℤ*_) (denom-setup a x ⁻¹)
γ : ((negsucc x , a) , α) * ℚ*-inv ((negsucc x , a) , α) nz = 1ℚ
γ = ((negsucc x , a) , α) * toℚ (negsucc a , x) =⟨ i ⟩
toℚ (negsucc x , a) * toℚ (negsucc a , x) =⟨ ii ⟩
toℚ ((negsucc x , a) 𝔽* (negsucc a , x)) =⟨ iii ⟩
toℚ (pos 1 , 0) ∎
where
i = ap (_* toℚ (negsucc a , x)) (toℚ-to𝔽 ((negsucc x , a) , α))
ii = toℚ-* (negsucc x , a) (negsucc a , x) ⁻¹
iii = equiv→equality ((negsucc x , a) 𝔽* (negsucc a , x)) (pos 1 , 0) I
ℚ*-inverse : (q : ℚ) → ¬ (q = 0ℚ) → Σ q' ꞉ ℚ , q * q' = 1ℚ
ℚ*-inverse q nz = ℚ*-inv q nz , ℚ*-inverse-product q nz
ℚ-into-half : (q : ℚ) → q = q * 1/2 + q * 1/2
ℚ-into-half q = q =⟨ ℚ-mult-right-id q ⁻¹ ⟩
q * 1ℚ =⟨ ap (q *_) (1/2+1/2 ⁻¹) ⟩
q * (1/2 + 1/2) =⟨ ℚ-distributivity q 1/2 1/2 ⟩
q * 1/2 + q * 1/2 ∎
ℚ-into-half' : (q : ℚ) → q = 1/2 * q + 1/2 * q
ℚ-into-half' q = q =⟨ ℚ-into-half q ⟩
q * 1/2 + q * 1/2 =⟨ ap (q * 1/2 +_) (ℚ*-comm q 1/2) ⟩
q * 1/2 + 1/2 * q =⟨ ap (_+ 1/2 * q) (ℚ*-comm q 1/2) ⟩
1/2 * q + 1/2 * q ∎
ℚ*-rearrange : (x y z : ℚ) → x * y * z = x * z * y
ℚ*-rearrange x y z = x * y * z =⟨ ℚ*-assoc x y z ⟩
x * (y * z) =⟨ ap (x *_) (ℚ*-comm y z) ⟩
x * (z * y) =⟨ ℚ*-assoc x z y ⁻¹ ⟩
x * z * y ∎
ℚ*-rearrange' : (x y z : ℚ) → x * y * z = z * x * y
ℚ*-rearrange' x y z = x * y * z =⟨ ℚ*-comm (x * y) z ⟩
z * (x * y) =⟨ ℚ*-assoc z x y ⁻¹ ⟩
z * x * y ∎
half-of-quarter : 1/2 * 1/2 = 1/4
half-of-quarter = refl
\end{code}