--- gmpxx.h.old	2002-11-20 06:46:56.000000000 +1000
+++ gmpxx.h	2003-06-20 17:11:43.000000000 +1000
@@ -681,7 +681,11 @@
     if (mpz_fits_slong_p(w))
       mpz_set_si(z, l / mpz_get_si(w));
     else
-      mpz_set_si(z, 0);
+      {
+        /* if w is bigger than a long then the quotient must be zero, unless
+           l==LONG_MIN and w==-LONG_MIN in which case the quotient is -1 */
+        mpz_set_si (z, (mpz_cmpabs_ui (w, (l >= 0 ? l : -l)) == 0 ? -1 : 0));
+      }
   }
   static void eval(mpz_ptr z, mpz_srcptr w, double d)
   {
@@ -872,17 +876,18 @@
   }
   static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
   {
-    if (l >= 0)
-      mpz_mod_ui(z, w, l);
-    else
-      mpz_mod_ui(z, w, -l);
+    mpz_tdiv_r_ui (z, w, (l >= 0 ? l : -l));
   }
   static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
   {
     if (mpz_fits_slong_p(w))
       mpz_set_si(z, l % mpz_get_si(w));
     else
-      mpz_set_si(z, l);
+      {
+        /* if w is bigger than a long then the remainder is l unchanged,
+           unless l==LONG_MIN and w==-LONG_MIN in which case it's 0 */
+        mpz_set_si (z, mpz_cmpabs_ui (w, (l >= 0 ? l : -l)) == 0 ? 0 : l);
+      }
   }
   static void eval(mpz_ptr z, mpz_srcptr w, double d)
   {
