[Haskell-cafe] Re: Simple quirk in behavior of `mod`

Thomas ten Cate ttencate at gmail.com
Wed Jul 22 05:36:09 EDT 2009

```There are two ways of looking at the mod operator (on integers):

1. As a map from the integers Z to Z/pZ.
Then n mod p is defined as:
n mod p = { k | k in Z, k = n + ip for some i in Z }
Instead of the set, we ususally write its smallest nonnegative
element. And yes, in that sense, Z/0Z gives:
n mod 0 = { k | k in Z, k = n } = { k } =~ k

2. As the remainder under division by p.
Since n mod 0 would be the remainder under division by 0, this
correctly gives a division by zero error.

I used to think that the definitions were equivalent... apparently not.

Thomas

On Wed, Jul 22, 2009 at 10:05, Chris
> Nathan Bloomfield wrote:
>>
>> I'm fiddling with this
>> <http://cdsmith.wordpress.com/2009/07/20/calculating-multiplicative-inverses-in-modular-arithmetic/>
>> blog post about inverting elements of Z/(p), trying to write the
>> inversion function in pointfree style. This led me to try executing
>> statements like
>>
>>    n `mod` 0
>>
>> which in the ring theoretic sense should be n, at least for integers*.
>> (MathWorld agrees. <http://mathworld.wolfram.com/Congruence.html>)
>
> I agree that (n `mod` 0) ought to be n.  Specifically
>
> divMod n 0 = (0,n)
>
> and
>
> quotRem n 0 = (0,n)
>
> In (divMod n m) the sign of the remainder is always the same as the sign
> of m, unless n or m is zero.  In (quotRem n m) the sign of the quotient
> is the product of the signs of n and m, unless n or m is zero.
>
> --
> Chris
>
> _______________________________________________