arithmoi-0.10.0.0: Efficient basic number-theoretic functions.

Copyright(c) 2018 Alexandre Rodrigues Baldé
LicenseMIT
MaintainerAlexandre Rodrigues Baldé <alexandrer_b@outlook.com>
Safe HaskellNone
LanguageHaskell2010

Math.NumberTheory.Euclidean

Description

This module exports a class to represent Euclidean domains.

Synopsis

Documentation

class Semiring a => GcdDomain a where #

GcdDomain represents a GCD domain. This is a domain, where GCD can be defined, but which does not necessarily allow a well-behaved division with remainder (as in Euclidean domains).

For example, there is no way to define rem over polynomials with integer coefficients such that remainder is always "smaller" than divisor. However, gcd is still definable, just not by means of Euclidean algorithm.

All methods of GcdDomain have default implementations in terms of Euclidean. So most of the time it is enough to write:

instance GcdDomain Foo
instance Euclidean Foo where
  quotRem = ...
  degree  = ...

Minimal complete definition

Nothing

Methods

divide :: a -> a -> Maybe a infixl 7 #

Division without remainder.

\x y -> (x * y) `divide` y == Just x
\x y -> maybe True (\z -> x == z * y) (x `divide` y)

gcd :: a -> a -> a #

Greatest common divisor. Must satisfy

\x y -> isJust (x `divide` gcd x y) && isJust (y `divide` gcd x y)
\x y z -> isJust (gcd (x * z) (y * z) `divide` z)

lcm :: a -> a -> a #

Lowest common multiple. Must satisfy

\x y -> isJust (lcm x y `divide` x) && isJust (lcm x y `divide` y)
\x y z -> isNothing (z `divide` x) || isNothing (z `divide` y) || isJust (z `divide` lcm x y)

coprime :: a -> a -> Bool #

Test whether two arguments are coprime. Must match its default definition:

\x y -> coprime x y == isJust (1 `divide` gcd x y)
Instances
GcdDomain Double 
Instance details

Defined in Data.Euclidean

GcdDomain Float 
Instance details

Defined in Data.Euclidean

Methods

divide :: Float -> Float -> Maybe Float #

gcd :: Float -> Float -> Float #

lcm :: Float -> Float -> Float #

coprime :: Float -> Float -> Bool #

GcdDomain Int 
Instance details

Defined in Data.Euclidean

Methods

divide :: Int -> Int -> Maybe Int #

gcd :: Int -> Int -> Int #

lcm :: Int -> Int -> Int #

coprime :: Int -> Int -> Bool #

GcdDomain Integer 
Instance details

Defined in Data.Euclidean

GcdDomain Natural 
Instance details

Defined in Data.Euclidean

GcdDomain Word 
Instance details

Defined in Data.Euclidean

Methods

divide :: Word -> Word -> Maybe Word #

gcd :: Word -> Word -> Word #

lcm :: Word -> Word -> Word #

coprime :: Word -> Word -> Bool #

GcdDomain () 
Instance details

Defined in Data.Euclidean

Methods

divide :: () -> () -> Maybe () #

gcd :: () -> () -> () #

lcm :: () -> () -> () #

coprime :: () -> () -> Bool #

GcdDomain CFloat 
Instance details

Defined in Data.Euclidean

GcdDomain CDouble 
Instance details

Defined in Data.Euclidean

GcdDomain GaussianInteger Source # 
Instance details

Defined in Math.NumberTheory.Quadratic.GaussianIntegers

GcdDomain EisensteinInteger Source # 
Instance details

Defined in Math.NumberTheory.Quadratic.EisensteinIntegers

Integral a => GcdDomain (Ratio a) 
Instance details

Defined in Data.Euclidean

Methods

divide :: Ratio a -> Ratio a -> Maybe (Ratio a) #

gcd :: Ratio a -> Ratio a -> Ratio a #

lcm :: Ratio a -> Ratio a -> Ratio a #

coprime :: Ratio a -> Ratio a -> Bool #

Field a => GcdDomain (Complex a) 
Instance details

Defined in Data.Euclidean

Methods

divide :: Complex a -> Complex a -> Maybe (Complex a) #

gcd :: Complex a -> Complex a -> Complex a #

lcm :: Complex a -> Complex a -> Complex a #

coprime :: Complex a -> Complex a -> Bool #

