Skip to content

Commit 5889aa9

Browse files
authored
Merge pull request #109 from purescript/add-gcd
Add gcd and lcm
2 parents 9732688 + 6dbbdaf commit 5889aa9

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

src/Data/EuclideanRing.purs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
module Data.EuclideanRing
22
( class EuclideanRing, degree, div, mod, (/)
3+
, gcd
4+
, lcm
35
, module Data.CommutativeRing
46
, module Data.Ring
57
, module Data.Semiring
68
) where
79

10+
import Data.BooleanAlgebra ((||))
811
import Data.CommutativeRing (class CommutativeRing)
12+
import Data.Eq (class Eq, (==))
913
import Data.Ring (class Ring, sub, (-))
1014
import Data.Semiring (class Semiring, add, mul, one, zero, (*), (+))
1115
import Data.Unit (Unit, unit)
@@ -69,3 +73,17 @@ foreign import intDiv :: Int -> Int -> Int
6973
foreign import intMod :: Int -> Int -> Int
7074

7175
foreign import numDiv :: Number -> Number -> Number
76+
77+
-- | The *greatest common divisor* of two values.
78+
gcd :: forall a. (Eq a, EuclideanRing a) => a -> a -> a
79+
gcd a b =
80+
if b == zero
81+
then a
82+
else gcd b (a `mod` b)
83+
84+
-- | The *least common multiple* of two values.
85+
lcm :: forall a. (Eq a, EuclideanRing a) => a -> a -> a
86+
lcm a b =
87+
if a == zero || b == zero
88+
then zero
89+
else a * b / gcd a b

src/Data/Field.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Data.Field
77
) where
88

99
import Data.CommutativeRing (class CommutativeRing)
10-
import Data.EuclideanRing (class EuclideanRing, degree, div, mod, (/))
10+
import Data.EuclideanRing (class EuclideanRing, degree, div, mod, (/), gcd, lcm)
1111
import Data.Ring (class Ring, negate, sub)
1212
import Data.Semiring (class Semiring, add, mul, one, zero, (*), (+))
1313
import Data.Unit (Unit)

src/Prelude.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import Data.BooleanAlgebra (class BooleanAlgebra)
3838
import Data.Bounded (class Bounded, bottom, top)
3939
import Data.CommutativeRing (class CommutativeRing)
4040
import Data.Eq (class Eq, eq, notEq, (/=), (==))
41-
import Data.EuclideanRing (class EuclideanRing, degree, div, mod, (/))
41+
import Data.EuclideanRing (class EuclideanRing, degree, div, mod, (/), gcd, lcm)
4242
import Data.Field (class Field)
4343
import Data.Function (const, flip, ($), (#))
4444
import Data.Functor (class Functor, flap, map, void, ($>), (<#>), (<$), (<$>), (<@>))

0 commit comments

Comments
 (0)