Andrew Sneap, 27 April 2021
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import MLTT.Spartan renaming (_+_ to _∔_)
open import Naturals.Addition renaming (_+_ to _ℕ+_)
open import Naturals.Properties
open import Naturals.Order
open import Notation.Order
open import UF.Base
open import UF.Subsingletons
open import Integers.Addition
open import Integers.Type
open import Integers.Negation
open import Integers.Order
open import Integers.Multiplication renaming (_*_ to _ℤ*_)
open import Naturals.Division renaming (_∣_ to _ℕ∣_)
open import Naturals.Multiplication renaming (_*_ to _ℕ*_)
module Integers.Division where
_∣_ : ℤ → ℤ → 𝓤₀ ̇
a ∣ b = Σ x ꞉ ℤ , a ℤ* x = b
_ℤ∣_-is-prop : (a b : ℤ) → not-zero a → is-prop (a ∣ b)
_ℤ∣_-is-prop a b nz (x , p) (x' , p') = to-subtype-= (λ _ → ℤ-is-set) II
where
I : x ℤ* a = x' ℤ* a
I = x ℤ* a =⟨ ℤ*-comm x a ⟩
a ℤ* x =⟨ p ⟩
b =⟨ p' ⁻¹ ⟩
a ℤ* x' =⟨ ℤ*-comm a x' ⟩
x' ℤ* a ∎
II : x = x'
II = ℤ-mult-right-cancellable x x' a nz I
div-equiv-to-pos-div : (a b : ℕ) → a ℕ∣ b → pos a ∣ pos b
div-equiv-to-pos-div a b (x , p) = pos x , goal
where
goal : pos a ℤ* pos x = pos b
goal = pos a ℤ* pos x =⟨ pos-multiplication-equiv-to-ℕ a x ⟩
pos (a ℕ* x) =⟨ ap pos p ⟩
pos b ∎
sign-split : (x : ℤ) → positive x ∔ negative x
sign-split (pos x) = inl ⋆
sign-split (negsucc x) = inr ⋆
pos-div-to-nat-div : (a b : ℕ) → pos a ∣ pos b → a ℕ∣ b
pos-div-to-nat-div a b (pos x , p) = x , pos-lc I
where
I : pos (a ℕ* x) = pos b
I = pos (a ℕ* x) =⟨ pos-multiplication-equiv-to-ℕ a x ⁻¹ ⟩
pos a ℤ* pos x =⟨ p ⟩
pos b ∎
pos-div-to-nat-div a 0 (negsucc x , p) = 0 , refl
pos-div-to-nat-div 0 (succ b) (negsucc x , p) = 𝟘-elim γ
where
I : pos (succ b) = pos 0
I = pos (succ b) =⟨ p ⁻¹ ⟩
pos 0 ℤ* negsucc x =⟨ ℤ-zero-left-base (negsucc x) ⟩
pos 0 ∎
γ : 𝟘
γ = positive-not-zero b (pos-lc I)
pos-div-to-nat-div (succ a) (succ b) (negsucc x , p) = 𝟘-elim γ
where
γ : 𝟘
γ = product-positive-negative-not-positive (succ a) x b p
\end{code}
TODO : Break apart ℤ-division into 4 subproofs
\begin{code}
ℤ-division : (a : ℤ) → (d : ℕ)
→ Σ q ꞉ ℤ , Σ r ꞉ ℕ , (a = q ℤ* pos (succ d) + pos r) × r < succ d
ℤ-division (pos a) d = f (division a d)
where
f : Σ q ꞉ ℕ , Σ r ꞉ ℕ , (a = q ℕ* succ d ℕ+ r) × r < succ d
→ Σ q ꞉ ℤ , Σ r ꞉ ℕ , (pos a = q ℤ* pos (succ d) + pos r) × r < succ d
f (q , r , e , l) = (pos q) , r , I , l
where
I : pos a = pos q ℤ* pos (succ d) + pos r
I = pos a =⟨ ap pos e ⟩
pos (q ℕ* succ d ℕ+ r) =⟨ i ⟩
pos (q ℕ* succ d) + pos r =⟨ ii ⟩
pos q ℤ* pos (succ d) + pos r ∎
where
i = distributivity-pos-addition (q ℕ* (succ d)) r ⁻¹
ii = ap (_+ pos r) (pos-multiplication-equiv-to-ℕ q (succ d) ⁻¹)
ℤ-division (negsucc a) d = f (division (succ a) d)
where
a' = negsucc a
d' = succ d
f : Σ q ꞉ ℕ , Σ r ꞉ ℕ , (succ a = q ℕ* d' ℕ+ r) × r < d'
→ Σ q ꞉ ℤ , Σ r ꞉ ℕ , (a' = q ℤ* pos d' + pos r) × r < d'
f (0 , 0 , e , l) = 𝟘-elim (positive-not-zero a I)
where
I : succ a = 0
I = succ a =⟨ e ⟩
0 ℕ* d' ℕ+ 0 =⟨ zero-left-base d' ⟩
0 ∎
f (succ q , 0 , e , l) = negsucc q , 0 , I , l
where
I : a' = negsucc q ℤ* pos d'
I = a' =⟨ refl ⟩
- pos (succ a) =⟨ i ⟩
- pos (succ q ℕ* d') =⟨ ii ⟩
- pos (succ q) ℤ* pos d' =⟨ iii ⟩
(- pos (succ q)) ℤ* pos d' =⟨ refl ⟩
negsucc q ℤ* pos d' ∎
where
i = ap -_ (ap pos e)
ii = ap -_ (pos-multiplication-equiv-to-ℕ (succ q) d' ⁻¹)
iii = negation-dist-over-mult' (pos (succ q)) (pos d') ⁻¹
f (0 , succ r , e₁ , l₁) = negsucc 0 , I (subtraction' (succ r) (succ d) l₁)
where
n1 : ℤ
n1 = negsucc 0
I : Σ k ꞉ ℕ , k ℕ+ succ r = succ d
→ Σ r ꞉ ℕ , (a' = n1 ℤ* pos (succ d) + pos r) × r < succ d
I (k , e₂) = k , III (cosubtraction k d (r , succ-lc II))
where
k' = pos k
II : succ (r ℕ+ k) = succ d
II = succ (r ℕ+ k) =⟨ ap succ (addition-commutativity r k) ⟩
succ (k ℕ+ r) =⟨ e₂ ⟩
succ d ∎
III : k < succ d
→ (a' = n1 ℤ* pos (succ d) + k')
× k < succ d
III l₂ = V , l₂
where
IV : succ a = succ r
IV = succ a =⟨ e₁ ⟩
0 ℕ* succ d ℕ+ succ r =⟨ i ⟩
succ (0 ℕ+ r) =⟨ ii ⟩
succ r ∎
where
i = ap succ (ap (_ℕ+ r) (zero-left-base (succ d)))
ii = ap succ (zero-left-neutral r)
V : a' = n1 ℤ* pos (succ d) + k'
V = a' =⟨ i ⟩
negsucc r =⟨ ii ⟩
pos 0 + negsucc r =⟨ iii ⟩
k' + (- k') + negsucc r =⟨ iv ⟩
k' + ((- k') + negsucc r) =⟨ v ⟩
(- k') + negsucc r + k' =⟨ vi ⟩
n1 ℤ* k' + (- pos (succ r)) + k' =⟨ vii ⟩
n1 ℤ* k' + n1 ℤ* pos (succ r) + k' =⟨ viii ⟩
n1 ℤ* (k' + pos (succ r)) + k' =⟨ ix ⟩
n1 ℤ* pos (k ℕ+ succ r) + k' =⟨ x ⟩
n1 ℤ* pos (succ d) + k' ∎
where
i = ap negsucc (succ-lc IV)
ii = ℤ-zero-left-neutral (negsucc r) ⁻¹
iii = ap (_+ (negsucc r)) (ℤ-sum-of-inverse-is-zero k' ⁻¹)
iv = ℤ+-assoc k' (- k') (negsucc r)
v = ℤ+-comm k' ((- k') + negsucc r)
vi = ap (λ z → (z + negsucc r) + k') (mult-negation k')
vii = ap (λ z → (n1 ℤ* k' + z) + k') (mult-negation (pos (succ r)))
viii = ap (_+ k') (distributivity-mult-over-ℤ' k' (pos (succ r)) n1 ⁻¹)
ix = ap (λ z → n1 ℤ* z + k') (distributivity-pos-addition k (succ r))
x = ap (λ z → n1 ℤ* pos z + k') e₂
f (succ q , succ r , e₁ , l₁) = negsucc (succ q) , γ
where
I : Σ k ꞉ ℕ , k ℕ+ succ r = d'
→ Σ r ꞉ ℕ , (a' = negsucc (succ q) ℤ* pos d' + pos r) × r < d'
I (k , e₂) = k , III (cosubtraction k d (r , succ-lc II))
where
k' = pos k
q' = pos (succ q)
II : succ (r ℕ+ k) = d'
II = succ (r ℕ+ k) =⟨ ap succ (addition-commutativity r k) ⟩
succ (k ℕ+ r) =⟨ e₂ ⟩
d' ∎
III : k < d' → (a' = negsucc (succ q) ℤ* pos d' + k') × k < d'
III l₂ = V , l₂
where
IV : - pos (succ r) = k' - pos d'
IV = - pos (succ r) =⟨ refl ⟩
negsucc r =⟨ i ⟩
pos 0 + negsucc r =⟨ ii ⟩
k' + (- k') + negsucc r =⟨ iii ⟩
k' + ((- k') - pos (succ r)) =⟨ iv ⟩
k' - (k' + pos (succ r)) =⟨ v ⟩
k' - pos (k ℕ+ succ r) =⟨ vi ⟩
k' - pos d' ∎
where
i = ℤ-zero-left-neutral (negsucc r) ⁻¹
ii = ap (_+ negsucc r) (ℤ-sum-of-inverse-is-zero k' ⁻¹)
iii = ℤ+-assoc k' (- k') (negsucc r)
iv = ap (k' +_) (negation-dist k' (pos (succ r)))
v = ap (λ z → k' - z) (distributivity-pos-addition k (succ r))
vi = ap (λ z → k' - pos z) e₂
V : a' = negsucc (succ q) ℤ* pos d' + k'
V = a' =⟨ refl ⟩
- pos (succ a) =⟨ ap -_ (ap pos e₁) ⟩
- pos (succ q ℕ* d' ℕ+ succ r) =⟨ i ⟩
- (pos (succ q ℕ* d') + pos (succ r)) =⟨ ii ⟩
(- pos (succ q ℕ* d')) - pos (succ r) =⟨ iii ⟩
(- q' ℤ* pos d') - pos (succ r) =⟨ iv ⟩
(- q' ℤ* pos d') + (k' - pos d') =⟨ v ⟩
(- q' ℤ* pos d') - pos d' + k' =⟨ vi ⟩
(- pos d' ℤ* q') - pos d' + k' =⟨ vii ⟩
(- pos d') ℤ* q' - pos d' + k' =⟨ viii ⟩
(- pos d') ℤ* q' - pos d' ℤ* pos 1 + k' =⟨ ix ⟩
(- pos d') ℤ* (q' + pos 1) + k' =⟨ refl ⟩
(- pos d') ℤ* pos (succ (succ q)) + k' =⟨ x ⟩
(- pos d' ℤ* pos (succ (succ q))) + k' =⟨ xi ⟩
(- pos (succ (succ q)) ℤ* pos d') + k' =⟨ xii ⟩
negsucc (succ q) ℤ* pos d' + k' ∎
where
iₐₚ = distributivity-pos-addition (succ q ℕ* d') (succ r) ⁻¹
iiiₐₚ = pos-multiplication-equiv-to-ℕ (succ q) d' ⁻¹
viiₐₚ = negation-dist-over-mult' (pos d') q' ⁻¹
viiiₐₚ = ℤ-mult-right-id (- pos d')
ixₐₚ = distributivity-mult-over-ℤ' q' (pos 1) (- pos d') ⁻¹
xₐₚ = negation-dist-over-mult' (pos d') (pos (succ (succ q)))
xiₐₚ = ℤ*-comm (pos d') (pos (succ (succ q)))
xiiₐₚ = negation-dist-over-mult' (pos (succ (succ q))) (pos d') ⁻¹
i = ap -_ iₐₚ
ii = negation-dist (pos (succ q ℕ* d')) (pos (succ r)) ⁻¹
iii = ap (λ z → (- z) - pos (succ r)) iiiₐₚ
iv = ap ((- q' ℤ* pos d') +_) IV
v = ℤ+-rearrangement (- (q' ℤ* pos d')) k' (- pos d') ⁻¹
vi = ap (λ z → ((- z) + (- pos d')) + k') (ℤ*-comm q' (pos d'))
vii = ap (λ z → (z + (- pos d')) + k') viiₐₚ
viii = ap (λ z → ((- pos d') ℤ* q' + z) + k') viiiₐₚ ⁻¹
ix = ap (_+ k') ixₐₚ
x = ap (_+ k') xₐₚ
xi = ap (λ z → (- z) + k') xiₐₚ
xii = ap (_+ k') xiiₐₚ
γ : Σ r ꞉ ℕ , (a' = negsucc (succ q) ℤ* pos d' + pos r) × r < d'
γ = I (subtraction' (succ r) (succ d) l₁)
ℤ-∣-respects-addition : (x y z : ℤ) → x ∣ y → x ∣ z → x ∣ y + z
ℤ-∣-respects-addition x y z (α , αₚ) (β , βₚ) = α + β , I
where
I : x ℤ* (α + β) = y + z
I = x ℤ* (α + β) =⟨ distributivity-mult-over-ℤ' α β x ⟩
x ℤ* α + x ℤ* β =⟨ ap₂ _+_ αₚ βₚ ⟩
y + z ∎
ℤ-∣-respects-addition-of-multiples : (x y z k l : ℤ)
→ x ∣ y
→ x ∣ z
→ x ∣ (y ℤ* k + z ℤ* l)
ℤ-∣-respects-addition-of-multiples x y z k l (α , αₚ) (β , βₚ) = γ
where
I : x ℤ* (α ℤ* k + β ℤ* l) = y ℤ* k + z ℤ* l
I = x ℤ* (α ℤ* k + β ℤ* l) =⟨ i ⟩
x ℤ* (α ℤ* k) + x ℤ* (β ℤ* l) =⟨ ii ⟩
x ℤ* α ℤ* k + x ℤ* β ℤ* l =⟨ iii ⟩
y ℤ* k + z ℤ* l ∎
where
i = distributivity-mult-over-ℤ' (α ℤ* k) (β ℤ* l) x
ii = ap₂ _+_ (ℤ*-assoc x α k ⁻¹) (ℤ*-assoc x β l ⁻¹)
iii = ap₂ _+_ (ap (_ℤ* k) αₚ) (ap (_ℤ* l) βₚ)
γ : Σ v ꞉ ℤ , x ℤ* v = y ℤ* k + z ℤ* l
γ = α ℤ* k + β ℤ* l , I
\end{code}