Andrew Sneap - October - November 2021
Updated May - July 2022
This file defines division of natural numbers as a Σ type. Many common
proofs of properties of division are also provided.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import MLTT.Spartan renaming (_+_ to _∔_)
open import Naturals.Addition
open import Naturals.Multiplication
open import Naturals.Properties
open import Naturals.Order
open import Notation.Order
open import UF.DiscreteAndSeparated
open import UF.Subsingletons
module Naturals.Division where
\end{code}
First, we have the definition of division. Division can also be
defined inductively, but as with most definitions I have instead
chosen to express division as a Σ type.
\begin{code}
_∣_ : ℕ → ℕ → 𝓤₀ ̇
x ∣ y = Σ a ꞉ ℕ , (x * a = y)
\end{code}
Notice that we cannot prove that (x y : ℕ) → is-prop (x ∣ y).
When x = 0, and y = 0, we can choose any factor a and the identity type holds.
On the other hand, for values x > 0, it is a proposition that x | y.
This is proved using the cancellative property of multiplication of
factors greater than 0.
\begin{code}
_∣_-is-prop : (x y : ℕ) → is-prop (succ x ∣ y)
_∣_-is-prop x y (a , p) (b , p') = to-subtype-= (λ _ → ℕ-is-set) II
where
I : succ x * a = succ x * b
I = p ∙ p' ⁻¹
II : a = b
II = mult-left-cancellable a b x I
\end{code}
Clearly, 1 divides anything, which is easily proved since 1 is the
multiplicative identity of naturals.
0 does not divide any value greater than 0. If this was the case, then
we would have that 0 * a = 0 = succ x, which is a contradiction.
Also, any number divides itself, and divides zero.
\begin{code}
1-divides-all : (x : ℕ) → 1 ∣ x
1-divides-all x = x , mult-left-id x
zero-does-not-divide-positive : (x : ℕ) → ¬(0 ∣ succ x)
zero-does-not-divide-positive x (a , p) = positive-not-zero x γ
where
γ : succ x = 0
γ = succ x =⟨ p ⁻¹ ⟩
0 * a =⟨ zero-left-base a ⟩
0 ∎
∣-refl : {x : ℕ} → x ∣ x
∣-refl = 1 , refl
everything-divides-zero : {x : ℕ} → x ∣ 0
everything-divides-zero = 0 , refl
\end{code}
For natural numbers, division has the property that if x | y and
y | x, then x = y. This property is used to prove that if the
numerator a of a rational is 0, then the rational is 0. In order to
prove this, we first need two lemmas.
The first is that if x < y, and x < z, then x < y * z.
This follows as a corollary of <-+.
\begin{code}
∣-anti-lemma : (x y z : ℕ) → x < y → x < z → x < y * z
∣-anti-lemma x 0 z l₁ l₂ = 𝟘-elim (zero-least' z l₁)
∣-anti-lemma x (succ y) 0 l₁ l₂ = 𝟘-elim (zero-least' y l₂)
∣-anti-lemma x (succ y) (succ z) l₁ l₂ = <-+ x (succ y) (succ y * z) l₁
\end{code}
The second is that if the product of two naturals is 1, then the left
argument is 1. Of course, both arguments are 1 by commutativity of
multiplication.
The proof is by case analysis. When x = 1, we are done.
If x = 0, then x * y = 0 = 1, which is a contradiction.
If x > 1, the consider y. In each case, we find a contradiction.
\begin{code}
left-factor-one : (x y : ℕ) → x * y = 1 → x = 1
left-factor-one 0 y e = 𝟘-elim (zero-not-positive 0 γ)
where
γ : 0 = 1
γ = zero-left-base y ⁻¹ ∙ e
left-factor-one 1 y e = refl
left-factor-one (succ (succ x)) 0 e = 𝟘-elim (zero-not-positive 0 e)
left-factor-one (succ (succ x)) 1 e = 𝟘-elim (zero-not-positive x γ)
where
γ : 0 = succ x
γ = succ-lc (e ⁻¹)
left-factor-one (succ (succ x)) (succ (succ y)) e = 𝟘-elim γ
where
l₁ : 0 < succ x
l₁ = zero-least (succ x)
l₂ : 0 < succ y
l₂ = zero-least (succ y)
l₃ : 1 < succ (succ x) * succ (succ y)
l₃ = ∣-anti-lemma 1 (succ (succ x)) (succ (succ y)) l₁ l₂
γ : 𝟘
γ = less-than-not-equal _ _ l₃ (e ⁻¹)
division-refl-right-unit : (x y : ℕ) → succ x * y ∣ succ x → y = 1
division-refl-right-unit x y (k , e) = left-factor-one y k II
where
I : succ x * (y * k) = succ x * 1
I = mult-associativity (succ x) y k ⁻¹ ∙ e
II : y * k = 1
II = mult-left-cancellable (y * k) 1 x I
division-refl-right-factor : (x y : ℕ) → succ x * y ∣ succ x → y ∣ 1
division-refl-right-factor x y (k , e) = γ
where
I : y = 1
I = division-refl-right-unit x y (k , e)
II : 1 ∣ 1
II = 1-divides-all 1
γ : y ∣ 1
γ = transport (_∣ 1) (I ⁻¹) II
\end{code}
And we can finally prove that division is anti-symmetric property,
using the two lemmas, and case analysis on y. In the case y = 0, we
have 0 * b = x, and hence x = y = 0.
In the case y > 0, we can use the fact that multiplication is
cancellable, and the hypothesis x * a = succ y, succ y * b = x to
prove that b = 1, and conclude that division is anti-symmetric.
\begin{code}
∣-anti : (x y : ℕ) → x ∣ y → y ∣ x → x = y
∣-anti x 0 (a , e₁) (b , e₂) = e₂ ⁻¹ ∙ zero-left-base b
∣-anti x (succ y) (a , e₁) (b , e₂) = e₂ ⁻¹ ∙ ap (succ y *_) b-is-1
where
I : succ y * (b * a) = succ y * 1
I = succ y * (b * a) =⟨ mult-associativity (succ y) b a ⁻¹ ⟩
succ y * b * a =⟨ ap (_* a) e₂ ∙ e₁ ⟩
succ y ∎
b*a-is-1 : b * a = 1
b*a-is-1 = mult-left-cancellable (b * a) 1 y I
b-is-1 : b = 1
b-is-1 = left-factor-one b a b*a-is-1
\end{code}
Division distributes over addition, over multiples, and is
transitive. The proofs are simple and corollaries of the properties of
multiplication.
\begin{code}
∣-respects-addition : (x y z : ℕ) → x ∣ y → x ∣ z → x ∣ (y + z)
∣-respects-addition x y z (a , p) (b , q) = (a + b , I)
where
I : x * (a + b) = y + z
I = x * (a + b) =⟨ distributivity-mult-over-addition x a b ⟩
x * a + x * b =⟨ ap (_+ x * b) p ⟩
y + x * b =⟨ ap (y +_) q ⟩
y + z ∎
∣-divisor-divides-multiple : (a b k : ℕ) → a ∣ b → a ∣ k * b
∣-divisor-divides-multiple a b k (x , p) = (x * k) , I
where
I : a * (x * k) = k * b
I = a * (x * k) =⟨ mult-associativity a x k ⁻¹ ⟩
a * x * k =⟨ ap (_* k) p ⟩
b * k =⟨ mult-commutativity b k ⟩
k * b ∎
∣-respects-multiples : (a b c k l : ℕ) → a ∣ b → a ∣ c → a ∣ (k * b + l * c)
∣-respects-multiples a b c k l p₁ p₂ = ∣-respects-addition a (k * b) (l * c) I II
where
I : a ∣ (k * b)
I = ∣-divisor-divides-multiple a b k p₁
II : a ∣ (l * c)
II = ∣-divisor-divides-multiple a c l p₂
∣-trans : (a b c : ℕ) → a ∣ b → b ∣ c → a ∣ c
∣-trans a b c (x , p) (y , q) = (x * y) , I
where
I : a * (x * y) = c
I = a * (x * y) =⟨ mult-associativity a x y ⁻¹ ⟩
(a * x) * y =⟨ ap ( _* y) p ⟩
b * y =⟨ q ⟩
c ∎
\end{code}
Now we state the division theorem for natural numbers. This states
that for a natural number a and d, there exists a quotient q and
remainder r with a = q * (d + 1) + r, with the remainder r less than
succ d.
\begin{code}
division-theorem : (a d : ℕ) → 𝓤₀ ̇
division-theorem a d = Σ q ꞉ ℕ , Σ r ꞉ ℕ , (a = q * succ d + r) × (r < succ d)
\end{code}
There are many ways to compute division on natural numbers. The chosen
method here (mainly to satisfy the termination checker) is to use
natural induction.
To compute (succ d) | a, we do induction on a.
Base: If a = 0, then the quotient and remainder are both 0.
Inductive step: Suppose that (succ d) | k, then there exists q , r
such that k = q * succ d + r, and r < succ d.
We want to show that (succ d) | (succ k).
Since r < succ d, we have that either r < d or r = d.
If r < d, then the quotient remains the same and the remainder
increases by 1. Since r < d, (succ r) < (succ d), and we are done.
If r = d, then the quotient increases by 1 and the remainder is 0.
Clearly, 0 < succ d. Proving that succ k = succ q + succ q * d
follows from the inductive hypothesis and r = d.
\begin{code}
division : (a d : ℕ) → division-theorem a d
division a d = ℕ-induction base step a
where
base : Σ q ꞉ ℕ , Σ r ꞉ ℕ , (0 = q * succ d + r) × (r < succ d)
base = 0 , (0 , (I , II))
where
I : 0 = 0 * succ d + 0
I = 0 =⟨ refl ⟩
0 + 0 =⟨ ap (0 +_) (zero-left-base d ⁻¹) ⟩
0 + 0 * d ∎
II : 0 < succ d
II = zero-least d
step : (k : ℕ)
→ Σ q ꞉ ℕ , Σ r ꞉ ℕ , (k = q * succ d + r) × (r < succ d)
→ Σ q ꞉ ℕ , Σ r ꞉ ℕ , (succ k = q * succ d + r) × (r < succ d)
step k (q , r , e , l) = γ (<-split r d l)
where
γ : (r < d) ∔ (r = d)
→ Σ q ꞉ ℕ , Σ r ꞉ ℕ , (succ k = q * succ d + r) × (r < succ d)
γ (inl l) = q , succ r , ap succ e , l
γ (inr e') = succ q , 0 , I , unique-to-𝟙 (0 < succ d)
where
I : succ k = succ q + succ q * d
I = succ k =⟨ i ⟩
succ (q + q * d + r) =⟨ ii ⟩
succ (q + q * d + d) =⟨ iii ⟩
succ (q + (q * d + d)) =⟨ iv ⟩
succ q + (q * d + d) =⟨ v ⟩
succ q + (d * q + d) =⟨ vi ⟩
succ q + (d + d * q) =⟨ vii ⟩
succ q + succ q * d ∎
where
i = ap succ e
ii = ap succ (ap (q + q * d +_) e')
iii = ap succ (addition-associativity q (q * d) d)
iv = succ-left q (q * d + d) ⁻¹
v = ap (succ q +_) (ap (_+ d) (mult-commutativity q d))
vi = ap (succ q +_) (addition-commutativity (d * q) d)
vii = ap (succ q +_) (mult-commutativity d (succ q))
\end{code}
The division theorem is clearly a proposition.
First, we fix the quotient, and prove that the remainder is unique.
That is, if we have that a = q * succ d + r, and
a = q * succ d + r', then r = r'.
This is easy to prove using cancellation of addition.
\begin{code}
division-is-prop' : (a d q : ℕ)
→ is-prop (Σ r ꞉ ℕ , (a = q * succ d + r) × r < succ d)
division-is-prop' a d q (r₀ , e₀ , l₀) (r₁ , e₁ , l₁) = γ
where
γ₁ : (r : ℕ) → is-prop ((a = q * succ d + r) × r < succ d)
γ₁ r = ×-is-prop ℕ-is-set (<-is-prop-valued r (succ d))
I : q * succ d + r₀ = q * succ d + r₁
I = q * succ d + r₀ =⟨ e₀ ⁻¹ ⟩
a =⟨ e₁ ⟩
q * succ d + r₁ ∎
γ₂ : r₀ = r₁
γ₂ = addition-left-cancellable r₀ r₁ (q * succ d) I
γ : r₀ , e₀ , l₀ = r₁ , e₁ , l₁
γ = to-subtype-= γ₁ γ₂
\end{code}
To conclude that the division theorem is a proposition, we use
trichotomy on the two quotient values q₀ and q₁.
When q₀ = q₁, we are done.
In either of two cases, we can generalise a contradiction proof, which
is done in division-is-prop-lemma.
The idea of the proof is as follows:
We have that:
r₀ ≤ d,
r₁ ≤ d,
q₀ < q₁
a = q₀ * succ d + r₀,
a = q₁ * succ d + r₁,
Hence we have that
q₀ + k = q₁, with k > 0
q₀ * succ d + r₀ = q₁ * succ d + r₁
= (q₀ + k) * succ d + r₁
= (q₀ * d) + k * succ d + r₁
Now, r₀ = k * succ d + r₁
⇒ k * succ d + r₁ ≤ d (since r₀ ≤ d)
⇒ k * succ d ≤ d
⇒ succ d ≤ d, and hence we have a contradiction.
\begin{code}
division-is-prop-lemma : (a d q₀ q₁ r₀ r₁ : ℕ)
→ r₀ ≤ d
→ a = q₀ * succ d + r₀
→ a = q₁ * succ d + r₁
→ ¬ (q₀ < q₁)
division-is-prop-lemma a d q₀ q₁ r₀ r₁ l₁ e₁ e₂ l₂ = not-less-than-itself d γ
where
t : Σ k ꞉ ℕ , k + succ q₀ = q₁
t = subtraction (succ q₀) q₁ l₂
k = pr₁ t
e₃ = pr₂ t
I : q₀ * succ d + r₀ = q₀ * succ d + (succ k * succ d + r₁)
I = q₀ * succ d + r₀ =⟨ e₁ ⁻¹ ⟩
a =⟨ e₂ ⟩
q₁ + q₁ * d + r₁ =⟨ refl ⟩
q₁ * succ d + r₁ =⟨ i ⟩
succ (k + q₀) * succ d + r₁ =⟨ ii ⟩
(q₀ + succ k) * succ d + r₁ =⟨ iii ⟩
q₀ * succ d + succ k * succ d + r₁ =⟨ iv ⟩
q₀ * succ d + (succ k * succ d + r₁) ∎
where
i = ap (λ - → - * succ d + r₁) (e₃ ⁻¹)
ii = ap (λ - → succ - * succ d + r₁) (addition-commutativity k q₀)
iii = ap (_+ r₁) (distributivity-mult-over-addition' q₀ (succ k) (succ d))
iv = addition-associativity (q₀ * succ d) (succ k * succ d) r₁
II : r₀ = succ k * succ d + r₁
II = addition-left-cancellable r₀ (succ k * succ d + r₁) (q₀ * succ d) I
III : succ k * succ d + r₁ ≤ d
III = transport (_≤ d) II l₁
IV : succ k * succ d ≤ succ k * succ d + r₁
IV = ≤-+ (succ k * succ d) r₁
V : succ k * succ d ≤ d
V = ≤-trans (succ k * succ d) (succ k * succ d + r₁) d IV III
VI : succ d * succ k ≤ d
VI = transport (_≤ d) (mult-commutativity (succ k) (succ d)) V
γ : succ d ≤ d
γ = product-order-cancellable (succ d) k d VI
division-is-prop : (a d : ℕ) → is-prop (division-theorem a d)
division-is-prop a d (q₀ , r₀ , e₀ , l₀) (q₁ , r₁ , e₁ , l₁) = γ I
where
I : (q₀ < q₁) ∔ (q₀ = q₁) ∔ (q₁ < q₀)
I = <-trichotomous q₀ q₁
γ : (q₀ < q₁) ∔ (q₀ = q₁) ∔ (q₁ < q₀)
→ q₀ , r₀ , e₀ , l₀ = q₁ , r₁ , e₁ , l₁
γ (inl l) = 𝟘-elim (division-is-prop-lemma a d q₀ q₁ r₀ r₁ l₀ e₀ e₁ l)
γ (inr (inl e)) = to-subtype-= (division-is-prop' a d) e
γ (inr (inr l)) = 𝟘-elim (division-is-prop-lemma a d q₁ q₀ r₁ r₀ l₁ e₁ e₀ l)
\end{code}
A property of division which is sometimes useful is the following.
If a * b = a * c + d. If we were considering integers, this would be
easy to prove by simply by rewriting the equation as a * (b - c) =
d. With natural numbers, instead use induction on b and c.
If c = 0, we are done, since a * b ∣ d.
If b = 0, then 0 = a * c + d, and hence d = 0, and a * 0 = 0, and we are done.
If b , c > 0, then we use induction.
The inductive hypothesis is: a * b = a * c + d → a ∣ d,
and we have a * (b + 1) = a * (c + 1) + d.
Since addition is left cancellable, we can find that a * b = a * c + d and we
are done.
\begin{code}
factor-of-sum-consequence : (a b c d : ℕ) → a * b = a * c + d → a ∣ d
factor-of-sum-consequence a b 0 d e = b , γ
where
γ : a * b = d
γ = a * b =⟨ e ⟩
a * 0 + d =⟨ zero-left-neutral d ⟩
d ∎
factor-of-sum-consequence a 0 (succ c) d e = 0 , γ
where
γ : 0 = d
γ = sum-to-zero-gives-zero (a * succ c) d (e ⁻¹) ⁻¹
factor-of-sum-consequence a (succ b) (succ c) d e = γ
where
I : a * succ b = a + (a * c + d)
I = a * succ b =⟨ e ⟩
a * succ c + d =⟨ addition-associativity a (a * c) d ⟩
a + (a * c + d) ∎
II : a * b = a * c + d
II = addition-left-cancellable (a * b) (a * c + d) a I
γ : a ∣ d
γ = factor-of-sum-consequence a b c d II
\end{code}