# gcd 0 0 = 0

Dylan Thurston dpt@math.harvard.edu
Tue, 18 Dec 2001 13:12:14 -0500

```On Tue, Dec 18, 2001 at 06:00:30PM +0100, Kent Karlsson wrote:
> Why?  If EVERY natural number is to have a  prime factorisation, then BOTH
> 0 AND 1 have to be promoted to prime numbers;

1 has a perfectly fine prime factorization.  It is the product of 0 primes,
the null product.  (A null product is defined, for very good reasons, to
be 1, just like a null sum is defined to be 0.)

I could see defences of calling 0 a prime, although it is not standard
mathematical practice.  The ideal generated by 0 is a prime ideal,
for one thing.  0 would still not have a unique prime factorization,
however.  (But Haskell should not unilaterally decide to violate standard
mathematical terminology!)

> ... But
> there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0
> is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part
> is often left implicit (e.g. one is only talking about strictly positive
> integers), which is part of the reason why we are having this discussion).

What fundamental reason do you have in mind?  Why do you use this definition
of divisibility?  (I'm curious; other mathematicians give the same
definition, and I can't see why.)

This thread made me curious, so I did a little library research.  I was
surprised to discover that mathematicians discover on this, the domain
of definition of "gcd a b":

Domain		  References
------		  ----------
a /= 0, b /= 0	  Lang, "Algebra, 3rd Edition"
Hasse, "Number Theory"

a, b not both 0	  Koblitz, "A Course on Number Theory and Cryptography"

all a, b allowed  MacLane and Birkhoff, "Algebra, 2nd Edition"
Koch, "Number Theory"

At least the books by Lang and MacLane-Birkhoff are standard references.
Note that the definitions all agree when they are defined (with gcd 0 0 = 0).

As I said, I was surprised; to me, the definiton with all a and b is the
more natural one.  I still recommend using the full domain (especially since
exceptions are awkward to deal with in Haskell), but I'm not as certain.

Best,
Dylan Thurston

```