| NumericPrelude-0.0: An experimental alternative hierarchy of numeric type classes | Contents | Index |
|
Algebra.PrincipalIdealDomain |
|
|
|
|
|
Synopsis |
|
class (C a, C a) => C a where | | | extendedGCD :: C a => a -> a -> (a, (a, a)) | | gcd :: C a => a -> a -> a | | lcm :: C a => a -> a -> a | | euclid :: (C a, C a) => (a -> a -> a) -> a -> a -> a | | extendedEuclid :: (C a, C a) => (a -> a -> (a, a)) -> a -> a -> (a, (a, a)) | | extendedGCDMulti :: C a => [a] -> (a, [a]) | | diophantine :: C a => a -> a -> a -> Maybe (a, a) | | diophantineMin :: C a => a -> a -> a -> Maybe (a, a) | | diophantineMulti :: C a => a -> [a] -> Maybe [a] | | chineseRemainder :: C a => (a, a) -> (a, a) -> Maybe (a, a) | | chineseRemainderMulti :: C a => [(a, a)] -> Maybe (a, a) | | propMaximalDivisor :: C a => a -> a -> a -> Property | | propGCDDiophantine :: (Eq a, C a) => a -> a -> Bool | | propExtendedGCDMulti :: (Eq a, C a) => [a] -> Bool | | propDiophantine :: (Eq a, C a) => a -> a -> a -> a -> Bool | | propDiophantineMin :: (Eq a, C a) => a -> a -> a -> a -> Bool | | propDiophantineMulti :: (Eq a, C a) => [(a, a)] -> Bool | | propDiophantineMultiMin :: (Eq a, C a) => [(a, a)] -> Bool | | propChineseRemainder :: (Eq a, C a) => a -> a -> [a] -> Property | | propDivisibleGCD :: C a => a -> a -> Bool | | propDivisibleLCM :: C a => a -> a -> Bool | | propGCDIdentity :: (Eq a, C a) => a -> Bool | | propGCDCommutative :: (Eq a, C a) => a -> a -> Bool | | propGCDAssociative :: (Eq a, C a) => a -> a -> a -> Bool | | propGCDHomogeneous :: (Eq a, C a) => a -> a -> a -> Bool | | propGCD_LCM :: (Eq a, C a) => a -> a -> Bool |
|
|
|
Class
|
|
class (C a, C a) => C a where |
A principal ideal domain is a ring in which every ideal
(the set of multiples of some generating set of elements)
is principal:
That is,
every element can be written as the multiple of some generating element.
gcd a b gives a generator for the ideal generated by a and b.
The algorithm above works whenever mod x y is smaller
(in a suitable sense) than both x and y;
otherwise the algorithm may run forever.
Laws:
divides x (lcm x y)
x `gcd` (y `gcd` z) == (x `gcd` y) `gcd` z
gcd x y * z == gcd (x*z) (y*z)
gcd x y * lcm x y == x * y
(etc: canonical)
Minimal definition:
* nothing, if the standard Euclidean algorithm work
* if extendedGCD is implemented customly, gcd and lcm make use of it
| | Methods | extendedGCD :: a -> a -> (a, (a, a)) | Compute the greatest common divisor and
solve a respective Diophantine equation.
(g,(a,b)) = extendedGCD x y ==>
g==a*x+b*y && g == gcd x y
TODO: This method is not appropriate for the PID class,
because there are rings like the one of the multivariate polynomials,
where for all x and y greatest common divisors of x and y exist,
but they cannot be represented as a linear combination of x and y.
TODO: The definition of extendedGCD does not return the canonical associate.
| | gcd :: a -> a -> a | The Greatest Common Divisor is defined by:
gcd x y == gcd y x
divides z x && divides z y ==> divides z (gcd x y) (specification)
divides (gcd x y) x
| | lcm :: a -> a -> a | Least common multiple
|
| | Instances | |
|
|
extendedGCD :: C a => a -> a -> (a, (a, a)) |
Compute the greatest common divisor and
solve a respective Diophantine equation.
(g,(a,b)) = extendedGCD x y ==>
g==a*x+b*y && g == gcd x y
TODO: This method is not appropriate for the PID class,
because there are rings like the one of the multivariate polynomials,
where for all x and y greatest common divisors of x and y exist,
but they cannot be represented as a linear combination of x and y.
TODO: The definition of extendedGCD does not return the canonical associate.
|
|
gcd :: C a => a -> a -> a |
The Greatest Common Divisor is defined by:
gcd x y == gcd y x
divides z x && divides z y ==> divides z (gcd x y) (specification)
divides (gcd x y) x
|
|
lcm :: C a => a -> a -> a |
Least common multiple
|
|
Standard implementations for instances
|
|
euclid :: (C a, C a) => (a -> a -> a) -> a -> a -> a |
|
extendedEuclid :: (C a, C a) => (a -> a -> (a, a)) -> a -> a -> (a, (a, a)) |
|
Algorithms
|
|
extendedGCDMulti :: C a => [a] -> (a, [a]) |
Compute the greatest common divisor for multiple numbers
by repeated application of the two-operand-gcd.
|
|
diophantine :: C a => a -> a -> a -> Maybe (a, a) |
A variant with small coefficients.
Just (a,b) = diophantine z x y
means
a*x+b*y = z.
It is required that gcd(y,z) divides x.
|
|
diophantineMin :: C a => a -> a -> a -> Maybe (a, a) |
Like diophantine, but a is minimal
with respect to the measure function of the Euclidean algorithm.
|
|
diophantineMulti :: C a => a -> [a] -> Maybe [a] |
|
chineseRemainder :: C a => (a, a) -> (a, a) -> Maybe (a, a) |
Not efficient enough, because GCD/LCM is computed twice.
|
|
chineseRemainderMulti :: C a => [(a, a)] -> Maybe (a, a) |
For Just (b,n) = chineseRemainder [(a0,m0), (a1,m1), ..., (an,mn)]
and all x with x = b mod n the congruences
x=a0 mod m0, x=a1 mod m1, ..., x=an mod mn
are fulfilled.
|
|
Properties
|
|
propMaximalDivisor :: C a => a -> a -> a -> Property |
|
propGCDDiophantine :: (Eq a, C a) => a -> a -> Bool |
|
propExtendedGCDMulti :: (Eq a, C a) => [a] -> Bool |
|
propDiophantine :: (Eq a, C a) => a -> a -> a -> a -> Bool |
|
propDiophantineMin :: (Eq a, C a) => a -> a -> a -> a -> Bool |
|
propDiophantineMulti :: (Eq a, C a) => [(a, a)] -> Bool |
|
propDiophantineMultiMin :: (Eq a, C a) => [(a, a)] -> Bool |
|
propChineseRemainder :: (Eq a, C a) => a -> a -> [a] -> Property |
|
propDivisibleGCD :: C a => a -> a -> Bool |
|
propDivisibleLCM :: C a => a -> a -> Bool |
|
propGCDIdentity :: (Eq a, C a) => a -> Bool |
|
propGCDCommutative :: (Eq a, C a) => a -> a -> Bool |
|
propGCDAssociative :: (Eq a, C a) => a -> a -> a -> Bool |
|
propGCDHomogeneous :: (Eq a, C a) => a -> a -> a -> Bool |
|
propGCD_LCM :: (Eq a, C a) => a -> a -> Bool |
|
Produced by Haddock version 0.7 |