diff --git a/src/modules/gmpmod/mpz_glue.c b/src/modules/gmpmod/mpz_glue.c
index 9c64f91c49ad5765ec0610eb0a73cd98eba566a6..939a1e0933fdd6695a505cc0a58256f40553b859 100644
--- a/src/modules/gmpmod/mpz_glue.c
+++ b/src/modules/gmpmod/mpz_glue.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: mpz_glue.c,v 1.9 1996/11/17 18:42:50 nisse Exp $");
+RCSID("$Id: mpz_glue.c,v 1.10 1996/11/18 02:47:51 nisse Exp $");
 #include "gmp_machine.h"
 #include "types.h"
 
@@ -170,7 +170,14 @@ static void mpzmod_digits(INT32 args)
   struct pike_string *s;
   INT32 len;
 
-  base = sp[-args].u.integer;
+  if (!args)
+    base = 10;
+  else
+    {
+      if (sp[-args].type != T_INT)
+	error("wrong type");
+      base = sp[-args].u.integer;
+    }
   if ( (base >= 2) && (base <= 36))
     {
       len = mpz_sizeinbase(THIS, base) + 2;
@@ -208,7 +215,28 @@ static void mpzmod_digits(INT32 args)
   pop_n_elems(args);
   push_string(s);
 }
-  
+
+static void mpzmod_size(INT32 args)
+{
+  int base;
+  if (!args)
+    /* Default is number of bits */
+    base = 2;
+  else
+    {
+      if ((sp-args)->type != T_INT)
+	error("wrong type");
+      base = (sp-args)->u.integer;
+      if ((base != 256) && ((base < 2) || (base > 36)))
+	error("invalid base");
+    }
+  pop_n_elems(args);
+  if (base == 256)
+    push_int((mpz_sizeinbase(THIS, 2) + 7) / 8);
+  else
+    push_int(mpz_sizeinbase(THIS, base));
+}
+
 static void mpzmod_cast(INT32 args)
 {
   if(args < 1)
@@ -412,6 +440,20 @@ static void mpzmod_gcdext2(INT32 args)
   f_aggregate(2);
 }
 
+static void mpzmod_invert(INT32 args)
+{
+  MP_INT *modulo;
+  MP_INT *tmp;
+  
+  modulo = get_mpz(sp-args);
+  if (!mpz_sgn(modulo))
+    error("divide by zero");
+  tmp = get_tmp();
+  if (mpz_invert(tmp, THIS, modulo) == 0)
+    error("not invertible");
+  return_temporary(args);
+}
+
 BINFUN(mpzmod_and,mpz_and)
 BINFUN(mpzmod_or,mpz_ior)
 
@@ -587,7 +629,9 @@ void init_gmpmod_programs(void)
   add_function("__hash",mpzmod_get_int,"function(:int)",0);
   add_function("cast",mpzmod_cast,"function(string:mixed)",0);
 
-  add_function("digits", mpzmod_digits, "function(int:string)", 0);
+  add_function("digits", mpzmod_digits, "function(void|int:string)", 0);
+  add_function("size", mpzmod_size, "function(void|int:int)", 0);
+
   add_function("cast_to_int",mpzmod_get_int,"function(:int)",0);
   add_function("cast_to_string",mpzmod_get_string,"function(:string)",0);
   add_function("cast_to_float",mpzmod_get_float,"function(:float)",0);
@@ -598,6 +642,9 @@ void init_gmpmod_programs(void)
   "function(" MPZ_ARG_TYPE "," MPZ_ARG_TYPE ":array(object))", 0);
   add_function("gcdext2", mpzmod_gcdext2,
   "function(" MPZ_ARG_TYPE "," MPZ_ARG_TYPE ":array(object))", 0);
+  add_function("invert", mpzmod_invert,
+  "function(" MPZ_ARG_TYPE ":object)", 0);
+
   add_function("sqrt",mpzmod_gcd,"function(:object)",0);
   add_function("sqrtrem", mpzmod_sqrtrem, "function(:array(object))", 0);
   add_function("`~",mpzmod_gcd,"function(:object)",0);
@@ -609,8 +656,6 @@ void init_gmpmod_programs(void)
   add_function("divmod", mpzmod_divmod, "function(" MPZ_ARG_TYPE ":array(object))", 0);
   add_function("pow", mpzmod_pow, "function(int:object)", 0);
   add_function("divm", mpzmod_divm, "function(string|int|float|object, string|int|float|object:object)", 0);
-  add_function("invert", mpzmod_invert, "function(:object)", 0);
-  add_function("size_in_base", mpz_size, "function(int:int)", 0);
   add_efun("mpz_pow", mpz_pow, "function(int, int)", 0);
   add_efun("mpz_fac", mpz_fac, "function(int|object:object)", 0);
 #endif