Skip to content

Commit a4f934d

Browse files
committed
WIP integer special case module
1 parent 127f3f1 commit a4f934d

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
------------------------------------------------------------------------
2+
-- The Agda standard library
3+
--
4+
-- Modular arithmetic on integers
5+
------------------------------------------------------------------------
6+
7+
open import Data.Integer.Base
8+
9+
module Data.Integer.ModularArithmetic (m : ℤ) where
10+
11+
open import Algebra.Bundles
12+
open import Data.Integer.DivMod
13+
open import Data.Integer.Properties
14+
open import Data.Fin.Base as Fin using (Fin)
15+
import Data.Fin.Properties as Fin
16+
open import Data.Nat.Base as ℕ using (zero; suc)
17+
import Data.Nat.DivMod as ℕ
18+
import Data.Nat.Properties as ℕ
19+
open import Function.Base
20+
open import Function.Bundles
21+
open import Relation.Binary
22+
open import Relation.Binary.PropositionalEquality as ≡ using (_≡_; module ≡-Reasoning)
23+
open import Relation.Nullary.Decidable
24+
25+
open import Algebra.Ideal.Construct.Principal +-*-commutativeRing
26+
27+
open import Algebra.Construct.Quotient.Ring +-*-ring ⟨ m ⟩
28+
29+
30+
ℤ/mℤ : Ring _ _
31+
ℤ/mℤ = quotientRing
32+
33+
-- todo:
34+
-- * chinese remainder theorem specialized to integers
35+
-- * finiteness: for non-zero
36+
37+
module _ .{{_ : NonZero m}} where
38+
39+
from-% : {x y} x % m ≡ y % m x ≋ y
40+
from-% {x} {y} x%m≡y%m = x / m - y / m by begin
41+
x - y ≡⟨ ≡.cong₂ _-_ (a≡a%n+[a/n]*n x m) (a≡a%n+[a/n]*n y m) ⟩
42+
(+ (x % m) + (x / m) * m) - (+ (y % m) + (y / m) * m) ≡⟨ ≡.cong (λ z (+ (x % m) + (x / m) * m) + z) (neg-distrib-+ (+ (y % m)) ((y / m) * m)) ⟩
43+
(+ (x % m) + (x / m) * m) + (- + (y % m) - (y / m) * m) ≡⟨ +-assoc (+ (x % m) + (x / m) * m) (- + (y % m)) (- ((y / m) * m)) ⟨
44+
((+ (x % m) + (x / m) * m) - + (y % m)) - (y / m) * m ≡⟨ ≡.cong (λ z z - (y / m) * m) (+-assoc (+ (x % m)) ((x / m) * m) (- + (y % m))) ⟩
45+
(+ (x % m) + ((x / m) * m - + (y % m))) - (y / m) * m ≡⟨ ≡.cong (λ z (+ (x % m) + z) - (y / m) * m) (+-comm ((x / m) * m) (- + (y % m))) ⟩
46+
(+ (x % m) + (- + (y % m) + (x / m) * m)) - (y / m) * m ≡⟨ ≡.cong (λ z z - (y / m) * m) (+-assoc (+ (x % m)) (- + (y % m)) ((x / m) * m)) ⟨
47+
((+ (x % m) - + (y % m)) + (x / m) * m) - (y / m) * m ≡⟨ +-assoc (+ (x % m) - + (y % m)) ((x / m) * m) (- ((y / m) * m)) ⟩
48+
(+ (x % m) - + (y % m)) + ((x / m) * m - (y / m) * m) ≡⟨ ≡.cong₂ (λ a b (+ a - + (y % m)) + ((x / m) * m + b)) x%m≡y%m (neg-distribˡ-* (y / m) m) ⟩
49+
(+ (y % m) - + (y % m)) + ((x / m) * m + - (y / m) * m) ≡⟨ ≡.cong₂ _+_ (+-inverseʳ (+ (y % m))) (≡.sym (*-distribʳ-+ m (x / m) (- (y / m)))) ⟩
50+
0ℤ + (x / m - y / m) * m ≡⟨ +-identityˡ ((x / m - y / m) * m) ⟩
51+
(x / m - y / m) * m ∎
52+
where open ≡-Reasoning
53+
54+
to-% : {x y} x ≋ y x % m ≡ y % m
55+
to-% {x} {y} (k by x-y≡km) = {!!}
56+
where
57+
open ≡-Reasoning
58+
lemma : x % m ⊖ y % m ≡ (k - (x / m) + (y / m)) * m
59+
lemma = begin
60+
x % m ⊖ y % m ≡⟨ m-n≡m⊖n (x % m) (y % m) ⟨
61+
+ (x % m) - + (y % m) ≡⟨ {!!}
62+
(k - (x / m) + (y / m)) * m ∎
63+
64+
bound : ∣ x % m ⊖ y % m ∣ ℕ.< ∣ m ∣
65+
bound = {!!}
66+
67+
_≋?′_ : Decidable _≋_
68+
x ≋?′ y = map′ from-% to-% (x % m ℕ.≟ y % m)
69+
70+
ℤ/mℤ-finite : Equivalence (Ring.setoid ℤ/mℤ) (≡.setoid (Fin ∣ m ∣))
71+
ℤ/mℤ-finite = record
72+
{ to = λ n Fin.fromℕ< (n%d<d n m)
73+
; from = λ i + Fin.toℕ i
74+
; to-cong = λ x≋y Fin.fromℕ<-cong _ _ (to-% x≋y) _ _
75+
; from-cong = λ i≡j Ring.reflexive ℤ/mℤ (≡.cong (+_ ∘ Fin.toℕ) i≡j)
76+
}
77+
where
78+
open ≡.≡-Reasoning
79+
80+
-- x ≡ x % m + (x / m) * m
81+
-- y ≡ y % m + (y / m) * m
82+
-- x - y ≡ (x / m - y / m) * m + x % m - y % m
83+
-- x - y ≡ k * m
84+
-- something about x % m being smaller than m and at least 0?
85+
-- so k ≡ x / m - y / m
86+
-- and so x % m - y % m
87+
-- ∴ x % m ≡ y % m
88+
89+
_≋?_ : Decidable _≋_
90+
-- need to check whether m is 0
91+
_≋?_ with ℕ.nonZero? ∣ m ∣
92+
... | yes p = _≋?′_ {{p}}
93+
... | no ¬p = {!!}
94+
95+
96+

0 commit comments

Comments
 (0)