123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263-------------------------------------------------------------------------- The Agda standard library---- Greatest Common Divisor for integers------------------------------------------------------------------------ {-# OPTIONS --cubical-compatible --safe #-} module Data.Integer.GCD where open import Data.Integer.Baseopen import Data.Integer.Divisibilityopen import Data.Integer.Propertiesimport Data.Nat.GCD as ℕopen import Data.Product.Base using (_,_)open import Relation.Binary.PropositionalEquality.Core using (_≡_; cong) open import Algebra.Definitions {A = ℤ} _≡_ as Algebra using (Associative; Commutative; LeftIdentity; RightIdentity; LeftZero; RightZero; Zero) -------------------------------------------------------------------------- Definition------------------------------------------------------------------------ gcd : ℤ → ℤ → ℤgcd i j = + ℕ.gcd ∣ i ∣ ∣ j ∣ -------------------------------------------------------------------------- Properties------------------------------------------------------------------------ gcd[i,j]∣i : ∀ i j → gcd i j ∣ igcd[i,j]∣i i j = ℕ.gcd[m,n]∣m ∣ i ∣ ∣ j ∣ gcd[i,j]∣j : ∀ i j → gcd i j ∣ jgcd[i,j]∣j i j = ℕ.gcd[m,n]∣n ∣ i ∣ ∣ j ∣ gcd-greatest : ∀ {i j c} → c ∣ i → c ∣ j → c ∣ gcd i jgcd-greatest c∣i c∣j = ℕ.gcd-greatest c∣i c∣j gcd[0,0]≡0 : gcd 0ℤ 0ℤ ≡ 0ℤgcd[0,0]≡0 = cong (+_) ℕ.gcd[0,0]≡0 gcd[i,j]≡0⇒i≡0 : ∀ i j → gcd i j ≡ 0ℤ → i ≡ 0ℤgcd[i,j]≡0⇒i≡0 i j eq = ∣i∣≡0⇒i≡0 (ℕ.gcd[m,n]≡0⇒m≡0 (+-injective eq)) gcd[i,j]≡0⇒j≡0 : ∀ {i j} → gcd i j ≡ 0ℤ → j ≡ 0ℤgcd[i,j]≡0⇒j≡0 {i} eq = ∣i∣≡0⇒i≡0 (ℕ.gcd[m,n]≡0⇒n≡0 ∣ i ∣ (+-injective eq)) gcd-comm : Commutative gcdgcd-comm i j = cong (+_) (ℕ.gcd-comm ∣ i ∣ ∣ j ∣) gcd-assoc : Associative gcdgcd-assoc i j k = cong (+_) (ℕ.gcd-assoc ∣ i ∣ ∣ j ∣ (∣ k ∣)) gcd-zeroˡ : LeftZero 1ℤ gcdgcd-zeroˡ i = cong (+_) (ℕ.gcd-zeroˡ ∣ i ∣) gcd-zeroʳ : RightZero 1ℤ gcdgcd-zeroʳ i = cong (+_) (ℕ.gcd-zeroʳ ∣ i ∣) gcd-zero : Zero 1ℤ gcdgcd-zero = gcd-zeroˡ , gcd-zeroʳ