|
| 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