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}