Integral a => GcdDomain (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Fractional a => GcdDomain (WrappedFractional a) 
Instance details

Defined in Data.Euclidean

class GcdDomain a => Euclidean a where #

Informally speaking, Euclidean is a superclass of Integral, lacking toInteger, which allows to define division with remainder for a wider range of types, e. g., complex integers and polynomials with rational coefficients.

Euclidean represents a Euclidean domain endowed by a given Euclidean function degree.

Minimal complete definition

quotRem, degree

Methods

quotRem :: a -> a -> (a, a) #

Division with remainder.

\x y -> y == 0 || let (q, r) = x `quotRem` y in x == q * y + r

quot :: a -> a -> a infixl 7 #

Division. Must match its default definition:

\x y -> quot x y == fst (quotRem x y)

rem :: a -> a -> a infixl 7 #

Remainder. Must match its default definition:

\x y -> rem x y == snd (quotRem x y)

degree :: a -> Natural #

Euclidean (aka degree, valuation, gauge, norm) function on a. Usually fromIntegral . abs.

degree is rarely used by itself. Its purpose is to provide an evidence of soundness of quotRem by testing the following property:

\x y -> y == 0 || let (q, r) = x `quotRem` y in (r == 0 || degree r < degree y)
Instances
Euclidean Double 
Instance details

Defined in Data.Euclidean

Euclidean Float 
Instance details

Defined in Data.Euclidean

Methods

quotRem :: Float -> Float -> (Float, Float) #

quot :: Float -> Float -> Float #

rem :: Float -> Float -> Float #

degree :: Float -> Natural #

Euclidean Int 
Instance details

Defined in Data.Euclidean

Methods

quotRem :: Int -> Int -> (Int, Int) #

quot :: Int -> Int -> Int #

rem :: Int -> Int -> Int #

degree :: Int -> Natural #

Euclidean Integer 
Instance details

Defined in Data.Euclidean

Euclidean Natural 
Instance details

Defined in Data.Euclidean

Euclidean Word 
Instance details

Defined in Data.Euclidean

Methods

quotRem :: Word -> Word -> (Word, Word) #

quot :: Word -> Word -> Word #

rem :: Word -> Word -> Word #

degree :: Word -> Natural #

Euclidean () 
Instance details

Defined in Data.Euclidean

Methods

quotRem :: () -> () -> ((), ()) #

quot :: () -> () -> () #

rem :: () -> () -> () #

degree :: () -> Natural #

Euclidean CFloat 
Instance details

Defined in Data.Euclidean

Euclidean CDouble 
Instance details

Defined in Data.Euclidean

Euclidean GaussianInteger Source # 
Instance details

Defined in Math.NumberTheory.Quadratic.GaussianIntegers

Euclidean EisensteinInteger Source # 
Instance details

Defined in Math.NumberTheory.Quadratic.EisensteinIntegers

Integral a => Euclidean (Ratio a) 
Instance details

Defined in Data.Euclidean

Methods

quotRem :: Ratio a -> Ratio a -> (Ratio a, Ratio a) #

quot :: Ratio a -> Ratio a -> Ratio a #

rem :: Ratio a -> Ratio a -> Ratio a #

degree :: Ratio a -> Natural #

Field a => Euclidean (Complex a) 
Instance details

Defined in Data.Euclidean

Methods

quotRem :: Complex a -> Complex a -> (Complex a, Complex a) #

quot :: Complex a -> Complex a -> Complex a #

rem :: Complex a -> Complex a -> Complex a #

degree :: Complex a -> Natural #

Integral a => Euclidean (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Fractional a => Euclidean (WrappedFractional a) 
Instance details

Defined in Data.Euclidean

newtype WrappedIntegral a #

Wrapper around Integral with GcdDomain and Euclidean instances.

Constructors

WrapIntegral 

Fields

Instances
Enum a => Enum (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Eq a => Eq (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Integral a => Integral (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Num a => Num (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Ord a => Ord (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Real a => Real (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Show a => Show (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Bits a => Bits (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Integral a => GcdDomain (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Integral a => Euclidean (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Num a => Semiring (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

Num a => Ring (WrappedIntegral a) 
Instance details

Defined in Data.Euclidean

extendedGCD :: (Eq a, Num a, Euclidean a) => a -> a -> (a, a, a) Source #

Calculate the greatest common divisor of two numbers and coefficients for the linear combination.

For signed types satisfies:

case extendedGCD a b of
  (d, u, v) -> u*a + v*b == d
               && d == gcd a b

For unsigned and bounded types the property above holds, but since u and v must also be unsigned, the result may look weird. E. g., on 64-bit architecture

extendedGCD (2 :: Word) (3 :: Word) == (1, 2^64-1, 1)

For unsigned and unbounded types (like Natural) the result is undefined.

For signed types we also have

abs u < abs b || abs b <= 1

abs v < abs a || abs a <= 1

(except if one of a and b is minBound of a signed type).

isUnit :: (Eq a, GcdDomain a) => a -> Bool Source #

Check whether an element is a unit of the ring.