diff --git a/.gitignore b/.gitignore
index f72c334661d3c6048242d6ed61d729afcda46bbf..88cc5a7ce39dbfbae8780c461405fc957b8360d7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,15 @@
 /libwmp.a
 
 /autom4te.cache/
+
 /lib/*.o
 /lib/.deps/
 /lib/.dirstamp
+/lib/extracted
+
+/lib/alias.c
+/lib/c.c
+/lib/fxp.c
+/lib/uint32gmp.c
+/lib/uint64gmp.c
+/lib/z.c
diff --git a/Makefile.am b/Makefile.am
index 8bbcdfbf3ffdc5767bb565be99e7f54c9c8f4c8a..77d72107b41ae7380c60aee69d9ddbe440d7e4be 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,14 +5,12 @@ EXTRA_DIST = COPYING.md COPYING.GPLv3.md NEWS.md README.md
 lib_LIBRARIES = libwmp.a
 
 libwmp_a_SOURCES = \
-  lib/int.h lib/int32.h lib/uint32gmp.h lib/int64.h lib/uint64.h lib/uint64gmp.h lib/fxp.h \
-  lib/euclideandivision.h lib/computerdivision.h lib/bool.h \
-  lib/array.h lib/map.h lib/c.h lib/power.h lib/types.h lib/realinfix.h lib/minmax.h \
-  lib/explog.h lib/square.h \
+  lib/uint32gmp.h lib/uint64gmp.h lib/fxp.h lib/c.h \
   lib/util.c lib/util.h lib/utilold.c lib/utilold.h \
   lib/logical.c lib/logical.h \
   lib/logicalutil.c lib/logicalutil.h \
   lib/logicalold.c lib/logicalold.h \
+  lib/baseinfo.c lib/baseinfo.h \
   lib/compare.c lib/compare.h \
   lib/add.c lib/add.h lib/sub.c lib/sub.h \
   lib/add_1.c lib/add_1.h lib/sub_1.c lib/sub_1.h \
@@ -21,10 +19,17 @@ libwmp_a_SOURCES = \
   lib/div.c lib/div.h \
   lib/powm.c lib/powm.h lib/binverttab.h \
   lib/sqrt.c lib/sqrt.h lib/sqrt1.c lib/sqrt1.h lib/sqrtinit.h \
-  lib/alias.h lib/abs.h \
-  lib/z.c lib/z.h lib/zutil.c lib/zutil.h lib/set.c lib/set.h lib/zadd.c lib/zadd.h \
-  lib/zcmp.c lib/zcmp.h lib/zsub.c lib/zsub.h lib/zmul.c lib/zmul.h \
-  lib/zmul2exp.c lib/zmul2exp.h lib/zdiv2exp.c lib/zdiv2exp.h
-
+  lib/get_str.c lib/get_str.h \
+  lib/set_str.c lib/set_str.h \
+  lib/alias.h \
+  lib/z.h lib/zutil.c lib/zutil.h lib/set.c lib/set.h lib/zadd.c lib/zadd.h \
+  lib/zabs.c lib/zabs.h \
+  lib/zcmp.c lib/zcmp.h \
+  lib/zcmpabs.c lib/zcmpabs.h \
+  lib/zsub.c lib/zsub.h lib/zmul.c lib/zmul.h \
+  lib/zmul2exp.c lib/zmul2exp.h lib/zdiv2exp.c lib/zdiv2exp.h \
+  lib/zdiv.c lib/zdiv.h \
+  lib/zget_str.c lib/zget_str.h \
+  lib/zset_str.c lib/zset_str.h
 
 include_HEADERS = wmp.h wmp-gmp.h
diff --git a/lib/abs.h b/lib/abs.h
deleted file mode 100644
index b671db59dfd94fa48fcb77ca99ea94f95dbb3b92..0000000000000000000000000000000000000000
--- a/lib/abs.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef ABS_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-#define ABS_H_INCLUDED
-#endif // ABS_H_INCLUDED
diff --git a/lib/add.c b/lib/add.c
index 666ca4e2ebb0e8eae0a5bacbace5989889bdfee7..ee4fce80dabf6279ed900be7a607f9bcfd14c817 100644
--- a/lib/add.c
+++ b/lib/add.c
@@ -1,25 +1,5 @@
-#include <stdlib.h>
+#include "add.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "c.h"
-
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "types.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "power.h"
-
-#include "alias.h"
 
 uint64_t wmpn_add_n(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz) {
   uint64_t lx, ly, c;
@@ -150,4 +130,3 @@ uint64_t add_ry(uint64_t * x, int32_t sx, uint64_t * y, int32_t sy) {
 uint64_t add_n_rxy(uint64_t * x, int32_t sx) {
   return wmpn_add_n(x, x, x, sx);
 }
-
diff --git a/lib/add.h b/lib/add.h
index 5dd5a7f228cce39a6ebd1e8299e5339500081d1a..55e521a3e7285a7baf4d744b8ed845c338da3d27 100644
--- a/lib/add.h
+++ b/lib/add.h
@@ -1,10 +1,10 @@
 #ifndef ADD_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
+#include "alias.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_add_n(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz);
 
 uint64_t wmpn_add(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
diff --git a/lib/add_1.c b/lib/add_1.c
index 67def4b228e6bac49696da7a2d6f9175ceba91e4..a3631a92469f620afa3b2938ef3a1c993e028d4b 100644
--- a/lib/add_1.c
+++ b/lib/add_1.c
@@ -1,25 +1,5 @@
-#include <stdlib.h>
+#include "add_1.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "euclideandivision.h"
 
 uint64_t wmpn_add_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y) {
   uint64_t lx;
@@ -119,4 +99,3 @@ uint64_t wmpn_add_1_in_place(uint64_t * x, int32_t sz, uint64_t y) {
   }
   return c;
 }
-
diff --git a/lib/add_1.h b/lib/add_1.h
index d0422eda90b033fd15f4a6d1455ca61305b12468..252446b185db275ef7f1e83cee939ece3320bd08 100644
--- a/lib/add_1.h
+++ b/lib/add_1.h
@@ -1,10 +1,9 @@
 #ifndef ADD_1_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_add_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y);
 
 void wmpn_incr(uint64_t * x, uint64_t y);
diff --git a/lib/addold.c b/lib/addold.c
index d93a13b6041ac8237e4a197da3cc41972ddc256d..d5028eb4da4c35c1938c93bbff4da1b7f9a6ba40 100644
--- a/lib/addold.c
+++ b/lib/addold.c
@@ -1,25 +1,5 @@
-#include <stdlib.h>
+#include "addold.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "c.h"
-
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "types.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "power.h"
-
-#include "alias.h"
 
 uint64_t wmpn_add_n1(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz) {
   uint64_t lx, ly, c;
@@ -116,4 +96,3 @@ uint64_t wmpn_add_in_place(uint64_t * x, int32_t sx, uint64_t * y, int32_t sy) {
   }
   return c;
 }
-
diff --git a/lib/addold.h b/lib/addold.h
index 0cd13e17e12940aec4318d46f2c17ae3ada66168..ae59a72bf822f1df3f600ad87b56d819e9c7fcb6 100644
--- a/lib/addold.h
+++ b/lib/addold.h
@@ -1,10 +1,10 @@
 #ifndef ADDOLD_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
+#include "alias.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_add_n1(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz);
 
 uint64_t wmpn_add1(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
diff --git a/lib/alias.h b/lib/alias.h
index 2df797b964460bc54eba5188d80215e42f63f52c..351cea89a562705132dfb841dc3e1326207ad726 100644
--- a/lib/alias.h
+++ b/lib/alias.h
@@ -1,55 +1,53 @@
 #ifndef ALIAS_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-struct __open_sep_result
-{ uint64_t *__field_0;
-uint64_t *__field_1;
-uint64_t *__field_2;
+
+struct __open_sep_result {
+  uint64_t *__field_0;
+  uint64_t *__field_1;
+  uint64_t *__field_2;
 };
 
-struct __open_rx_result
-{ uint64_t *__field_0;
-uint64_t *__field_1;
-uint64_t *__field_2;
+struct __open_rx_result {
+  uint64_t *__field_0;
+  uint64_t *__field_1;
+  uint64_t *__field_2;
 };
 
-struct __open_shift_sep_result
-{ uint64_t *__field_0;
-uint64_t *__field_1;
+struct __open_shift_sep_result {
+  uint64_t *__field_0;
+  uint64_t *__field_1;
 };
 
 static inline struct __open_sep_result
-open_sep (uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y, int32_t sy)
+open_sep (uint64_t *r, uint64_t *x, int32_t sx, uint64_t *y, int32_t sy)
 {
-struct __open_sep_result result;
-result.__field_0 = r;
-result.__field_1 = x;
-result.__field_2 = y;
-return result;
+  struct __open_sep_result result;
+  result.__field_0 = r;
+  result.__field_1 = x;
+  result.__field_2 = y;
+  return result;
 }
 
 static inline struct __open_rx_result
-open_rx (uint64_t * x, int32_t sx, uint64_t * y, int32_t sy)
+open_rx (uint64_t *x, int32_t sx, uint64_t *y, int32_t sy)
 {
-struct __open_rx_result result;
-result.__field_0 = x;
-result.__field_1 = x;
-result.__field_2 = y;
-return result;
+  struct __open_rx_result result;
+  result.__field_0 = x;
+  result.__field_1 = x;
+  result.__field_2 = y;
+  return result;
 }
 
 static inline struct __open_shift_sep_result
-open_shift_sep (uint64_t * r, uint64_t * x, int32_t sz)
+open_shift_sep (uint64_t *r, uint64_t *x, int32_t sz)
 {
-struct __open_shift_sep_result result;
-result.__field_0 = r;
-result.__field_1 = x;
-return result;
+  struct __open_shift_sep_result result;
+  result.__field_0 = r;
+  result.__field_1 = x;
+  return result;
 }
 
 #define ALIAS_H_INCLUDED
diff --git a/lib/array.h b/lib/array.h
deleted file mode 100644
index f639f99640869298e7e4fe1cb4ca055710e8bae4..0000000000000000000000000000000000000000
--- a/lib/array.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef ARRAY_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-
-
-
-
-
-#define ARRAY_H_INCLUDED
-#endif // ARRAY_H_INCLUDED
diff --git a/lib/baseinfo.c b/lib/baseinfo.c
new file mode 100644
index 0000000000000000000000000000000000000000..03708e52100c53917673ab928bad1cf79b8104e0
--- /dev/null
+++ b/lib/baseinfo.c
@@ -0,0 +1,63 @@
+#include "baseinfo.h"
+#include <stdint.h>
+
+uint32_t wmpn_base_power_of_two_p(uint64_t b) {
+  if (b == UINT64_C(2)) {
+    return 1U;
+  } else {
+    if (b == UINT64_C(4)) {
+      return 2U;
+    } else {
+      if (b == UINT64_C(8)) {
+        return 3U;
+      } else {
+        if (b == UINT64_C(16)) {
+          return 4U;
+        } else {
+          if (b == UINT64_C(32)) {
+            return 5U;
+          } else {
+            if (b == UINT64_C(64)) {
+              return 6U;
+            } else {
+              if (b == UINT64_C(128)) {
+                return 7U;
+              } else {
+                if (b == UINT64_C(256)) {
+                  return 8U;
+                } else {
+                  return 0U;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+struct wmpn_base_info;
+
+
+struct wmpn_base_info wmpn_get_base_info(uint64_t b) {
+  uint64_t m;
+  uint64_t p;
+  uint32_t exp;
+  struct wmpn_base_info wmpn_base_info;
+  m = UINT64_C(0xFFFFFFFFFFFFFFFF) / b;
+  p = b;
+  exp = 1U;
+  while (p <= m) {
+    p = p * b;
+    exp = exp + 1U;
+  }
+  wmpn_base_info.exp = exp;
+  wmpn_base_info.bb = p;
+  return wmpn_base_info;
+}
+
+uint64_t wmpn_limb_size_in_base_2(uint64_t u) {
+  uint64_t shift;
+  shift = (uint64_t)__builtin_clzll(u);
+  return UINT64_C(64) - shift;
+}
diff --git a/lib/baseinfo.h b/lib/baseinfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..ee52f84a7169b5327776bc22d40dbd38a88a7fa2
--- /dev/null
+++ b/lib/baseinfo.h
@@ -0,0 +1,18 @@
+#ifndef BASEINFO_H_INCLUDED
+
+#include "logical.h"
+#include <stdint.h>
+
+uint32_t wmpn_base_power_of_two_p(uint64_t b);
+
+struct wmpn_base_info {
+  uint32_t exp;
+  uint64_t bb;
+};
+
+struct wmpn_base_info wmpn_get_base_info(uint64_t b);
+
+uint64_t wmpn_limb_size_in_base_2(uint64_t u);
+
+#define BASEINFO_H_INCLUDED
+#endif // BASEINFO_H_INCLUDED
diff --git a/lib/bool.h b/lib/bool.h
deleted file mode 100644
index c1e53b88a2d1c23410634ca773c2715590fa47cb..0000000000000000000000000000000000000000
--- a/lib/bool.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef BOOL_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-int implb(int x, int y);
-
-#define BOOL_H_INCLUDED
-#endif // BOOL_H_INCLUDED
diff --git a/lib/c.h b/lib/c.h
index 074f8160ac6983b79b69e3832a7cb6293397f14c..611b381a3ef67193707038565a8cd0e14d5a7897 100644
--- a/lib/c.h
+++ b/lib/c.h
@@ -1,11 +1,13 @@
 #ifndef C_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint32gmp.h"
 #include <stdint.h>
+#include <stdlib.h>
 #include <stdio.h>
 #include <assert.h>
 #include <alloca.h>
 #define IGNORE2(x,y) do { (void)(x); (void)(y); } while (0)
 #define IGNORE3(x,y,z) do { (void)(x); (void)(y); (void)(z); } while (0)
+
 #define C_H_INCLUDED
 #endif // C_H_INCLUDED
diff --git a/lib/compare.c b/lib/compare.c
index 09ac2700b70f5e465fd0aec244d28a7103010f60..4ef322107ff1a87b1614da0703efde3b46eae565 100644
--- a/lib/compare.c
+++ b/lib/compare.c
@@ -1,21 +1,5 @@
-#include <stdlib.h>
+#include "compare.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "map.h"
-
-#include "types.h"
 
 int32_t wmpn_cmp(uint64_t * x, uint64_t * y, int32_t sz) {
   int32_t i;
@@ -35,4 +19,3 @@ int32_t wmpn_cmp(uint64_t * x, uint64_t * y, int32_t sz) {
   }
   return 0;
 }
-
diff --git a/lib/compare.h b/lib/compare.h
index fe5b19907129c1ac4e86ce78dc6eb02b87f22bb7..ff2750c1ccedc6ed2e53831f98e1e4bb09b8d44e 100644
--- a/lib/compare.h
+++ b/lib/compare.h
@@ -1,10 +1,9 @@
 #ifndef COMPARE_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 int32_t wmpn_cmp(uint64_t * x, uint64_t * y, int32_t sz);
 
 #define COMPARE_H_INCLUDED
diff --git a/lib/computerdivision.h b/lib/computerdivision.h
deleted file mode 100644
index fdd350377097415ea83af1cd6522a03f9dc5bf5c..0000000000000000000000000000000000000000
--- a/lib/computerdivision.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef COMPUTERDIVISION_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#define COMPUTERDIVISION_H_INCLUDED
-#endif // COMPUTERDIVISION_H_INCLUDED
diff --git a/lib/div.c b/lib/div.c
index 2c1b85e58c80fbcd956afcb98a42c0b2a9ae9d0c..b6a9b4c95121260c7347b09bec0b06a2808fb0ed 100644
--- a/lib/div.c
+++ b/lib/div.c
@@ -1,50 +1,11 @@
-#include <stdlib.h>
+#include "div.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "compare.h"
-
-#include "utilold.h"
-
-#include "addold.h"
-
-#include "subold.h"
-
-#include "logicalutil.h"
-
-#include "logicalold.h"
-
-#include "euclideandivision.h"
-
-#include "minmax.h"
-
-#include "mul.h"
 
 uint64_t invert_limb(uint64_t d) {
-  return div64_2by1((0xffffffffffffffffUL), (0xffffffffffffffffUL) - d, d);
+  return div64_2by1(0xffffffffffffffffUL, 0xffffffffffffffffUL - d, d);
 }
+struct __div2by1_inv_result;
 
-struct __div2by1_inv_result
-{ uint64_t __field_0;
-  uint64_t __field_1;
-};
 
 struct __div2by1_inv_result div2by1_inv(uint64_t uh, uint64_t ul, uint64_t d,
                                         uint64_t v) {
@@ -124,12 +85,8 @@ uint64_t wmpn_divrem_1(uint64_t * q, uint64_t * x, int32_t sz, uint64_t y) {
     return r;
   }
 }
+struct __div3by2_inv_result;
 
-struct __div3by2_inv_result
-{ uint64_t __field_0;
-  uint64_t __field_1;
-  uint64_t __field_2;
-};
 
 struct __div3by2_inv_result div3by2_inv(uint64_t uh, uint64_t um,
                                         uint64_t ul, uint64_t dh,
@@ -141,7 +98,7 @@ struct __div3by2_inv_result div3by2_inv(uint64_t uh, uint64_t um,
   uint64_t sh, p, tl, th, il, b;
   struct __mul64_double_result struct_res3;
   struct __sub64_with_borrow_result struct_res4, struct_res5, struct_res6,
-                                  struct_res7;
+                                    struct_res7;
   uint64_t ih, bl, b2, bh, rl, c1, rh, bl1, b1;
   struct __add64_with_carry_result struct_res8, struct_res9;
   struct __sub64_with_borrow_result struct_res10, struct_res11;
@@ -272,7 +229,7 @@ uint64_t div_sb_qr(uint64_t * q, uint64_t * x, int32_t sx, uint64_t * y,
     xd1 = xp + mdn;
     nx0 = (xp)[1];
     if (__builtin_expect(x1 == dh && nx0 == dl,0)) {
-      ql = (0xffffffffffffffffUL);
+      ql = 0xffffffffffffffffUL;
       wmpn_submul_1(xd1, y, sy, ql);
       x1 = (xp)[1];
       qp = qp + -1;
@@ -508,4 +465,3 @@ void wmpn_tdiv_qr_in_place(uint64_t * q, int32_t qxn, uint64_t * x,
   free(ny);
   return;
 }
-
diff --git a/lib/div.h b/lib/div.h
index 69c05518f799ecd41c2a8d7e4b03246e472ac191..e189af32cde30a71b3a58d4bb3d7bb78c7db8bfc 100644
--- a/lib/div.h
+++ b/lib/div.h
@@ -1,14 +1,20 @@
 #ifndef DIV_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
+#include "compare.h"
+#include "utilold.h"
+#include "addold.h"
+#include "subold.h"
+#include "logicalutil.h"
+#include "logicalold.h"
+#include "mul.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t invert_limb(uint64_t d);
 
-struct __div2by1_inv_result
-{ uint64_t __field_0;
+struct __div2by1_inv_result {
+  uint64_t __field_0;
   uint64_t __field_1;
 };
 
@@ -17,8 +23,8 @@ struct __div2by1_inv_result div2by1_inv(uint64_t uh, uint64_t ul, uint64_t d,
 
 uint64_t wmpn_divrem_1(uint64_t * q, uint64_t * x, int32_t sz, uint64_t y);
 
-struct __div3by2_inv_result
-{ uint64_t __field_0;
+struct __div3by2_inv_result {
+  uint64_t __field_0;
   uint64_t __field_1;
   uint64_t __field_2;
 };
diff --git a/lib/euclideandivision.h b/lib/euclideandivision.h
deleted file mode 100644
index 3f53625f2a163969d16c89d25c183fce5ade2ca9..0000000000000000000000000000000000000000
--- a/lib/euclideandivision.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef EUCLIDEANDIVISION_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#define EUCLIDEANDIVISION_H_INCLUDED
-#endif // EUCLIDEANDIVISION_H_INCLUDED
diff --git a/lib/explog.h b/lib/explog.h
deleted file mode 100644
index 33b5a4da0bf41e8f2bc1c2f59bf95555f9506803..0000000000000000000000000000000000000000
--- a/lib/explog.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef EXPLOG_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#define EXPLOG_H_INCLUDED
-#endif // EXPLOG_H_INCLUDED
diff --git a/lib/fxp.h b/lib/fxp.h
index 03034786a5b231ae4432de5bbb585644c280f40c..95994f7aef0eb4df0dbb25c72be9f67267552050 100644
--- a/lib/fxp.h
+++ b/lib/fxp.h
@@ -1,13 +1,5 @@
 #ifndef FXP_H_INCLUDED
 
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-uint64_t fxp_init(uint64_t x);
-
-uint64_t fxp_id(uint64_t x);
 
 #define FXP_H_INCLUDED
 #endif // FXP_H_INCLUDED
diff --git a/lib/get_str.c b/lib/get_str.c
new file mode 100644
index 0000000000000000000000000000000000000000..860f67013b5399f1a0211c5c91c10066a40bcd90
--- /dev/null
+++ b/lib/get_str.c
@@ -0,0 +1,122 @@
+#include "get_str.h"
+#include <stdint.h>
+
+uint32_t wmpn_get_str_bits(unsigned char * sp, uint32_t bits, uint64_t * up,
+                           int32_t un) {
+  uint64_t um, sb, b;
+  int32_t e, sn;
+  int32_t i, j;
+  uint64_t shift, digit;
+  uint64_t lu, luqt, high, sj;
+  um = up[un - 1];
+  sb = wmpn_limb_size_in_base_2(um);
+  e = 64 * (un - 1) + (int32_t)sb + (int32_t)bits - 1;
+  sn = e / (int32_t)bits;
+  b = UINT64_C(1) << (uint64_t)bits;
+  i = 0;
+  j = sn;
+  shift = UINT64_C(0);
+  while (j > 0) {
+    j = j - 1;
+    lu = up[i];
+    digit = lu >> shift;
+    shift = shift + (uint64_t)bits;
+    if (shift >= UINT64_C(64)) {
+      i = i + 1;
+      if (i < un) {
+        shift = shift - UINT64_C(64);
+        luqt = up[i];
+        high = luqt << ((uint64_t)bits - shift);
+        digit = digit + high;
+      }
+    }
+    sj = digit % b;
+    sp[j] = (unsigned char)sj;
+  }
+  return (uint32_t)sn;
+}
+
+uint32_t wmpn_limb_get_str(unsigned char * sp, uint64_t * w, uint64_t d1,
+                           uint64_t di, uint64_t shift) {
+  int32_t i;
+  uint64_t h, l, q, r;
+  struct __div2by1_inv_result struct_res;
+  i = 0;
+  while (*w > UINT64_C(0)) {
+    h = *w >> (UINT64_C(64) - shift);
+    l = *w << shift;
+    struct_res = div2by1_inv(h, l, d1, di);
+    q = struct_res.__field_0;
+    r = struct_res.__field_1;
+    sp[i] = (unsigned char)(r >> shift);
+    *w = q;
+    i = i + 1;
+  }
+  return (uint32_t)i;
+}
+
+uint32_t wmpn_get_str_other(unsigned char * sp, int32_t base,
+                            struct wmpn_base_info info, uint64_t * up,
+                            int32_t un) {
+  uint64_t shift, d1, di;
+  int32_t sn, n;
+  uint64_t * tp;
+  uint64_t w;
+  uint64_t o;
+  unsigned char * spn;
+  uint32_t sdone;
+  uint32_t o1;
+  uint64_t lu;
+  unsigned char * spn1;
+  uint32_t sdone1;
+  int32_t i;
+  unsigned char t;
+  shift = (uint64_t)__builtin_clzll((uint64_t)base);
+  d1 = (uint64_t)base << shift;
+  di = invert_limb(d1);
+  sn = 0;
+  n = un;
+  if (n > 1) {
+    tp = alloca((uint32_t)n * sizeof(uint64_t));
+    while (n > 1) {
+      o = wmpn_divrem_1(tp, up, n, info.bb);
+      w = o;
+      wmpn_copyi1(up, tp, n);
+      n = n - (up[n - 1] == UINT64_C(0));
+      spn = sp + sn;
+      o1 = wmpn_limb_get_str(spn, &w, d1, di, shift);
+      sdone = o1;
+      sn = sn + (int32_t)sdone;
+      while (sdone < info.exp) {
+        sp[sn] = 0;
+        sn = sn + 1;
+        sdone = sdone + 1U;
+      }
+    }
+  }
+  lu = *up;
+  spn1 = sp + sn;
+  sdone1 = wmpn_limb_get_str(spn1, &lu, d1, di, shift);
+  sn = sn + (int32_t)sdone1;
+  i = 0;
+  while (2 * i + 1 < sn) {
+    t = sp[i];
+    sp[i] = sp[sn - i - 1];
+    sp[sn - i - 1] = t;
+    i = i + 1;
+  }
+  return (uint32_t)sn;
+}
+
+uint32_t wmpn_get_str(unsigned char * sp, int32_t base, uint64_t * up,
+                      int32_t un) {
+  uint32_t bits;
+  struct wmpn_base_info info;
+  bits = wmpn_base_power_of_two_p((uint64_t)base);
+  if (!(bits == 0U)) {
+    return wmpn_get_str_bits(sp, bits, up, un);
+  } else {
+    info = wmpn_get_base_info((uint64_t)base);
+    return wmpn_get_str_other(sp, base, info, up, un);
+  }
+}
diff --git a/lib/get_str.h b/lib/get_str.h
new file mode 100644
index 0000000000000000000000000000000000000000..a6d33dd0f8d2c8962e10f427645db73c8a7ed666
--- /dev/null
+++ b/lib/get_str.h
@@ -0,0 +1,26 @@
+#ifndef GET_STR_H_INCLUDED
+
+#include "uint64gmp.h"
+#include "c.h"
+#include "powm.h"
+#include "logical.h"
+#include "baseinfo.h"
+#include "div.h"
+#include "utilold.h"
+#include <stdint.h>
+
+uint32_t wmpn_get_str_bits(unsigned char * sp, uint32_t bits, uint64_t * up,
+                           int32_t un);
+
+uint32_t wmpn_limb_get_str(unsigned char * sp, uint64_t * w, uint64_t d1,
+                           uint64_t di, uint64_t shift);
+
+uint32_t wmpn_get_str_other(unsigned char * sp, int32_t base,
+                            struct wmpn_base_info info, uint64_t * up,
+                            int32_t un);
+
+uint32_t wmpn_get_str(unsigned char * sp, int32_t base, uint64_t * up,
+                      int32_t un);
+
+#define GET_STR_H_INCLUDED
+#endif // GET_STR_H_INCLUDED
diff --git a/lib/int.h b/lib/int.h
deleted file mode 100644
index f65cc537361dc3cffee34d17892440de783bd639..0000000000000000000000000000000000000000
--- a/lib/int.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef INT_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-
-
-
-
-
-#define INT_H_INCLUDED
-#endif // INT_H_INCLUDED
diff --git a/lib/int32.h b/lib/int32.h
deleted file mode 100644
index 56bcefd1a1e22759e2c19c5ad30e01518b0f9f3f..0000000000000000000000000000000000000000
--- a/lib/int32.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef INT32_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-
-#define INT32_H_INCLUDED
-#endif // INT32_H_INCLUDED
diff --git a/lib/int64.h b/lib/int64.h
deleted file mode 100644
index 7a78900517626e3212b7e1057b00236d6a356de4..0000000000000000000000000000000000000000
--- a/lib/int64.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef INT64_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-
-#define INT64_H_INCLUDED
-#endif // INT64_H_INCLUDED
diff --git a/lib/logical.c b/lib/logical.c
index d5196aff6faf1fe1cabc6f2215b37226448a1eda..e2ac3814141c5cf84fa4c50b15c4c31f4bb27cc3 100644
--- a/lib/logical.c
+++ b/lib/logical.c
@@ -1,29 +1,5 @@
-#include <stdlib.h>
+#include "logical.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "euclideandivision.h"
-
-#include "logicalutil.h"
-
-#include "alias.h"
 
 uint64_t wmpn_lshift(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt) {
   int32_t msb;
@@ -58,19 +34,6 @@ uint64_t wmpn_lshift(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt) {
   return retval;
 }
 
-uint64_t wmpn_lshift_sep(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt) {
-  uint64_t * nr;
-  uint64_t * nx;
-  struct __open_shift_sep_result struct_res;
-  uint64_t res;
-  struct_res = open_shift_sep(r, x, sz);
-  nr = struct_res.__field_0;
-  nx = struct_res.__field_1;
-  res = wmpn_lshift(nr, nx, sz, cnt);
-  IGNORE2(r,x);
-  return res;
-}
-
 uint64_t wmpn_rshift(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt) {
   uint64_t tnc;
   int32_t msb;
@@ -107,17 +70,3 @@ uint64_t wmpn_rshift(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt) {
   *rp = low;
   return retval;
 }
-
-uint64_t wmpn_rshift_sep(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt) {
-  uint64_t * nr;
-  uint64_t * nx;
-  struct __open_shift_sep_result struct_res;
-  uint64_t res;
-  struct_res = open_shift_sep(r, x, sz);
-  nr = struct_res.__field_0;
-  nx = struct_res.__field_1;
-  res = wmpn_rshift(nr, nx, sz, cnt);
-  IGNORE2(r,x);
-  return res;
-}
-
diff --git a/lib/logical.h b/lib/logical.h
index 285706e52313c41794329fd7b1f0b184fe9aa21a..7e4036083c21793c7fd9945648dd24711317b834 100644
--- a/lib/logical.h
+++ b/lib/logical.h
@@ -1,17 +1,14 @@
 #ifndef LOGICAL_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
+#include "logicalutil.h"
+#include "alias.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-uint64_t wmpn_lshift(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt);
 
-uint64_t wmpn_lshift_sep(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt);
+uint64_t wmpn_lshift(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt);
 
 uint64_t wmpn_rshift(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt);
 
-uint64_t wmpn_rshift_sep(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt);
-
 #define LOGICAL_H_INCLUDED
 #endif // LOGICAL_H_INCLUDED
diff --git a/lib/logicalold.c b/lib/logicalold.c
index b397f38953782ce4877b83bc58d0a30028d9f6d3..05f2abb55610f8330ff3d3c59e9fdea0f1c9908d 100644
--- a/lib/logicalold.c
+++ b/lib/logicalold.c
@@ -1,27 +1,5 @@
-#include <stdlib.h>
+#include "logicalold.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "euclideandivision.h"
-
-#include "logicalutil.h"
 
 uint64_t wmpn_lshift1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt) {
   int32_t msb;
@@ -156,4 +134,3 @@ uint64_t wmpn_rshift_in_place(uint64_t * x, int32_t sz, uint64_t cnt) {
   x[msb] = low;
   return retval;
 }
-
diff --git a/lib/logicalold.h b/lib/logicalold.h
index 92d38426df8ba7343ab82710f0ff2b9da92bc2dd..0e16d3397e85d8f3a26cdf06b33cc00a3e81bda5 100644
--- a/lib/logicalold.h
+++ b/lib/logicalold.h
@@ -1,10 +1,10 @@
 #ifndef LOGICALOLD_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
+#include "logicalutil.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_lshift1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt);
 
 uint64_t wmpn_rshift1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t cnt);
diff --git a/lib/logicalutil.c b/lib/logicalutil.c
index 8efeeeabb975ac9ce9503b6dd36052ede1c5ca04..d21d341603b4aecf535c53842a52d75db7948a65 100644
--- a/lib/logicalutil.c
+++ b/lib/logicalutil.c
@@ -1,34 +1,7 @@
-#include <stdlib.h>
+#include "logicalutil.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
+struct __lsld_ext_result;
 
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "euclideandivision.h"
-
-uint64_t lsl_mod_ext(uint64_t x, uint64_t cnt) {
-  return x << cnt;
-}
-
-struct __lsld_ext_result
-{ uint64_t __field_0;
-  uint64_t __field_1;
-};
 
 struct __lsld_ext_result lsld_ext(uint64_t x, uint64_t cnt) {
   struct __lsld_ext_result result;
@@ -48,8 +21,3 @@ struct __lsld_ext_result lsld_ext(uint64_t x, uint64_t cnt) {
     return result1;
   }
 }
-
-int32_t clz_ext(uint64_t x) {
-  return __builtin_clzll(x);
-}
-
diff --git a/lib/logicalutil.h b/lib/logicalutil.h
index 577c84f37251e3b80dcec3cb9dcfcd0386f2a930..a3e4d12639ebad0237c7eb1a325d7815068d359a 100644
--- a/lib/logicalutil.h
+++ b/lib/logicalutil.h
@@ -1,20 +1,15 @@
 #ifndef LOGICALUTIL_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-uint64_t lsl_mod_ext(uint64_t x, uint64_t cnt);
 
-struct __lsld_ext_result
-{ uint64_t __field_0;
+struct __lsld_ext_result {
+  uint64_t __field_0;
   uint64_t __field_1;
 };
 
 struct __lsld_ext_result lsld_ext(uint64_t x, uint64_t cnt);
 
-int32_t clz_ext(uint64_t x);
-
 #define LOGICALUTIL_H_INCLUDED
 #endif // LOGICALUTIL_H_INCLUDED
diff --git a/lib/map.h b/lib/map.h
deleted file mode 100644
index d24eac9a8b025d2518d6bc93c6e2a39eafe7d545..0000000000000000000000000000000000000000
--- a/lib/map.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef MAP_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-
-#define MAP_H_INCLUDED
-#endif // MAP_H_INCLUDED
diff --git a/lib/minmax.h b/lib/minmax.h
deleted file mode 100644
index 09e16d394527cf5359da6f09b791874ea95564c5..0000000000000000000000000000000000000000
--- a/lib/minmax.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef MINMAX_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-
-#define MINMAX_H_INCLUDED
-#endif // MINMAX_H_INCLUDED
diff --git a/lib/mul.c b/lib/mul.c
index fb19dbc40884eb31ba0a4c7526f356cd0940f4e3..9620bcbbda7e99cc4280bb28c631addd7cc5479a 100644
--- a/lib/mul.c
+++ b/lib/mul.c
@@ -1,27 +1,5 @@
-#include <stdlib.h>
+#include "mul.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "util.h"
-
-#include "add.h"
 
 uint64_t wmpn_mul_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y) {
   uint64_t cl, ul;
@@ -42,7 +20,7 @@ uint64_t wmpn_mul_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y) {
     l = struct_res.__field_0;
     h = struct_res.__field_1;
     lpl = l + cl;
-    cl = (lpl < cl ? UINT64_C(1) : UINT64_C(0)) + h;
+    cl = (lpl < cl) + h;
     *rp = lpl;
     rp = rp + 1;
     n = n - 1;
@@ -71,10 +49,10 @@ uint64_t wmpn_addmul_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y) {
     l = struct_res.__field_0;
     h = struct_res.__field_1;
     lpl = l + cl;
-    cl = (lpl < cl ? UINT64_C(1) : UINT64_C(0)) + h;
+    cl = (lpl < cl) + h;
     rl = *rp;
     lpl = rl + lpl;
-    cl = (lpl < rl ? UINT64_C(1) : UINT64_C(0)) + cl;
+    cl = (lpl < rl) + cl;
     *rp = lpl;
     rp = rp + 1;
     n = n - 1;
@@ -125,7 +103,7 @@ uint64_t wmpn_mul_1_in_place(uint64_t * x, int32_t sz, uint64_t y) {
     l = struct_res.__field_0;
     h = struct_res.__field_1;
     lpl = l + cl;
-    cl = (lpl < cl ? UINT64_C(1) : UINT64_C(0)) + h;
+    cl = (lpl < cl) + h;
     *up = lpl;
     up = up + 1;
     n = n - 1;
@@ -154,10 +132,10 @@ uint64_t wmpn_submul_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y) {
     l = struct_res.__field_0;
     h = struct_res.__field_1;
     lpl = l + cl;
-    cl = (lpl < cl ? UINT64_C(1) : UINT64_C(0)) + h;
+    cl = (lpl < cl) + h;
     rl = *rp;
     lpl = rl - lpl;
-    cl = (lpl > rl ? UINT64_C(1) : UINT64_C(0)) + cl;
+    cl = (lpl > rl) + cl;
     *rp = lpl;
     rp = rp + 1;
     n = n - 1;
@@ -175,4 +153,3 @@ uint64_t wmpn_addmul_2(uint64_t * r, uint64_t * x, int32_t sz, uint64_t * y) {
   y1 = y[1];
   return wmpn_addmul_1(r1, x, sz, y1);
 }
-
diff --git a/lib/mul.h b/lib/mul.h
index d13ea9b324d71231411a895e1111ebf6afb37e9d..c96a60f949abd9722802ef2708886c203f20c8b1 100644
--- a/lib/mul.h
+++ b/lib/mul.h
@@ -1,10 +1,11 @@
 #ifndef MUL_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
+#include "util.h"
+#include "add.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_mul_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y);
 
 uint64_t wmpn_addmul_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y);
diff --git a/lib/mul_basecase.c b/lib/mul_basecase.c
index 708d6a58d65d10c5047af2e89b7fe5f4aa356930..6c1f64a093d63c1bb4fafe40576a1cac33022f82 100644
--- a/lib/mul_basecase.c
+++ b/lib/mul_basecase.c
@@ -1,29 +1,5 @@
-#include <stdlib.h>
+#include "mul_basecase.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "util.h"
-
-#include "add.h"
-
-#include "mul.h"
 
 void wmpn_mul_basecase(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
                        int32_t sy) {
@@ -52,4 +28,3 @@ void wmpn_mul_basecase(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
     vn = vn - 1;
   }
 }
-
diff --git a/lib/mul_basecase.h b/lib/mul_basecase.h
index 8360f5fa5116e646156f73fdd4236297a1092786..acfb7ffc38496d976ce0c60713396425f59475fb 100644
--- a/lib/mul_basecase.h
+++ b/lib/mul_basecase.h
@@ -1,10 +1,12 @@
 #ifndef MUL_BASECASE_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
+#include "util.h"
+#include "add.h"
+#include "mul.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpn_mul_basecase(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
                        int32_t sy);
 
diff --git a/lib/power.h b/lib/power.h
deleted file mode 100644
index ed1029fb7b3e1e1f44a8195675d3bd7156a2f09e..0000000000000000000000000000000000000000
--- a/lib/power.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef POWER_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#define POWER_H_INCLUDED
-#endif // POWER_H_INCLUDED
diff --git a/lib/powm.c b/lib/powm.c
index cc0e09259b195b3f6a714a5ac140b2076e283cd3..f2187f1cfdfb6b3af6fc148d619a36b025b219df 100644
--- a/lib/powm.c
+++ b/lib/powm.c
@@ -1,50 +1,10 @@
-#include <stdlib.h>
+#include "powm.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "array.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "int32.h"
-
-#include "uint32gmp.h"
-
-#include "uint64gmp.h"
-
-#include "int.h"
-
-#include "power.h"
-
-#include "types.h"
-
-#include "compare.h"
-
-#include "util.h"
-
-#include "utilold.h"
-
-#include "addold.h"
-
-#include "subold.h"
-
-#include "mul.h"
-
-#include "logicalutil.h"
-
-#include "div.h"
-
-#include "toom.h"
-
-#include "euclideandivision.h"
 
 #include "binverttab.h"
 
 uint64_t binvert_limb_table (uint64_t n) {
-return (uint64_t)binverttab[n];
+  return (uint64_t)binverttab[n];
 }
 
 void wmpn_redc_1(uint64_t * rp, uint64_t * up, uint64_t * mp, int32_t n,
@@ -139,16 +99,9 @@ static inline void redcify(uint64_t * rp, uint64_t * up, int32_t un,
                            uint64_t * mp, int32_t n) {
   uint64_t * tp;
   uint64_t * qp;
-  int32_t i;
-  uint64_t lzero;
   tp = alloca((uint32_t)(un + n) * sizeof(uint64_t));
   qp = alloca((uint32_t)(un + 1) * sizeof(uint64_t));
-  i = 0;
-  lzero = UINT64_C(0);
-  while (i < n) {
-    tp[i] = lzero;
-    i = i + 1;
-  }
+  wmpn_zero(tp, n);
   wmpn_copyi1(tp + n, up, un);
   wmpn_tdiv_qr(qp, rp, 0, tp, un + n, mp, n);
   return;
@@ -203,9 +156,6 @@ void wmpn_powm(uint64_t * rp, uint64_t * bp, int32_t bn, uint64_t * ep,
   int32_t this_windowsize;
   int32_t ebh1;
   uint64_t * ppn1;
-  uint64_t * o1;
-  int32_t i1;
-  uint64_t lzero;
   le = ep[en - 1];
   cnt = __builtin_clzll(le);
   ebi = 64 * en - cnt;
@@ -272,13 +222,7 @@ void wmpn_powm(uint64_t * rp, uint64_t * bp, int32_t bn, uint64_t * ep,
     wmpn_redc_1(rp, tp, mp, n, mip);
   }
   wmpn_copyi1(tp, rp, n);
-  o1 = tp + n;
-  i1 = 0;
-  lzero = UINT64_C(0);
-  while (i1 < n) {
-    o1[i1] = lzero;
-    i1 = i1 + 1;
-  }
+  wmpn_zero(tp + n, n);
   wmpn_redc_1(rp, tp, mp, n, mip);
   if (wmpn_cmp(rp, mp, n) >= 0) {
     wmpn_sub_n_in_place(rp, mp, n);
@@ -287,4 +231,3 @@ void wmpn_powm(uint64_t * rp, uint64_t * bp, int32_t bn, uint64_t * ep,
     return;
   }
 }
-
diff --git a/lib/powm.h b/lib/powm.h
index 7a211b8fcba94ad9145bd49e01c6604fbeb529c3..ee09c958e2c22f02ca807f6bd385a444ac3b28ae 100644
--- a/lib/powm.h
+++ b/lib/powm.h
@@ -1,10 +1,19 @@
 #ifndef POWM_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint32gmp.h"
+#include "uint64gmp.h"
+#include "compare.h"
+#include "util.h"
+#include "utilold.h"
+#include "addold.h"
+#include "subold.h"
+#include "mul.h"
+#include "logicalutil.h"
+#include "div.h"
+#include "toom.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpn_redc_1(uint64_t * rp, uint64_t * up, uint64_t * mp, int32_t n,
                  uint64_t invm);
 
diff --git a/lib/realinfix.h b/lib/realinfix.h
deleted file mode 100644
index 29db6760d9853349f9787c13982ea4be8d06e27a..0000000000000000000000000000000000000000
--- a/lib/realinfix.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef REALINFIX_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-
-
-
-
-
-
-
-
-#define REALINFIX_H_INCLUDED
-#endif // REALINFIX_H_INCLUDED
diff --git a/lib/set.c b/lib/set.c
index c2134c43ffb5a89db3399e77223a97285e90a240..9587044970ff5dc0599c72ded5752e9eb345b4fd 100644
--- a/lib/set.c
+++ b/lib/set.c
@@ -1,27 +1,5 @@
-#include <stdlib.h>
+#include "set.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "euclideandivision.h"
-
-#include "abs.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "int32.h"
-
-#include "int64.h"
-
-#include "uint64gmp.h"
-
-#include "z.h"
-
-#include "zutil.h"
 
 void wmpz_set_ui(wmpz_ptr dst, uint64_t src) {
   uint64_t * dstp;
@@ -79,4 +57,3 @@ uint64_t wmpz_get_ui(wmpz_ptr src) {
   (void)(src);
   return v;
 }
-
diff --git a/lib/set.h b/lib/set.h
index 975e16fbf95299bda4e042c3d779bbf6a74634f7..ec578a38246f1a5d0228b7496353b87967f473c1 100644
--- a/lib/set.h
+++ b/lib/set.h
@@ -1,10 +1,11 @@
 #ifndef SET_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
+#include "z.h"
+#include "zutil.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpz_set_ui(wmpz_ptr dst, uint64_t src);
 
 uint64_t abs_cast(int64_t x);
diff --git a/lib/set_str.c b/lib/set_str.c
new file mode 100644
index 0000000000000000000000000000000000000000..f254b275f418eb6bbeaa117da88227a395ae4896
--- /dev/null
+++ b/lib/set_str.c
@@ -0,0 +1,105 @@
+#include "set_str.h"
+#include <stdint.h>
+
+int32_t wmpn_set_str_bits(uint64_t * rp, unsigned char * sp, uint32_t sn,
+                          uint32_t bits) {
+  int32_t rn, j;
+  uint32_t shift;
+  uint64_t sj, rlow, slow, nr, shigh;
+  rn = 0;
+  shift = 0U;
+  j = (int32_t)sn;
+  while (j > 0) {
+    j = j - 1;
+    sj = (uint64_t)sp[j];
+    if (shift == 0U) {
+      rp[rn] = sj;
+      rn = rn + 1;
+      shift = bits;
+    } else {
+      rlow = rp[rn - 1];
+      slow = sj << (uint64_t)shift;
+      nr = rlow + slow;
+      rp[rn - 1] = nr;
+      shift = shift + bits;
+      if (shift >= 64U) {
+        shift = shift - 64U;
+        if (shift > 0U) {
+          shigh = sj >> (uint64_t)(bits - shift);
+          rp[rn] = shigh;
+          rn = rn + 1;
+        }
+      }
+    }
+  }
+  normalize(rp, &rn);
+  return rn;
+}
+
+int32_t wmpn_set_str_other(uint64_t * rp, unsigned char * sp, uint32_t sn,
+                           uint64_t b, struct wmpn_base_info info) {
+  uint32_t k;
+  uint64_t w;
+  int32_t j;
+  uint32_t o;
+  uint64_t sj;
+  int32_t rn;
+  uint32_t k1, o1;
+  uint64_t sj1, o2, cy1;
+  uint64_t cy;
+  k = 1U + (sn - 1U) % info.exp;
+  w = (uint64_t)*sp;
+  j = 1;
+  while (1) {
+    k = k - 1U;
+    o = k;
+    if (!(o > 0U)) {
+      break;
+    }
+    sj = (uint64_t)sp[j];
+    w = w * b + sj;
+    j = j + 1;
+  }
+  *rp = w;
+  rn = 1;
+  while (j < (int32_t)sn) {
+    w = (uint64_t)sp[j];
+    j = j + 1;
+    o1 = info.exp - 1U;
+    if (1U <= o1) {
+      for (k1 = 1U; ; ++k1) {
+        sj1 = (uint64_t)sp[j];
+        w = w * b + sj1;
+        j = j + 1;
+        if (k1 == o1) {
+          break;
+        }
+      }
+    }
+    o2 = wmpn_mul_1_in_place(rp, rn, info.bb);
+    cy = o2;
+    cy1 = wmpn_add_1_in_place(rp, rn, w);
+    cy = cy + cy1;
+    if (cy > UINT64_C(0)) {
+      rp[rn] = cy;
+      rn = rn + 1;
+    }
+  }
+  return rn;
+}
+
+int32_t wmpn_set_str(uint64_t * rp, unsigned char * sp, uint32_t sn,
+                     int32_t base) {
+  uint32_t bits;
+  struct wmpn_base_info info;
+  if (sn == 0U) {
+    return 0;
+  }
+  bits = wmpn_base_power_of_two_p((uint64_t)base);
+  if (!(bits == 0U)) {
+    return wmpn_set_str_bits(rp, sp, sn, bits);
+  } else {
+    info = wmpn_get_base_info((uint64_t)base);
+    return wmpn_set_str_other(rp, sp, sn, (uint64_t)base, info);
+  }
+}
diff --git a/lib/set_str.h b/lib/set_str.h
new file mode 100644
index 0000000000000000000000000000000000000000..8bbb37d6349cbce68309c9782266e78bc1d871a0
--- /dev/null
+++ b/lib/set_str.h
@@ -0,0 +1,23 @@
+#ifndef SET_STR_H_INCLUDED
+
+#include "uint64gmp.h"
+#include "c.h"
+#include "powm.h"
+#include "logical.h"
+#include "util.h"
+#include "baseinfo.h"
+#include "mul.h"
+#include "add_1.h"
+#include <stdint.h>
+
+int32_t wmpn_set_str_bits(uint64_t * rp, unsigned char * sp, uint32_t sn,
+                          uint32_t bits);
+
+int32_t wmpn_set_str_other(uint64_t * rp, unsigned char * sp, uint32_t sn,
+                           uint64_t b, struct wmpn_base_info info);
+
+int32_t wmpn_set_str(uint64_t * rp, unsigned char * sp, uint32_t sn,
+                     int32_t base);
+
+#define SET_STR_H_INCLUDED
+#endif // SET_STR_H_INCLUDED
diff --git a/lib/sqrt.c b/lib/sqrt.c
index fe993515f69b78ffd7274d87e741148c60a5ac56..4dd5b76c4423b0cbb223181c4ccbf301d9d97e6e 100644
--- a/lib/sqrt.c
+++ b/lib/sqrt.c
@@ -1,53 +1,5 @@
-#include <stdlib.h>
+#include "sqrt.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "array.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "euclideandivision.h"
-
-#include "int.h"
-
-#include "power.h"
-
-#include "types.h"
-
-#include "compare.h"
-
-#include "utilold.h"
-
-#include "add_1.h"
-
-#include "addold.h"
-
-#include "sub_1.h"
-
-#include "subold.h"
-
-#include "mul.h"
-
-#include "logicalutil.h"
-
-#include "logical.h"
-
-#include "div.h"
-
-#include "sqrt1.h"
-
-#include "alias.h"
-
-#include "explog.h"
-
-#include "toom.h"
 
 uint64_t wmpn_sqrtrem2(uint64_t * sp, uint64_t * rp, uint64_t * np) {
   uint64_t np0, o, prec, nph, rq, u, uh;
@@ -58,7 +10,7 @@ uint64_t wmpn_sqrtrem2(uint64_t * sp, uint64_t * rp, uint64_t * np) {
   o = sqrt1(rp, np[1]);
   sp0 = o;
   rp0 = *rp;
-  prec = (64) / UINT64_C(2);
+  prec = 64 / UINT64_C(2);
   nph = np0 >> (prec + UINT64_C(1));
   rp0 = (rp0 << (prec - UINT64_C(1))) + nph;
   q = rp0 / sp0;
@@ -143,7 +95,7 @@ uint64_t wmpn_dc_sqrtrem(uint64_t * sp, uint64_t * np, int32_t n,
     IGNORE2(sp,scratch);
     res;
     st = sp[l - 1];
-    ql = q << ((64) - UINT64_C(1));
+    ql = q << (64 - UINT64_C(1));
     qh = q >> UINT64_C(1);
     sp[l - 1] = st + ql;
     q = qh;
@@ -304,4 +256,3 @@ int32_t wmpn_sqrtrem(uint64_t * sp, uint64_t * rp, uint64_t * np, int32_t n) {
   }
   return rn;
 }
-
diff --git a/lib/sqrt.h b/lib/sqrt.h
index e2ae68c9d4d6f1d5a5f10f6dc93ab91000327907..ac542769d272c5d40c12412cf0d5b9180e4ec69c 100644
--- a/lib/sqrt.h
+++ b/lib/sqrt.h
@@ -1,10 +1,22 @@
 #ifndef SQRT_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
+#include "compare.h"
+#include "utilold.h"
+#include "add_1.h"
+#include "addold.h"
+#include "sub_1.h"
+#include "subold.h"
+#include "mul.h"
+#include "logicalutil.h"
+#include "logical.h"
+#include "div.h"
+#include "sqrt1.h"
+#include "alias.h"
+#include "toom.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_sqrtrem2(uint64_t * sp, uint64_t * rp, uint64_t * np);
 
 uint64_t wmpn_dc_sqrtrem(uint64_t * sp, uint64_t * np, int32_t n,
diff --git a/lib/sqrt1.c b/lib/sqrt1.c
index 0b80cad39bb63e89fd852c1ba53b1d32321b0967..e5c91630f930226561d65cb6eac5aed522f1e12f 100644
--- a/lib/sqrt1.c
+++ b/lib/sqrt1.c
@@ -1,34 +1,11 @@
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "euclideandivision.h"
-
-#include "realinfix.h"
-
-#include "square.h"
-
-#include "uint64.h"
-
-#include "power.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "fxp.h"
-
-
+#include "sqrt1.h"
 #include "sqrtinit.h"
 
 uint64_t rsa_estimate (uint64_t a) {
-uint64_t abits, x0;
-abits = a >> 55;
-x0 = 0x100 | invsqrttab[abits - 0x80];
-return x0;
+  uint64_t abits, x0;
+  abits = a >> 55;
+  x0 = 0x100 | invsqrttab[abits - 0x80];
+  return x0;
 }
 
 uint64_t sqrt1(uint64_t * rp, uint64_t a0) {
@@ -58,4 +35,3 @@ uint64_t sqrt1(uint64_t * rp, uint64_t a0) {
   *rp = a0 - s;
   return c;
 }
-
diff --git a/lib/sqrt1.h b/lib/sqrt1.h
index 5ed03411598b2f19695719d64b61a395e221b57e..f5dcd447f9b952353ef67855b68bf0c8a4a0d906 100644
--- a/lib/sqrt1.h
+++ b/lib/sqrt1.h
@@ -1,10 +1,8 @@
 #ifndef SQRT1_H_INCLUDED
 
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+#include "c.h"
+#include "fxp.h"
+
 uint64_t sqrt1(uint64_t * rp, uint64_t a0);
 
 #define SQRT1_H_INCLUDED
diff --git a/lib/square.h b/lib/square.h
deleted file mode 100644
index ce39c7b71d80838c329d759cbc0c219b8b91742c..0000000000000000000000000000000000000000
--- a/lib/square.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef SQUARE_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#define SQUARE_H_INCLUDED
-#endif // SQUARE_H_INCLUDED
diff --git a/lib/sub.c b/lib/sub.c
index 5a2dba46321dbc066a718db9985185889c38d85c..0851fa478ed042addaeb751e3192ff9282a1eb86 100644
--- a/lib/sub.c
+++ b/lib/sub.c
@@ -1,25 +1,5 @@
-#include <stdlib.h>
+#include "sub.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "c.h"
-
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "types.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "alias.h"
-
-#include "power.h"
 
 uint64_t wmpn_sub_n(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz) {
   uint64_t lx, ly, b;
@@ -161,4 +141,3 @@ uint64_t sub_ry(uint64_t * x, int32_t sx, uint64_t * y, int32_t sy) {
   IGNORE3(y,sx,sx);
   return res;
 }
-
diff --git a/lib/sub.h b/lib/sub.h
index e38cc197b09fd707e4f40451edb319d6711343ab..86eed71faeb0b70d2761f620c464a49a82b013ab 100644
--- a/lib/sub.h
+++ b/lib/sub.h
@@ -1,10 +1,10 @@
 #ifndef SUB_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
+#include "alias.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_sub_n(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz);
 
 uint64_t wmpn_sub(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
diff --git a/lib/sub_1.c b/lib/sub_1.c
index c8d870f3c45c483e21c267c2cf2133e14f26d7e0..9f19fa7693e5fdb65f7891dfe3213a43f886d01a 100644
--- a/lib/sub_1.c
+++ b/lib/sub_1.c
@@ -1,23 +1,5 @@
-#include <stdlib.h>
+#include "sub_1.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
 
 uint64_t wmpn_sub_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y) {
   uint64_t b, lx;
@@ -113,4 +95,3 @@ uint64_t wmpn_sub_1_in_place(uint64_t * x, int32_t sz, uint64_t y) {
   }
   return b;
 }
-
diff --git a/lib/sub_1.h b/lib/sub_1.h
index 6733b4adefe51b184c3995c7d1976598261bdf41..cb91b2cb8ac5bc7b2f43ca41f0854535c7319fa6 100644
--- a/lib/sub_1.h
+++ b/lib/sub_1.h
@@ -1,10 +1,9 @@
 #ifndef SUB_1_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_sub_1(uint64_t * r, uint64_t * x, int32_t sz, uint64_t y);
 
 void wmpn_decr(uint64_t * x, uint64_t y);
diff --git a/lib/subold.c b/lib/subold.c
index 027f50ec3eb5256e247892f3aa180a725628eb78..9f59f97c6b2b2e9e6370cbfdc4342f7cd20d484a 100644
--- a/lib/subold.c
+++ b/lib/subold.c
@@ -1,25 +1,5 @@
-#include <stdlib.h>
+#include "subold.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "c.h"
-
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "types.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "power.h"
-
-#include "alias.h"
 
 uint64_t wmpn_sub_n1(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz) {
   uint64_t lx, ly, b;
@@ -116,4 +96,3 @@ uint64_t wmpn_sub_in_place(uint64_t * x, int32_t sx, uint64_t * y, int32_t sy) {
   }
   return b;
 }
-
diff --git a/lib/subold.h b/lib/subold.h
index 4be7647b37d9974c97c7ababae7630c37fac0fa6..8fadd21af82adf92c09664c45c752b3f1c1915de 100644
--- a/lib/subold.h
+++ b/lib/subold.h
@@ -1,10 +1,10 @@
 #ifndef SUBOLD_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
+#include "alias.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 uint64_t wmpn_sub_n1(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz);
 
 uint64_t wmpn_sub1(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
diff --git a/lib/toom.c b/lib/toom.c
index 601d1ef8b2e45cb2849442b35143ec6742dc9c2d..b91085f8c0c8d82242335f5ad7600b0095261f37 100644
--- a/lib/toom.c
+++ b/lib/toom.c
@@ -1,49 +1,7 @@
-#include <stdlib.h>
+#include "toom.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "array.h"
 
-#include "map.h"
-
-#include "c.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "int.h"
-
-#include "power.h"
-
-#include "computerdivision.h"
-
-#include "types.h"
-
-#include "compare.h"
-
-#include "util.h"
-
-#include "utilold.h"
-
-#include "add_1.h"
-
-#include "addold.h"
-
-#include "sub_1.h"
-
-#include "subold.h"
-
-#include "mul.h"
-
-#include "mul_basecase.h"
-
-#include "logical.h"
-
-int32_t toom22_threshold() {
-  return 29;
-}
+int32_t toom22_threshold = 29;
 
 void wmpn_toom22_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
                      int32_t sy, uint64_t * scratch);
@@ -79,8 +37,6 @@ void wmpn_toom22_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
   uint64_t * y0t;
   int c0, c1;
   uint64_t * ysm1t;
-  int32_t i;
-  uint64_t lzero;
   uint64_t * v0;
   uint64_t * v0n;
   uint64_t * vinfn;
@@ -135,12 +91,7 @@ void wmpn_toom22_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
     if (c0 && c1) {
       wmpn_sub_n1(ysm1, y1, y0, t);
       ysm1t = ysm1 + t;
-      i = 0;
-      lzero = UINT64_C(0);
-      while (i < n - t) {
-        ysm1t[i] = lzero;
-        i = i + 1;
-      }
+      wmpn_zero(ysm1t, n - t);
       vm1_neg = !(vm1_neg);
     } else {
       wmpn_sub1(ysm1, y0, n, y1, t);
@@ -190,7 +141,7 @@ void wmpn_toom22_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
 
 void wmpn_toom22_mul_rec(uint64_t * r, uint64_t * x, int32_t sx,
                          uint64_t * y, int32_t sy, uint64_t * scratch) {
-  if (sy <= toom22_threshold()) {
+  if (sy <= toom22_threshold) {
     wmpn_mul_basecase(r, x, sx, y, sy);
     return;
   } else {
@@ -206,7 +157,7 @@ void wmpn_toom22_mul_rec(uint64_t * r, uint64_t * x, int32_t sx,
 
 void wmpn_toom22_mul_n_rec(uint64_t * r, uint64_t * x, uint64_t * y,
                            uint64_t * scratch, int32_t sz) {
-  if (sz <= toom22_threshold()) {
+  if (sz <= toom22_threshold) {
     wmpn_mul_basecase(r, x, sz, y, sz);
     return;
   } else {
@@ -241,8 +192,6 @@ void wmpn_toom32_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
   int c0, c1;
   int32_t cmp2;
   uint64_t * ym1t;
-  int32_t i;
-  uint64_t lzero;
   uint64_t cy;
   uint64_t * sn;
   uint64_t c2, c3;
@@ -325,12 +274,7 @@ void wmpn_toom32_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
     if (c0 && c1) {
       wmpn_sub_n1(ym1, y1, y0, t);
       ym1t = ym1 + t;
-      i = 0;
-      lzero = UINT64_C(0);
-      while (i < n - t) {
-        ym1t[i] = lzero;
-        i = i + 1;
-      }
+      wmpn_zero(ym1t, n - t);
       vm1_neg = !(vm1_neg);
     } else {
       wmpn_sub1(ym1, y0, n, y1, t);
@@ -460,7 +404,7 @@ uint64_t wmpn_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
   uint64_t cy1;
   uint64_t * rpn1;
   uint64_t * wsy1;
-  if (sy <= toom22_threshold()) {
+  if (sy <= toom22_threshold) {
     wmpn_mul_basecase(r, x, sx, y, sy);
   } else {
     scratch = alloca((uint32_t)(5 * sy + 128) * sizeof(uint64_t));
@@ -516,7 +460,7 @@ uint64_t wmpn_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
 
 void wmpn_mul_n(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz) {
   uint64_t * ws;
-  if (sz <= toom22_threshold()) {
+  if (sz <= toom22_threshold) {
     wmpn_mul_basecase(r, x, sz, y, sz);
     return;
   } else {
@@ -525,4 +469,3 @@ void wmpn_mul_n(uint64_t * r, uint64_t * x, uint64_t * y, int32_t sz) {
     return;
   }
 }
-
diff --git a/lib/toom.h b/lib/toom.h
index 524367eed9b3ec32862d7fde16b30252e7284814..e587aa532a562ef53afefb90ffb856aa7cc85f9d 100644
--- a/lib/toom.h
+++ b/lib/toom.h
@@ -1,11 +1,20 @@
 #ifndef TOOM_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
+#include "compare.h"
+#include "util.h"
+#include "utilold.h"
+#include "add_1.h"
+#include "addold.h"
+#include "sub_1.h"
+#include "subold.h"
+#include "mul.h"
+#include "mul_basecase.h"
+#include "logical.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-int32_t toom22_threshold();
+
+extern int32_t toom22_threshold;
 
 void wmpn_toom22_mul(uint64_t * r, uint64_t * x, int32_t sx, uint64_t * y,
                      int32_t sy, uint64_t * scratch);
diff --git a/lib/types.h b/lib/types.h
deleted file mode 100644
index efd91f2d0f89a97770016fc319960f5aec588a0a..0000000000000000000000000000000000000000
--- a/lib/types.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef TYPES_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#define TYPES_H_INCLUDED
-#endif // TYPES_H_INCLUDED
diff --git a/lib/uint32gmp.h b/lib/uint32gmp.h
index d913272a2cbb922be1a29c80cd96eb3742e05fda..16792660041f234f67ea265ceeb891b5fc39a726 100644
--- a/lib/uint32gmp.h
+++ b/lib/uint32gmp.h
@@ -1,45 +1,46 @@
 #ifndef UINT32GMP_H_INCLUDED
 
-#include <stdlib.h>
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
 
-struct __add32_with_carry_result
-{ uint32_t __field_0;
-uint32_t __field_1;
+struct __add32_with_carry_result {
+  uint32_t __field_0;
+  uint32_t __field_1;
 };
 
-struct __add32_with_carry_result add32_with_carry(uint32_t x, uint32_t y, uint32_t c);
+struct __add32_with_carry_result
+add32_with_carry(uint32_t x, uint32_t y, uint32_t c);
 
-struct __sub32_with_borrow_result
-{ uint32_t __field_0;
-uint32_t __field_1;
+struct __sub32_with_borrow_result {
+  uint32_t __field_0;
+  uint32_t __field_1;
 };
 
-struct __sub32_with_borrow_result sub32_with_borrow(uint32_t x, uint32_t y, uint32_t b);
+struct __sub32_with_borrow_result
+sub32_with_borrow(uint32_t x, uint32_t y, uint32_t b);
 
-struct __mul32_double_result
-{ uint32_t __field_0;
-uint32_t __field_1;
+struct __mul32_double_result {
+  uint32_t __field_0;
+  uint32_t __field_1;
 };
 
-struct __mul32_double_result mul32_double(uint32_t x, uint32_t y);
+struct __mul32_double_result
+mul32_double(uint32_t x, uint32_t y);
 
-struct __add32_3_result
-{ uint32_t __field_0;
-uint32_t __field_1;
+struct __add32_3_result {
+  uint32_t __field_0;
+  uint32_t __field_1;
 };
 
-struct __add32_3_result add32_3(uint32_t x, uint32_t y, uint32_t z);
+struct __add32_3_result
+add32_3(uint32_t x, uint32_t y, uint32_t z);
 
-struct __lsld32_result
-{ uint32_t __field_0;
-uint32_t __field_1;
+struct __lsld32_result {
+  uint32_t __field_0;
+  uint32_t __field_1;
 };
 
-struct __lsld32_result lsld32(uint32_t x, uint32_t cnt);
+struct __lsld32_result
+lsld32(uint32_t x, uint32_t cnt);
 
 
 #define UINT32GMP_H_INCLUDED
diff --git a/lib/uint64.h b/lib/uint64.h
deleted file mode 100644
index 2a1c949000d5444942d1afeddc200dd138b1105a..0000000000000000000000000000000000000000
--- a/lib/uint64.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef UINT64_H_INCLUDED
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-
-#define UINT64_H_INCLUDED
-#endif // UINT64_H_INCLUDED
diff --git a/lib/uint64gmp.h b/lib/uint64gmp.h
index a57ed41b8a7cbfe2a745574a1fd30b665a96ddf6..58f3b33c2cf547d24af3ece23bd89a80e576ebe4 100644
--- a/lib/uint64gmp.h
+++ b/lib/uint64gmp.h
@@ -1,93 +1,90 @@
 #ifndef UINT64GMP_H_INCLUDED
 
-#include <stdlib.h>
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
 
 typedef unsigned __int128 uint128_t;
 
 struct __mul64_double_result
 { uint64_t __field_0;
-uint64_t __field_1;
+  uint64_t __field_1;
 };
 
 static inline struct __mul64_double_result mul64_double(uint64_t x, uint64_t y)
 {
-uint128_t z = (uint128_t)x * (uint128_t)y;
-struct __mul64_double_result result = { z, z >> 64 };
-return result;
+  uint128_t z = (uint128_t)x * (uint128_t)y;
+  struct __mul64_double_result result = { z, z >> 64 };
+  return result;
 }
 
 static inline uint64_t div64_2by1(uint64_t ul, uint64_t uh, uint64_t d)
 {
-return (((uint128_t)uh << 64) | ul) / d;
+  return (((uint128_t)uh << 64) | ul) / d;
 }
 
-
-struct __add64_with_carry_result
-{ uint64_t __field_0;
-uint64_t __field_1;
+struct __add64_with_carry_result {
+  uint64_t __field_0;
+  uint64_t __field_1;
 };
 
 static inline struct __add64_with_carry_result
 add64_with_carry(uint64_t x, uint64_t y, uint64_t c)
 {
-struct __add64_with_carry_result result;
-uint64_t r = x + y + c;
-result.__field_0 = r;
-if (r == x) result.__field_1 = c;
-else result.__field_1 = (r < x);
-return result;
+  struct __add64_with_carry_result result;
+  uint64_t r = x + y + c;
+  result.__field_0 = r;
+  if (r == x) result.__field_1 = c;
+  else result.__field_1 = (r < x);
+  return result;
 }
 
-struct __sub64_with_borrow_result
-{ uint64_t __field_0;
-uint64_t __field_1;
+struct __sub64_with_borrow_result {
+  uint64_t __field_0;
+  uint64_t __field_1;
 };
 
 static inline struct __sub64_with_borrow_result
 sub64_with_borrow(uint64_t x, uint64_t y, uint64_t b)
 {
-struct __sub64_with_borrow_result result;
-uint64_t r = x - y - b;
-result.__field_0 = r;
-if (r > x) result.__field_1 = 1;
-else if (r == x) result.__field_1 = b;
-else result.__field_1 = 0;
-return result;
+  struct __sub64_with_borrow_result result;
+  uint64_t r = x - y - b;
+  result.__field_0 = r;
+  if (r > x) result.__field_1 = 1;
+  else if (r == x) result.__field_1 = b;
+  else result.__field_1 = 0;
+  return result;
 }
 
-struct __add64_3_result
-{ uint64_t __field_0;
-uint64_t __field_1;
+struct __add64_3_result {
+  uint64_t __field_0;
+  uint64_t __field_1;
 };
 
-static inline struct __add64_3_result add64_3(uint64_t x, uint64_t y, uint64_t z)
+static inline struct __add64_3_result
+add64_3(uint64_t x, uint64_t y, uint64_t z)
 {
-struct __add64_3_result result;
-uint64_t r, c1, c2;
-r = x + y;
-c1 = r < y;
-r += z;
-c2 = r < z;
-result.__field_1 = c1 + c2;
-result.__field_0 = r;
-return result;
+  struct __add64_3_result result;
+  uint64_t r, c1, c2;
+  r = x + y;
+  c1 = r < y;
+  r += z;
+  c2 = r < z;
+  result.__field_1 = c1 + c2;
+  result.__field_0 = r;
+  return result;
 }
 
 struct __lsld64_result
 { uint64_t __field_0;
-uint64_t __field_1;
+  uint64_t __field_1;
 };
 
-static inline struct __lsld64_result lsld64(uint64_t x, uint64_t cnt)
+static inline struct __lsld64_result
+lsld64(uint64_t x, uint64_t cnt)
 {
-struct __lsld64_result result;
-result.__field_1 = x >> (64 - cnt);
-result.__field_0 = x << cnt;
-return result;
+  struct __lsld64_result result;
+  result.__field_1 = x >> (64 - cnt);
+  result.__field_0 = x << cnt;
+  return result;
 }
 
 
diff --git a/lib/util.c b/lib/util.c
index 1b230c142eb118e930c95f45e180a1609f803761..d7d7784a5e875e410562bc07767aa79098caa015 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -1,25 +1,5 @@
-#include <stdlib.h>
+#include "util.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "alias.h"
 
 int32_t wmpn_zero_p(uint64_t * x, int32_t sz) {
   int32_t i;
@@ -94,4 +74,3 @@ void wmpn_copyi(uint64_t * rp, uint64_t * up, int32_t n) {
     }
   }
 }
-
diff --git a/lib/util.h b/lib/util.h
index af619de78654239b02d1b3583a6bf20623d878ca..d313203ca4939a83495ebf5980295736a5ecfaee 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -1,10 +1,10 @@
 #ifndef UTIL_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
+#include "alias.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 int32_t wmpn_zero_p(uint64_t * x, int32_t sz);
 
 void wmpn_zero(uint64_t * r, int32_t sz);
diff --git a/lib/utilold.c b/lib/utilold.c
index 51715f62c03ec7fba16b657ab6c3bc1fdbaee4a1..3d23feff0d186c547488b6fa4ac21646697b8790 100644
--- a/lib/utilold.c
+++ b/lib/utilold.c
@@ -1,23 +1,5 @@
-#include <stdlib.h>
+#include "utilold.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "int32.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "c.h"
-
-#include "array.h"
-
-#include "map.h"
-
-#include "types.h"
 
 void wmpn_copyi1(uint64_t * r, uint64_t * x, int32_t sz) {
   int32_t i;
@@ -33,4 +15,3 @@ void wmpn_copyi1(uint64_t * r, uint64_t * x, int32_t sz) {
     i = i + 1;
   }
 }
-
diff --git a/lib/utilold.h b/lib/utilold.h
index a7a667b0a8727ddfaba47840adef0982a8586184..fc88db03853dffeef20bede190868f08584273ab 100644
--- a/lib/utilold.h
+++ b/lib/utilold.h
@@ -1,10 +1,9 @@
 #ifndef UTILOLD_H_INCLUDED
 
-#include <stdlib.h>
+#include "uint64gmp.h"
+#include "c.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpn_copyi1(uint64_t * r, uint64_t * x, int32_t sz);
 
 #define UTILOLD_H_INCLUDED
diff --git a/lib/z.c b/lib/z.c
deleted file mode 100644
index 6c63cb63372e1f37be2bd35e54816d4eebcd6bdf..0000000000000000000000000000000000000000
--- a/lib/z.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "abs.h"
-
-#include "int32.h"
-
-#include "c.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-
-typedef struct
-{
-int _alloc;
-int _size;
-uint64_t * _ptr;
-} __wmpz_struct;
-
-typedef __wmpz_struct *wmpz_ptr;
-
-#define SIZ(x) ((x)->_size)
-#define ALLOC(x) ((x)->_alloc)
-#define PTR(x) ((x)->_ptr)
-
-
-int32_t abs(int32_t x) {
-  if (x >= 0) {
-    return x;
-  } else {
-    return -x;
-  }
-}
-
-int32_t abs_size_of(wmpz_ptr x) {
-  if (SIZ(x) >= 0) {
-    return SIZ(x);
-  } else {
-    return -SIZ(x);
-  }
-}
-
diff --git a/lib/z.h b/lib/z.h
index 3d6df6beba56bf395afdcdff1f61b6aed62900a3..50832070f4b278af8e4a0d5b6a7fcec7e8690e05 100644
--- a/lib/z.h
+++ b/lib/z.h
@@ -1,28 +1,23 @@
 #ifndef Z_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
 
 typedef struct
 {
-int _alloc;
-int _size;
-uint64_t * _ptr;
+  int _alloc;
+  int _size;
+  uint64_t * _ptr;
 } __wmpz_struct;
 
 typedef __wmpz_struct *wmpz_ptr;
+typedef __wmpz_struct wmpz_t[1];
 
 #define SIZ(x) ((x)->_size)
 #define ALLOC(x) ((x)->_alloc)
 #define PTR(x) ((x)->_ptr)
 
 
-int32_t abs(int32_t x);
-
-int32_t abs_size_of(wmpz_ptr x);
-
 #define Z_H_INCLUDED
 #endif // Z_H_INCLUDED
diff --git a/lib/zabs.c b/lib/zabs.c
new file mode 100644
index 0000000000000000000000000000000000000000..a9f2b1d11c4987c180be730e1318723deded3380
--- /dev/null
+++ b/lib/zabs.c
@@ -0,0 +1,24 @@
+#include "zabs.h"
+#include <stdint.h>
+
+void wmpz_abs(wmpz_ptr w, wmpz_ptr u) {
+  int32_t size;
+  uint64_t * wp;
+  uint64_t * up;
+  if (SIZ(u) >= 0) {
+    size = SIZ(u);
+  } else {
+    size = -SIZ(u);
+  }
+  if (!(u == w)) {
+    wp = wmpz_realloc(w, size);
+    up = PTR(u);
+    wmpn_copyd_sep(wp, up, size);
+    (void)(u);
+    SIZ(w) = size;
+    (void)(w);
+    return;
+  } else {
+    return;
+  }
+}
diff --git a/lib/zabs.h b/lib/zabs.h
new file mode 100644
index 0000000000000000000000000000000000000000..2ff92030ae68ba8d0e6c77fc38a19d52df410f60
--- /dev/null
+++ b/lib/zabs.h
@@ -0,0 +1,14 @@
+#ifndef ZABS_H_INCLUDED
+
+#include "c.h"
+#include "util.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "z.h"
+#include "zutil.h"
+#include <stdint.h>
+
+void wmpz_abs(wmpz_ptr w, wmpz_ptr u);
+
+#define ZABS_H_INCLUDED
+#endif // ZABS_H_INCLUDED
diff --git a/lib/zadd.c b/lib/zadd.c
index 2334cce7dc8548f7b4178d4862d48d0f515823c4..d1675180511ad33fad89a659675cd5c4a5d8448b 100644
--- a/lib/zadd.c
+++ b/lib/zadd.c
@@ -1,37 +1,5 @@
-#include <stdlib.h>
+#include "zadd.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "power.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "util.h"
-
-#include "alias.h"
-
-#include "compare.h"
-
-#include "uint64gmp.h"
-
-#include "add.h"
-
-#include "sub.h"
-
-#include "abs.h"
-
-#include "z.h"
-
-#include "zutil.h"
-
-#include "add_1.h"
-
-#include "sub_1.h"
 
 void wmpz_add(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
   wmpz_ptr u1, v1;
@@ -99,12 +67,7 @@ void wmpz_add(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
         }
       }
       wsize = abs_usize;
-      while (wsize > 0) {
-        if (!(wp[wsize - 1] == UINT64_C(0))) {
-          break;
-        }
-        wsize = wsize - 1;
-      }
+      normalize(wp, &wsize);
       if (usize < 0) {
         wsize = -wsize;
       }
@@ -114,23 +77,13 @@ void wmpz_add(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
         vp2 = PTR(v1);
         if (wmpn_cmp(wp, vp2, abs_usize) < 0) {
           usb3 = sub_n_ry(vp2, wp, abs_usize);
-          while (wsize > 0) {
-            if (!(wp[wsize - 1] == UINT64_C(0))) {
-              break;
-            }
-            wsize = wsize - 1;
-          }
+          normalize(wp, &wsize);
           if (usize >= 0) {
             wsize = -wsize;
           }
         } else {
           usb4 = sub_n_rx(wp, vp2, abs_usize);
-          while (wsize > 0) {
-            if (!(wp[wsize - 1] == UINT64_C(0))) {
-              break;
-            }
-            wsize = wsize - 1;
-          }
+          normalize(wp, &wsize);
           if (usize < 0) {
             wsize = -wsize;
           }
@@ -141,23 +94,13 @@ void wmpz_add(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
           up2 = PTR(u1);
           if (wmpn_cmp(up2, wp, abs_usize) < 0) {
             usb5 = sub_n_rx(wp, up2, abs_usize);
-            while (wsize > 0) {
-              if (!(wp[wsize - 1] == UINT64_C(0))) {
-                break;
-              }
-              wsize = wsize - 1;
-            }
+            normalize(wp, &wsize);
             if (usize >= 0) {
               wsize = -wsize;
             }
           } else {
             usb6 = sub_n_ry(up2, wp, abs_usize);
-            while (wsize > 0) {
-              if (!(wp[wsize - 1] == UINT64_C(0))) {
-                break;
-              }
-              wsize = wsize - 1;
-            }
+            normalize(wp, &wsize);
             if (usize < 0) {
               wsize = -wsize;
             }
@@ -168,23 +111,13 @@ void wmpz_add(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
           vp3 = PTR(v1);
           if (wmpn_cmp(up3, vp3, abs_usize) < 0) {
             usb7 = sub_n(wp, vp3, up3, abs_usize);
-            while (wsize > 0) {
-              if (!(wp[wsize - 1] == UINT64_C(0))) {
-                break;
-              }
-              wsize = wsize - 1;
-            }
+            normalize(wp, &wsize);
             if (usize >= 0) {
               wsize = -wsize;
             }
           } else {
             usb8 = sub_n(wp, up3, vp3, abs_usize);
-            while (wsize > 0) {
-              if (!(wp[wsize - 1] == UINT64_C(0))) {
-                break;
-              }
-              wsize = wsize - 1;
-            }
+            normalize(wp, &wsize);
             if (usize < 0) {
               wsize = -wsize;
             }
@@ -246,7 +179,7 @@ void wmpz_add_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v) {
   if (usize == 0) {
     wp = PTR(w);
     *wp = v;
-    SIZ(w) = !(v == UINT64_C(0)) ? 1 : 0;
+    SIZ(w) = !(v == UINT64_C(0));
     (void)(w);
     return;
   }
@@ -278,7 +211,7 @@ void wmpz_add_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v) {
         wsize = 1;
       } else {
         wmpn_sub_1_in_place(wp1, abs_usize, v);
-        wsize = -(abs_usize - (wp1[abs_usize - 1] == UINT64_C(0) ? 1 : 0));
+        wsize = -(abs_usize - (wp1[abs_usize - 1] == UINT64_C(0)));
       }
     } else {
       up1 = PTR(u);
@@ -287,7 +220,7 @@ void wmpz_add_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v) {
         wsize = 1;
       } else {
         wmpn_sub_1(wp1, up1, abs_usize, v);
-        wsize = -(abs_usize - (wp1[abs_usize - 1] == UINT64_C(0) ? 1 : 0));
+        wsize = -(abs_usize - (wp1[abs_usize - 1] == UINT64_C(0)));
       }
       (void)(u);
     }
@@ -296,4 +229,3 @@ void wmpz_add_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v) {
   (void)(w);
   return;
 }
-
diff --git a/lib/zadd.h b/lib/zadd.h
index 5112f08c4d6736ae154e6dab14b5469461e30770..593014f86c39868f68680ce54736285dce68080e 100644
--- a/lib/zadd.h
+++ b/lib/zadd.h
@@ -1,10 +1,18 @@
 #ifndef ZADD_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "util.h"
+#include "alias.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "add.h"
+#include "sub.h"
+#include "z.h"
+#include "zutil.h"
+#include "add_1.h"
+#include "sub_1.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpz_add(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v);
 
 void wmpz_add_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v);
diff --git a/lib/zcmp.c b/lib/zcmp.c
index e10a1756e82bb9ee265f65bf9cde90096986324c..eb3188393067af38bde566c30b1aa63331123866 100644
--- a/lib/zcmp.c
+++ b/lib/zcmp.c
@@ -1,31 +1,5 @@
-#include <stdlib.h>
+#include "zcmp.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "power.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "compare.h"
-
-#include "alias.h"
-
-#include "compare.h"
-
-#include "uint64gmp.h"
-
-#include "abs.h"
-
-#include "z.h"
-
-#include "zutil.h"
-
-#include "types.h"
 
 int32_t wmpz_cmp(wmpz_ptr u, wmpz_ptr v) {
   int32_t usize, vsize, dsize, asize;
@@ -86,3 +60,38 @@ int32_t wmpz_cmp_ui(wmpz_ptr u, uint64_t v_digit) {
   }
 }
 
+int32_t wmpz_cmp_si(wmpz_ptr u, int64_t v_digit) {
+  int32_t usize, vsize;
+  uint64_t * up;
+  uint64_t ul, vl;
+  usize = SIZ(u);
+  vsize = (v_digit > INT64_C(0)) - (v_digit < INT64_C(0));
+  if (usize == 0 || !(usize == vsize)) {
+    return usize - vsize;
+  } else {
+    up = PTR(u);
+    ul = *up;
+    vl = abs_cast(v_digit);
+    (void)(u);
+    if (ul == vl) {
+      return 0;
+    }
+    if (ul > vl) {
+      return usize;
+    } else {
+      return -usize;
+    }
+  }
+}
+
+int32_t wmpz_sgn(wmpz_ptr u) {
+  if (SIZ(u) < 0) {
+    return -1;
+  } else {
+    if (SIZ(u) > 0) {
+      return 1;
+    } else {
+      return 0;
+    }
+  }
+}
diff --git a/lib/zcmp.h b/lib/zcmp.h
index 5494b6daadc8978054886fc057a669f85f69ce04..8c66c353e0eaa0f084345c75495172225afe237c 100644
--- a/lib/zcmp.h
+++ b/lib/zcmp.h
@@ -1,13 +1,22 @@
 #ifndef ZCMP_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "compare.h"
+#include "alias.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "z.h"
+#include "zutil.h"
+#include "set.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 int32_t wmpz_cmp(wmpz_ptr u, wmpz_ptr v);
 
 int32_t wmpz_cmp_ui(wmpz_ptr u, uint64_t v_digit);
 
+int32_t wmpz_cmp_si(wmpz_ptr u, int64_t v_digit);
+
+int32_t wmpz_sgn(wmpz_ptr u);
+
 #define ZCMP_H_INCLUDED
 #endif // ZCMP_H_INCLUDED
diff --git a/lib/zcmpabs.c b/lib/zcmpabs.c
new file mode 100644
index 0000000000000000000000000000000000000000..3dc6a8ef241b4ff0ca785b634c850b2f3db4586f
--- /dev/null
+++ b/lib/zcmpabs.c
@@ -0,0 +1,56 @@
+#include "zcmpabs.h"
+#include <stdint.h>
+
+int32_t wmpz_cmpabs(wmpz_ptr u, wmpz_ptr v) {
+  int32_t usize, vsize, dsize;
+  uint64_t * up;
+  uint64_t * vp;
+  int32_t cmp;
+  if (SIZ(u) >= 0) {
+    usize = SIZ(u);
+  } else {
+    usize = -SIZ(u);
+  }
+  if (SIZ(v) >= 0) {
+    vsize = SIZ(v);
+  } else {
+    vsize = -SIZ(v);
+  }
+  dsize = usize - vsize;
+  if (!(dsize == 0)) {
+    return dsize;
+  }
+  up = PTR(u);
+  vp = PTR(v);
+  cmp = wmpn_cmp(up, vp, usize);
+  (void)(u);
+  (void)(v);
+  return cmp;
+}
+
+int32_t wmpz_cmpabs_ui(wmpz_ptr u, uint64_t v_digit) {
+  int32_t un;
+  uint64_t * up;
+  uint64_t ul;
+  un = SIZ(u);
+  if (un == 0) {
+    if (!(v_digit == UINT64_C(0))) {
+      return -1;
+    } else {
+      return 0;
+    }
+  }
+  if ((un >= 0 ? un : -un) == 1) {
+    up = PTR(u);
+    ul = *up;
+    (void)(u);
+    if (ul > v_digit) {
+      return 1;
+    }
+    if (ul < v_digit) {
+      return -1;
+    }
+    return 0;
+  }
+  return 1;
+}
diff --git a/lib/zcmpabs.h b/lib/zcmpabs.h
new file mode 100644
index 0000000000000000000000000000000000000000..f0602103172fa3b04d02502949e7339bb74051d5
--- /dev/null
+++ b/lib/zcmpabs.h
@@ -0,0 +1,17 @@
+#ifndef ZCMPABS_H_INCLUDED
+
+#include "c.h"
+#include "compare.h"
+#include "alias.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "z.h"
+#include "zutil.h"
+#include <stdint.h>
+
+int32_t wmpz_cmpabs(wmpz_ptr u, wmpz_ptr v);
+
+int32_t wmpz_cmpabs_ui(wmpz_ptr u, uint64_t v_digit);
+
+#define ZCMPABS_H_INCLUDED
+#endif // ZCMPABS_H_INCLUDED
diff --git a/lib/zdiv.c b/lib/zdiv.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c9e59bd61508b2f41c82957bfb51a2bb65e4cdc
--- /dev/null
+++ b/lib/zdiv.c
@@ -0,0 +1,159 @@
+#include "zdiv.h"
+#include <stdint.h>
+
+void wmpz_tdiv_qr(wmpz_ptr quot, wmpz_ptr rem, wmpz_ptr num, wmpz_ptr den) {
+  int32_t ns, ds, nl;
+  int32_t dl, ql;
+  uint64_t * np;
+  uint64_t * rp;
+  wmpz_ptr dqt, nqt;
+  uint64_t * dp;
+  wmpz_ptr nd;
+  __wmpz_struct t = { 0, 0, NULL };
+  uint64_t * tdp;
+  uint64_t * np1;
+  wmpz_ptr nn;
+  __wmpz_struct t1 = { 0, 0, NULL };
+  uint64_t * tnp;
+  uint64_t * qp;
+  uint64_t * rp1;
+  uint64_t * np2;
+  uint64_t * dp1;
+  uint64_t qh;
+  int32_t qs, rs;
+  ns = SIZ(num);
+  ds = SIZ(den);
+  if (ns >= 0) {
+    nl = ns;
+  } else {
+    nl = -ns;
+  }
+  dl = ds >= 0 ? ds : -ds;
+  ql = nl - dl + 1;
+  if (ql <= 0) {
+    if (!(num == rem)) {
+      np = PTR(num);
+      rp = wmpz_realloc(rem, dl);
+      wmpn_copyd_sep(rp, np, nl);
+      SIZ(rem) = ns;
+      (void)(num);
+      (void)(rem);
+    }
+    SIZ(quot) = 0;
+    return;
+  }
+  dqt = den;
+  nqt = num;
+  if (den == rem || den == quot) {
+    dp = PTR(den);
+    nd = &t;
+    dqt = nd;
+    tdp = alloca((uint32_t)dl * sizeof(uint64_t));
+    ALLOC(dqt) = dl;
+    wmpn_copyd_sep(tdp, dp, dl);
+    PTR(dqt) = tdp;
+    SIZ(dqt) = ds;
+    (void)(dqt);
+    (void)(den);
+  }
+  if (num == rem || num == quot) {
+    np1 = PTR(num);
+    nn = &t1;
+    nqt = nn;
+    tnp = alloca((uint32_t)nl * sizeof(uint64_t));
+    ALLOC(nqt) = nl;
+    wmpn_copyd_sep(tnp, np1, nl);
+    PTR(nqt) = tnp;
+    SIZ(nqt) = ns;
+    (void)(nqt);
+    (void)(num);
+  }
+  qp = wmpz_realloc(quot, ql);
+  rp1 = wmpz_realloc(rem, dl);
+  np2 = PTR(nqt);
+  dp1 = PTR(dqt);
+  wmpn_tdiv_qr(qp, rp1, 0, np2, nl, dp1, dl);
+  qh = qp[ql - 1];
+  ql = ql - (qh == UINT64_C(0));
+  normalize(rp1, &dl);
+  if ((ns ^ ds) >= 0) {
+    qs = ql;
+  } else {
+    qs = -ql;
+  }
+  if (ns >= 0) {
+    rs = dl;
+  } else {
+    rs = -dl;
+  }
+  SIZ(quot) = qs;
+  SIZ(rem) = rs;
+  (void)(rem);
+  (void)(quot);
+  (void)(nqt);
+  (void)(dqt);
+  return;
+}
+
+uint64_t wmpz_tdiv_qr_ui(wmpz_ptr quot, wmpz_ptr rem, wmpz_ptr dividend,
+                         uint64_t divisor) {
+  int32_t ns, nn;
+  uint64_t * qp;
+  int32_t qn;
+  uint64_t rl;
+  uint64_t * np;
+  uint64_t o, o1;
+  uint64_t * np1;
+  int32_t rs;
+  uint64_t * rp;
+  uint64_t qh;
+  int32_t qs;
+  ns = SIZ(dividend);
+  if (ns == 0) {
+    SIZ(quot) = 0;
+    SIZ(rem) = 0;
+    return UINT64_C(0);
+  }
+  if (ns >= 0) {
+    nn = ns;
+  } else {
+    nn = -ns;
+  }
+  qp = wmpz_realloc(quot, nn);
+  qn = nn;
+  rl = UINT64_C(0);
+  if (quot == dividend) {
+    np = alloca((uint32_t)nn * sizeof(uint64_t));
+    wmpn_copyd_sep(np, qp, nn);
+    o = wmpn_divrem_1(qp, np, nn, divisor);
+    rl = o;
+  } else {
+    np1 = PTR(dividend);
+    o1 = wmpn_divrem_1(qp, np1, nn, divisor);
+    rl = o1;
+    (void)(dividend);
+  }
+  if (rl == UINT64_C(0)) {
+    SIZ(rem) = 0;
+  } else {
+    if (ns >= 0) {
+      rs = 1;
+    } else {
+      rs = -1;
+    }
+    rp = PTR(rem);
+    *rp = rl;
+    SIZ(rem) = rs;
+    (void)(rem);
+  }
+  qh = qp[nn - 1];
+  qn = qn - (qh == UINT64_C(0));
+  if (ns >= 0) {
+    qs = qn;
+  } else {
+    qs = -qn;
+  }
+  SIZ(quot) = qs;
+  (void)(quot);
+  return rl;
+}
diff --git a/lib/zdiv.h b/lib/zdiv.h
new file mode 100644
index 0000000000000000000000000000000000000000..ccd8d89259a2c20ac677e28e4c3e33eac4a023b4
--- /dev/null
+++ b/lib/zdiv.h
@@ -0,0 +1,20 @@
+#ifndef ZDIV_H_INCLUDED
+
+#include "c.h"
+#include "util.h"
+#include "utilold.h"
+#include "alias.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "div.h"
+#include "z.h"
+#include "zutil.h"
+#include <stdint.h>
+
+void wmpz_tdiv_qr(wmpz_ptr quot, wmpz_ptr rem, wmpz_ptr num, wmpz_ptr den);
+
+uint64_t wmpz_tdiv_qr_ui(wmpz_ptr quot, wmpz_ptr rem, wmpz_ptr dividend,
+                         uint64_t divisor);
+
+#define ZDIV_H_INCLUDED
+#endif // ZDIV_H_INCLUDED
diff --git a/lib/zdiv2exp.c b/lib/zdiv2exp.c
index 9efd564aa89abae17bc2060f2ae4679a7d01af6a..3438486d31c25738259a99b4fd4b720d551f2ef5 100644
--- a/lib/zdiv2exp.c
+++ b/lib/zdiv2exp.c
@@ -1,41 +1,5 @@
-#include <stdlib.h>
+#include "zdiv2exp.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "computerdivision.h"
-
-#include "power.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "util.h"
-
-#include "utilold.h"
-
-#include "alias.h"
-
-#include "compare.h"
-
-#include "uint64gmp.h"
-
-#include "types.h"
-
-#include "logicalutil.h"
-
-#include "logical.h"
-
-#include "logicalold.h"
-
-#include "abs.h"
-
-#include "z.h"
-
-#include "zutil.h"
 
 void wmpz_tdiv_q_2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt) {
   int32_t un, limb_cnt;
@@ -58,7 +22,7 @@ void wmpz_tdiv_q_2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt) {
       up = rp + limb_cnt;
       if (!(c == UINT64_C(0))) {
         wmpn_rshift(rp, up, rn, c);
-        rn = rn - (rp[rn - 1] == UINT64_C(0) ? 1 : 0);
+        rn = rn - (rp[rn - 1] == UINT64_C(0));
       } else {
         wmpn_copyi(rp, up, rn);
       }
@@ -67,7 +31,7 @@ void wmpz_tdiv_q_2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt) {
       up1 = up0 + limb_cnt;
       if (!(c == UINT64_C(0))) {
         wmpn_rshift1(rp, up1, rn, c);
-        rn = rn - (rp[rn - 1] == UINT64_C(0) ? 1 : 0);
+        rn = rn - (rp[rn - 1] == UINT64_C(0));
       } else {
         wmpn_copyi1(rp, up1, rn);
       }
@@ -78,4 +42,3 @@ void wmpz_tdiv_q_2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt) {
     return;
   }
 }
-
diff --git a/lib/zdiv2exp.h b/lib/zdiv2exp.h
index e349b61a4cb1e5510469d440d75cfb4c54717378..e18a678c316a944e2909bb654e34d5d55e40129f 100644
--- a/lib/zdiv2exp.h
+++ b/lib/zdiv2exp.h
@@ -1,10 +1,18 @@
 #ifndef ZDIV2EXP_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "util.h"
+#include "utilold.h"
+#include "alias.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "logicalutil.h"
+#include "logical.h"
+#include "logicalold.h"
+#include "z.h"
+#include "zutil.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpz_tdiv_q_2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt);
 
 #define ZDIV2EXP_H_INCLUDED
diff --git a/lib/zget_str.c b/lib/zget_str.c
new file mode 100644
index 0000000000000000000000000000000000000000..5c842c61d8b9cc4ec7df209e1e4db3c647b1ddb7
--- /dev/null
+++ b/lib/zget_str.c
@@ -0,0 +1,81 @@
+#include "zget_str.h"
+#include <stdint.h>
+#include <string.h>
+
+char * wmpz_get_str(char * sp, int32_t base, wmpz_ptr u) {
+  char * digits;
+  int32_t base1, i, sn;
+  int32_t un;
+  uint32_t bits;
+  uint64_t * up;
+  unsigned char * usp;
+  unsigned char * uspi;
+  uint32_t g;
+  struct wmpn_base_info info;
+  uint64_t * tp;
+  uint32_t g1;
+  int32_t j, o;
+  unsigned char cj;
+  char dc;
+  if (base > 36) {
+    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+  } else {
+    if (base >= 0) {
+      digits = "0123456789abcdefghijklmnopqrstuvwxyz";
+    } else {
+      digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+    }
+  }
+  base1 = base;
+  if (base1 <= 0) {
+    base1 = -base1;
+  }
+  if (base1 <= 1) {
+    base1 = 10;
+  }
+  if (SIZ(u) >= 0) {
+    un = SIZ(u);
+  } else {
+    un = -SIZ(u);
+  }
+  if (un == 0) {
+    sp[0] = '0';
+    sp[1] = '\0';
+    return sp;
+  }
+  i = 0;
+  sn = 0;
+  if (SIZ(u) < 0) {
+    sp[0] = '-';
+    i = i + 1;
+  }
+  bits = wmpn_base_power_of_two_p((uint64_t)base1);
+  up = PTR(u);
+  usp = (unsigned char *)sp;
+  uspi = usp + i;
+  if (!(bits == 0U)) {
+    g = wmpn_get_str_bits(uspi, bits, up, un);
+    sn = i + (int32_t)g;
+  } else {
+    info = wmpn_get_base_info((uint64_t)base1);
+    tp = alloca((uint32_t)un * sizeof(uint64_t));
+    wmpn_copyd_sep(tp, up, un);
+    g1 = wmpn_get_str_other(uspi, base1, info, tp, un);
+    sn = i + (int32_t)g1;
+  }
+  IGNORE2(sp, usp);
+  o = sn - 1;
+  if (i <= o) {
+    for (j = i; ; ++j) {
+      cj = (unsigned char)sp[j];
+      dc = digits[(int32_t)cj];
+      sp[j] = dc;
+      if (j == o) {
+        break;
+      }
+    }
+  }
+  sp[sn] = '\0';
+  (void)(u);
+  return sp;
+}
diff --git a/lib/zget_str.h b/lib/zget_str.h
new file mode 100644
index 0000000000000000000000000000000000000000..4552678e945619537aa0dbecf8c02fca68435e29
--- /dev/null
+++ b/lib/zget_str.h
@@ -0,0 +1,16 @@
+#ifndef ZGET_STR_H_INCLUDED
+
+#include "c.h"
+#include "uint64gmp.h"
+#include "util.h"
+#include "z.h"
+#include "zutil.h"
+#include "baseinfo.h"
+#include "get_str.h"
+#include <stdint.h>
+#include <string.h>
+
+char * wmpz_get_str(char * sp, int32_t base, wmpz_ptr u);
+
+#define ZGET_STR_H_INCLUDED
+#endif // ZGET_STR_H_INCLUDED
diff --git a/lib/zmul.c b/lib/zmul.c
index 222159a31c14d5bc44643d33044782853414a41e..b249e44680637dfaec1941bf33e95e25ae459ef0 100644
--- a/lib/zmul.c
+++ b/lib/zmul.c
@@ -1,45 +1,5 @@
-#include <stdlib.h>
+#include "zmul.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "power.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "util.h"
-
-#include "utilold.h"
-
-#include "alias.h"
-
-#include "compare.h"
-
-#include "uint64gmp.h"
-
-#include "add.h"
-
-#include "sub.h"
-
-#include "mul.h"
-
-#include "toom.h"
-
-#include "abs.h"
-
-#include "z.h"
-
-#include "zutil.h"
-
-#include "int64.h"
-
-#include "set.h"
-
-#include "bool.h"
 
 void wmpz_mul(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
   wmpz_ptr u1, v1;
@@ -56,14 +16,17 @@ void wmpz_mul(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
   int freew;
   int32_t wsize1;
   wmpz_ptr uqt, vqt, wqt;
-  wmpz_ptr o;
+  wmpz_ptr nw;
+  __wmpz_struct t = { 0, 0, NULL };
   uint64_t * wpqt;
   uint64_t * wp1;
   uint64_t * up1;
-  wmpz_ptr o1;
+  wmpz_ptr nu;
+  __wmpz_struct t1 = { 0, 0, NULL };
   uint64_t * wp2;
   uint64_t * vp1;
-  wmpz_ptr o2;
+  wmpz_ptr nv;
+  __wmpz_struct t2 = { 0, 0, NULL };
   uint64_t * upqt;
   uint64_t * vpqt;
   uint64_t * wpqt1;
@@ -104,7 +67,7 @@ void wmpz_mul(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
       cy = cy1;
     }
     wp[usize] = cy;
-    usize = usize + (!(cy == UINT64_C(0)) ? 1 : 0);
+    usize = usize + !(cy == UINT64_C(0));
     if (sign_product >= 0) {
       wsize = usize;
     } else {
@@ -121,16 +84,17 @@ void wmpz_mul(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
   wqt = w;
   if (ALLOC(w) < wsize1) {
     freew = 1;
-    o = __wmpz_init();
-    wqt = o;
+    nw = &t;
+    __wmpz_init(nw);
+    wqt = nw;
     wpqt = wmpz_realloc(wqt, wsize1);
     (void)(wqt);
   } else {
     if (uw) {
       wp1 = PTR(w);
       up1 = alloca((uint32_t)usize * sizeof(uint64_t));
-      o1 = __wmpz_init();
-      uqt = o1;
+      nu = &t1;
+      uqt = nu;
       ALLOC(uqt) = usize;
       wmpn_copyi1(up1, wp1, usize);
       PTR(uqt) = up1;
@@ -144,8 +108,8 @@ void wmpz_mul(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
       if (vw) {
         wp2 = PTR(w);
         vp1 = alloca((uint32_t)vsize * sizeof(uint64_t));
-        o2 = __wmpz_init();
-        vqt = o2;
+        nv = &t2;
+        vqt = nv;
         ALLOC(vqt) = vsize;
         wmpn_copyi1(vp1, wp2, vsize);
         PTR(vqt) = vp1;
@@ -164,8 +128,9 @@ void wmpz_mul(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
   if (freew) {
     wp3 = PTR(w);
     free(wp3);
+    ALLOC(w) = wsize1;
   }
-  wsize1 = wsize1 - (cy2 == UINT64_C(0) ? 1 : 0);
+  wsize1 = wsize1 - (cy2 == UINT64_C(0));
   wsize1 = sign_product < 0 ? -wsize1 : wsize1;
   PTR(w) = wpqt1;
   SIZ(w) = wsize1;
@@ -197,7 +162,7 @@ void wmpz_mul_si(wmpz_ptr prod, wmpz_ptr mult, int64_t small_mult) {
     cy = cy1;
   }
   pp[size] = cy;
-  size = size + (!(cy == UINT64_C(0)) ? 1 : 0);
+  size = size + !(cy == UINT64_C(0));
   size = (sign_product < 0) ^ (small_mult < INT64_C(0)) ? -size : size;
   SIZ(prod) = size;
   (void)(prod);
@@ -226,10 +191,9 @@ void wmpz_mul_ui(wmpz_ptr prod, wmpz_ptr mult, uint64_t small_mult) {
     cy = cy1;
   }
   pp[size] = cy;
-  size = size + (!(cy == UINT64_C(0)) ? 1 : 0);
+  size = size + !(cy == UINT64_C(0));
   size = sign_product < 0 ? -size : size;
   SIZ(prod) = size;
   (void)(prod);
   return;
 }
-
diff --git a/lib/zmul.h b/lib/zmul.h
index 157be4efbb8425bd7fd31225530c84b36636eb52..283988d4b00424bc835400520786e50f62fe2899 100644
--- a/lib/zmul.h
+++ b/lib/zmul.h
@@ -1,10 +1,20 @@
 #ifndef ZMUL_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "util.h"
+#include "utilold.h"
+#include "alias.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "add.h"
+#include "sub.h"
+#include "mul.h"
+#include "toom.h"
+#include "z.h"
+#include "zutil.h"
+#include "set.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpz_mul(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v);
 
 void wmpz_mul_si(wmpz_ptr prod, wmpz_ptr mult, int64_t small_mult);
diff --git a/lib/zmul2exp.c b/lib/zmul2exp.c
index 3fbf6fbdd9e3a5d3b053063b903375c674b04b9a..bd7a9a59f2090849c46a454331f1c494ad92cd1e 100644
--- a/lib/zmul2exp.c
+++ b/lib/zmul2exp.c
@@ -1,41 +1,5 @@
-#include <stdlib.h>
+#include "zmul2exp.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "euclideandivision.h"
-
-#include "power.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "util.h"
-
-#include "utilold.h"
-
-#include "alias.h"
-
-#include "compare.h"
-
-#include "uint64gmp.h"
-
-#include "types.h"
-
-#include "logicalutil.h"
-
-#include "logical.h"
-
-#include "logicalold.h"
-
-#include "abs.h"
-
-#include "z.h"
-
-#include "zutil.h"
 
 void wmpz_mul2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt) {
   int32_t un, limb_cnt;
@@ -47,8 +11,6 @@ void wmpz_mul2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt) {
   uint64_t * rl1;
   uint64_t rlimb1;
   uint64_t * rl2;
-  int32_t i;
-  uint64_t lzero;
   if (SIZ(u) >= 0) {
     un = SIZ(u);
   } else {
@@ -67,7 +29,7 @@ void wmpz_mul2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt) {
         rl = rp + limb_cnt;
         rlimb = wmpn_lshift(rl, rp, un, c);
         rp[rn] = rlimb;
-        rn = rn + (!(rlimb == UINT64_C(0)) ? 1 : 0);
+        rn = rn + !(rlimb == UINT64_C(0));
       } else {
         wmpn_copyd(rp + limb_cnt, rp, un);
       }
@@ -77,22 +39,16 @@ void wmpz_mul2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt) {
         rl1 = rp + limb_cnt;
         rlimb1 = wmpn_lshift1(rl1, up, un, c);
         rp[rn] = rlimb1;
-        rn = rn + (!(rlimb1 == UINT64_C(0)) ? 1 : 0);
+        rn = rn + !(rlimb1 == UINT64_C(0));
       } else {
         rl2 = rp + limb_cnt;
         wmpn_copyi1(rl2, up, un);
       }
       (void)(u);
     }
-    i = 0;
-    lzero = UINT64_C(0);
-    while (i < limb_cnt) {
-      rp[i] = lzero;
-      i = i + 1;
-    }
+    wmpn_zero(rp, limb_cnt);
     SIZ(r) = SIZ(u) >= 0 ? rn : -rn;
     (void)(r);
     return;
   }
 }
-
diff --git a/lib/zmul2exp.h b/lib/zmul2exp.h
index dc1cf73481aeb39ac5c4591769f92889efaf5f45..37d42fb927ad84fdc952f9c57cef2310c7387fcd 100644
--- a/lib/zmul2exp.h
+++ b/lib/zmul2exp.h
@@ -1,10 +1,18 @@
 #ifndef ZMUL2EXP_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "util.h"
+#include "utilold.h"
+#include "alias.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "logicalutil.h"
+#include "logical.h"
+#include "logicalold.h"
+#include "z.h"
+#include "zutil.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpz_mul2exp(wmpz_ptr r, wmpz_ptr u, uint64_t cnt);
 
 #define ZMUL2EXP_H_INCLUDED
diff --git a/lib/zset_str.c b/lib/zset_str.c
new file mode 100644
index 0000000000000000000000000000000000000000..7a73b77e41dc37ae3880c927a35882dcbf3616fe
--- /dev/null
+++ b/lib/zset_str.c
@@ -0,0 +1,101 @@
+#include "zset_str.h"
+#include <stdint.h>
+#include <string.h>
+
+int32_t wmpz_set_str(wmpz_ptr r, char * sp, int32_t base) {
+  int32_t sign;
+  char * spi;
+  unsigned char * dp;
+  unsigned char digit;
+  int32_t dn;
+  char c;
+  uint32_t bits;
+  int32_t alloc, rn, rn1;
+  uint64_t * rp;
+  struct wmpn_base_info info;
+  int32_t alloc1, rn2, rn3, rn4;
+  uint64_t * rp1;
+  if (*sp == '-') {
+    sign = 1;
+  } else {
+    sign = 0;
+  }
+  spi = sp + sign;
+  if (*spi == '\0') {
+    SIZ(r) = 0;
+    return -1;
+  }
+  dp = alloca(strlen(sp) * sizeof(unsigned char));
+  digit = 0;
+  dn = 0;
+  while (!(*spi == '\0')) {
+    c = *spi;
+    if (36 < base) {
+      if ('0' <= c && c <= '9') {
+        digit = (unsigned char)(c - '0');
+      } else {
+        if ('a' <= c && c <= 'z') {
+          digit = (unsigned char)(c - 'a' + 36);
+        } else {
+          if ('A' <= c && c <= 'Z') {
+            digit = (unsigned char)(c - 'A' + 10);
+          } else {
+            digit = (unsigned char)base;
+          }
+        }
+      }
+    } else {
+      if ('0' <= c && c <= '9') {
+        digit = (unsigned char)(c - '0');
+      } else {
+        if ('a' <= c && c <= 'z') {
+          digit = (unsigned char)(c - 'a' + 10);
+        } else {
+          if ('A' <= c && c <= 'Z') {
+            digit = (unsigned char)(c - 'A' + 10);
+          } else {
+            digit = (unsigned char)base;
+          }
+        }
+      }
+    }
+    if (digit >= (unsigned char)base) {
+      SIZ(r) = 0;
+      return -1;
+    }
+    dp[dn] = digit;
+    dn = dn + 1;
+    spi = spi + 1;
+  }
+  if (dn == 0) {
+    SIZ(r) = 0;
+    return -1;
+  }
+  bits = wmpn_base_power_of_two_p((uint64_t)base);
+  if (bits > 0U) {
+    alloc = (dn * (int32_t)bits + 63) / 64;
+    rp = wmpz_realloc(r, alloc);
+    rn = wmpn_set_str_bits(rp, dp, (uint32_t)dn, bits);
+    if (!(sign == 0)) {
+      rn1 = -rn;
+    } else {
+      rn1 = rn;
+    }
+    SIZ(r) = rn1;
+    (void)(r);
+  } else {
+    info = wmpn_get_base_info((uint64_t)base);
+    alloc1 = (dn + (int32_t)info.exp - 1) / (int32_t)info.exp;
+    rp1 = wmpz_realloc(r, alloc1);
+    rn2 = wmpn_set_str_other(rp1, dp, (uint32_t)dn, (uint64_t)base, info);
+    rn3 = rn2 - (rp1[rn2 - 1] == UINT64_C(0));
+    if (!(sign == 0)) {
+      rn4 = -rn3;
+    } else {
+      rn4 = rn3;
+    }
+    SIZ(r) = rn4;
+    (void)(r);
+  }
+  return 0;
+}
diff --git a/lib/zset_str.h b/lib/zset_str.h
new file mode 100644
index 0000000000000000000000000000000000000000..a535160743bf36fa04292e7ad2e3858164140dcf
--- /dev/null
+++ b/lib/zset_str.h
@@ -0,0 +1,16 @@
+#ifndef ZSET_STR_H_INCLUDED
+
+#include "c.h"
+#include "uint64gmp.h"
+#include "util.h"
+#include "z.h"
+#include "zutil.h"
+#include "baseinfo.h"
+#include "set_str.h"
+#include <stdint.h>
+#include <string.h>
+
+int32_t wmpz_set_str(wmpz_ptr r, char * sp, int32_t base);
+
+#define ZSET_STR_H_INCLUDED
+#endif // ZSET_STR_H_INCLUDED
diff --git a/lib/zsub.c b/lib/zsub.c
index dab99a88f02de79b04d5719871dd14e47b05d119..dc3e96e779e6c50d528ea76226af9162dc3bae80 100644
--- a/lib/zsub.c
+++ b/lib/zsub.c
@@ -1,37 +1,5 @@
-#include <stdlib.h>
+#include "zsub.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
-
-#include "power.h"
-
-#include "map.h"
-
-#include "c.h"
-
-#include "util.h"
-
-#include "alias.h"
-
-#include "compare.h"
-
-#include "uint64gmp.h"
-
-#include "add.h"
-
-#include "sub.h"
-
-#include "abs.h"
-
-#include "z.h"
-
-#include "zutil.h"
-
-#include "add_1.h"
-
-#include "sub_1.h"
 
 void wmpz_sub(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
   wmpz_ptr u1, v1;
@@ -103,12 +71,7 @@ void wmpz_sub(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
         }
       }
       wsize = abs_usize;
-      while (wsize > 0) {
-        if (!(wp[wsize - 1] == UINT64_C(0))) {
-          break;
-        }
-        wsize = wsize - 1;
-      }
+      normalize(wp, &wsize);
       if (usize < 0) {
         wsize = -wsize;
       }
@@ -118,23 +81,13 @@ void wmpz_sub(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
         vp2 = PTR(v1);
         if (wmpn_cmp(wp, vp2, abs_usize) < 0) {
           usb3 = sub_n_ry(vp2, wp, abs_usize);
-          while (wsize > 0) {
-            if (!(wp[wsize - 1] == UINT64_C(0))) {
-              break;
-            }
-            wsize = wsize - 1;
-          }
+          normalize(wp, &wsize);
           if (usize >= 0) {
             wsize = -wsize;
           }
         } else {
           usb4 = sub_n_rx(wp, vp2, abs_usize);
-          while (wsize > 0) {
-            if (!(wp[wsize - 1] == UINT64_C(0))) {
-              break;
-            }
-            wsize = wsize - 1;
-          }
+          normalize(wp, &wsize);
           if (usize < 0) {
             wsize = -wsize;
           }
@@ -145,23 +98,13 @@ void wmpz_sub(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
           up2 = PTR(u1);
           if (wmpn_cmp(up2, wp, abs_usize) < 0) {
             usb5 = sub_n_rx(wp, up2, abs_usize);
-            while (wsize > 0) {
-              if (!(wp[wsize - 1] == UINT64_C(0))) {
-                break;
-              }
-              wsize = wsize - 1;
-            }
+            normalize(wp, &wsize);
             if (usize >= 0) {
               wsize = -wsize;
             }
           } else {
             usb6 = sub_n_ry(up2, wp, abs_usize);
-            while (wsize > 0) {
-              if (!(wp[wsize - 1] == UINT64_C(0))) {
-                break;
-              }
-              wsize = wsize - 1;
-            }
+            normalize(wp, &wsize);
             if (usize < 0) {
               wsize = -wsize;
             }
@@ -172,23 +115,13 @@ void wmpz_sub(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v) {
           vp3 = PTR(v1);
           if (wmpn_cmp(up3, vp3, abs_usize) < 0) {
             usb7 = sub_n(wp, vp3, up3, abs_usize);
-            while (wsize > 0) {
-              if (!(wp[wsize - 1] == UINT64_C(0))) {
-                break;
-              }
-              wsize = wsize - 1;
-            }
+            normalize(wp, &wsize);
             if (usize >= 0) {
               wsize = -wsize;
             }
           } else {
             usb8 = sub_n(wp, up3, vp3, abs_usize);
-            while (wsize > 0) {
-              if (!(wp[wsize - 1] == UINT64_C(0))) {
-                break;
-              }
-              wsize = wsize - 1;
-            }
+            normalize(wp, &wsize);
             if (usize < 0) {
               wsize = -wsize;
             }
@@ -245,7 +178,7 @@ void wmpz_sub_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v) {
   if (usize == 0) {
     wp = PTR(w);
     *wp = v;
-    SIZ(w) = -(!(v == UINT64_C(0)) ? 1 : 0);
+    SIZ(w) = -(!(v == UINT64_C(0)));
     (void)(w);
     return;
   }
@@ -277,7 +210,7 @@ void wmpz_sub_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v) {
         wsize = -1;
       } else {
         wmpn_sub_1_in_place(wp1, abs_usize, v);
-        wsize = abs_usize - (wp1[abs_usize - 1] == UINT64_C(0) ? 1 : 0);
+        wsize = abs_usize - (wp1[abs_usize - 1] == UINT64_C(0));
       }
     } else {
       up1 = PTR(u);
@@ -286,7 +219,7 @@ void wmpz_sub_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v) {
         wsize = -1;
       } else {
         wmpn_sub_1(wp1, up1, abs_usize, v);
-        wsize = abs_usize - (wp1[abs_usize - 1] == UINT64_C(0) ? 1 : 0);
+        wsize = abs_usize - (wp1[abs_usize - 1] == UINT64_C(0));
       }
       (void)(u);
     }
@@ -319,7 +252,7 @@ void wmpz_ui_sub(wmpz_ptr w, uint64_t uval, wmpz_ptr v) {
       wmpn_sub_1(wp, vp, vsize, uval);
       (void)(v);
     }
-    wsize = -(vsize - (wp[vsize - 1] == UINT64_C(0) ? 1 : 0));
+    wsize = -(vsize - (wp[vsize - 1] == UINT64_C(0)));
     SIZ(w) = wsize;
     (void)(w);
     return;
@@ -329,7 +262,7 @@ void wmpz_ui_sub(wmpz_ptr w, uint64_t uval, wmpz_ptr v) {
       if (vw) {
         if (uval >= *wp1) {
           *wp1 = uval - *wp1;
-          wsize = !(*wp1 == UINT64_C(0)) ? 1 : 0;
+          wsize = !(*wp1 == UINT64_C(0));
         } else {
           *wp1 = *wp1 - uval;
           wsize = -1;
@@ -338,7 +271,7 @@ void wmpz_ui_sub(wmpz_ptr w, uint64_t uval, wmpz_ptr v) {
         vp1 = PTR(v);
         if (uval >= *vp1) {
           *wp1 = uval - *vp1;
-          wsize = !(*wp1 == UINT64_C(0)) ? 1 : 0;
+          wsize = !(*wp1 == UINT64_C(0));
         } else {
           *wp1 = *vp1 - uval;
           wsize = -1;
@@ -352,7 +285,7 @@ void wmpz_ui_sub(wmpz_ptr w, uint64_t uval, wmpz_ptr v) {
       if (vsize == 0) {
         wp2 = PTR(w);
         *wp2 = uval;
-        wsize = !(uval == UINT64_C(0)) ? 1 : 0;
+        wsize = !(uval == UINT64_C(0));
         SIZ(w) = wsize;
         (void)(w);
         return;
@@ -362,12 +295,12 @@ void wmpz_ui_sub(wmpz_ptr w, uint64_t uval, wmpz_ptr v) {
         if (vw) {
           cy = wmpn_add_1_in_place(wp3, vsize, uval);
           wp3[vsize] = cy;
-          wsize = vsize + (!(cy == UINT64_C(0)) ? 1 : 0);
+          wsize = vsize + !(cy == UINT64_C(0));
         } else {
           vp2 = PTR(v);
           cy1 = wmpn_add_1(wp3, vp2, vsize, uval);
           wp3[vsize] = cy1;
-          wsize = vsize + (!(cy1 == UINT64_C(0)) ? 1 : 0);
+          wsize = vsize + !(cy1 == UINT64_C(0));
           (void)(v);
         }
         SIZ(w) = wsize;
@@ -377,4 +310,3 @@ void wmpz_ui_sub(wmpz_ptr w, uint64_t uval, wmpz_ptr v) {
     }
   }
 }
-
diff --git a/lib/zsub.h b/lib/zsub.h
index 27e415c0673585fb7b0bd86b002b8c3e840d3830..b58f71cc11d61797042a6dca708db0771527e37d 100644
--- a/lib/zsub.h
+++ b/lib/zsub.h
@@ -1,10 +1,18 @@
 #ifndef ZSUB_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "util.h"
+#include "alias.h"
+#include "compare.h"
+#include "uint64gmp.h"
+#include "add.h"
+#include "sub.h"
+#include "z.h"
+#include "zutil.h"
+#include "add_1.h"
+#include "sub_1.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
+
 void wmpz_sub(wmpz_ptr w, wmpz_ptr u, wmpz_ptr v);
 
 void wmpz_sub_ui(wmpz_ptr w, wmpz_ptr u, uint64_t v);
diff --git a/lib/zutil.c b/lib/zutil.c
index 18118c91f526a5bae97235fadfa14b763304be5f..ea3afebb539c4c906d49af2bc5999e88ea48714a 100644
--- a/lib/zutil.c
+++ b/lib/zutil.c
@@ -1,39 +1,17 @@
-#include <stdlib.h>
+#include "zutil.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
-#include "int.h"
 
-#include "abs.h"
-
-#include "int32.h"
-
-#include "c.h"
-
-#include "map.h"
-
-#include "types.h"
-
-#include "uint64gmp.h"
-
-#include "power.h"
-
-#include "z.h"
-
-
-wmpz_ptr __wmpz_init () {
-wmpz_ptr x = malloc(sizeof(__wmpz_struct));
-ALLOC(x) = 1;
-SIZ(x) = 0;
-PTR(x) = malloc(sizeof(uint64_t));
-PTR(x)[0] = 0;
-return x;
+void __wmpz_init (wmpz_ptr x) {
+  ALLOC(x) = 1;
+  SIZ(x) = 0;
+  PTR(x) = malloc(sizeof(uint64_t));
+  PTR(x)[0] = 0;
+  return;
 }
 
 void wmpz_clear (wmpz_ptr x)
 {
-free (PTR(x));
+  free (PTR(x));
 }
 
 uint64_t * wmpz_do_realloc(wmpz_ptr x, int32_t sz) {
@@ -54,11 +32,3 @@ uint64_t * wmpz_realloc(wmpz_ptr x, int32_t sz) {
     return PTR(x);
   }
 }
-
-void mpz_ptr_swap(wmpz_ptr * x, wmpz_ptr * y) {
-  wmpz_ptr z;
-  z = *x;
-  *x = *y;
-  *y = z;
-}
-
diff --git a/lib/zutil.h b/lib/zutil.h
index 41152a93884787cebc88939e860e2a8cbdb7a4cd..031604280456db5c9b257b8f07b132bab1b89f66 100644
--- a/lib/zutil.h
+++ b/lib/zutil.h
@@ -1,19 +1,16 @@
 #ifndef ZUTIL_H_INCLUDED
 
-#include <stdlib.h>
+#include "c.h"
+#include "uint64gmp.h"
+#include "z.h"
 #include <stdint.h>
-#include <stdio.h>
-#include <assert.h>
-#include <alloca.h>
 
-wmpz_ptr __wmpz_init ();
-void wmpz_clear (wmpz_ptr x);
+void __wmpz_init (wmpz_ptr);
+void wmpz_clear (wmpz_ptr);
 
 uint64_t * wmpz_do_realloc(wmpz_ptr x, int32_t sz);
 
 uint64_t * wmpz_realloc(wmpz_ptr x, int32_t sz);
 
-void mpz_ptr_swap(wmpz_ptr * x, wmpz_ptr * y);
-
 #define ZUTIL_H_INCLUDED
 #endif // ZUTIL_H_INCLUDED
diff --git a/why3 b/why3
index 430a6a362838ae773b2cad1adcdf704278fcbe7e..226ba5b0f0777654d637b1b88006ab54c46a31a2 160000
--- a/why3
+++ b/why3
@@ -1 +1 @@
-Subproject commit 430a6a362838ae773b2cad1adcdf704278fcbe7e
+Subproject commit 226ba5b0f0777654d637b1b88006ab54c46a31a2
diff --git a/wmp-gmp.h b/wmp-gmp.h
index d41c87a64f2d92a5da9dac87b77f742f922e19bd..8c38efa76d83379727aa8de201fe2c9fce2f16c2 100644
--- a/wmp-gmp.h
+++ b/wmp-gmp.h
@@ -1,7 +1,7 @@
 #ifndef __WMP_H__
 
 #include <gmp.h>
-#include <wmp.h>
+#include "wmp.h"
 
 #undef mpn_add
 #undef mpn_add_1
@@ -11,12 +11,14 @@
 #undef mpn_copyd
 #undef mpn_copyi
 #undef mpn_divrem_1
+#undef mpn_get_str
 #undef mpn_lshift
 #undef mpn_mul
 #undef mpn_mul_1
 #undef mpn_mul_n
 #undef mpn_powm
 #undef mpn_rshift
+#undef mpn_set_str
 #undef mpn_sqrtrem
 #undef mpn_sub
 #undef mpn_sub_1
@@ -26,11 +28,16 @@
 #undef mpn_zero
 #undef mpn_zero_p
 
+#undef mpz_abs
 #undef mpz_add
 #undef mpz_add_ui
 #undef mpz_clear
 #undef mpz_cmp
+#undef mpz_cmp_si
 #undef mpz_cmp_ui
+#undef mpz_cmpabs
+#undef mpz_cmpabs_ui
+#undef mpz_get_str
 #undef mpz_get_ui
 #undef mpz_init
 #undef mpz_mul
@@ -39,10 +46,14 @@
 #undef mpz_mul_ui
 #undef mpz_realloc
 #undef mpz_set_si
+#undef mpz_set_str
 #undef mpz_set_ui
+#undef mpz_sgn
 #undef mpz_sub
 #undef mpz_sub_ui
 #undef mpz_tdiv_q_2exp
+#undef mpz_tdiv_qr
+#undef mpz_tdiv_qr_ui
 #undef mpz_ui_sub
 
 #define mpn_add wmpn_add
@@ -53,12 +64,14 @@
 #define mpn_copyd wmpn_copyd
 #define mpn_copyi wmpn_copyi
 #define mpn_divrem_1 wmpn_divrem_1
+#define mpn_get_str wmpn_get_str
 #define mpn_lshift wmpn_lshift
 #define mpn_mul wmpn_mul
 #define mpn_mul_1 wmpn_mul_1
 #define mpn_mul_n wmpn_mul_n
 #define mpn_powm wmpn_powm
 #define mpn_rshift wmpn_rshift
+#define mpn_set_str wmpn_set_str
 #define mpn_sqrtrem wmpn_sqrtrem
 #define mpn_sub wmpn_sub
 #define mpn_sub_1 wmpn_sub_1
@@ -68,11 +81,16 @@
 #define mpn_zero wmpn_zero
 #define mpn_zero_p wmpn_zero_p
 
+#define mpz_abs wmpz_abs
 #define mpz_add wmpz_add
 #define mpz_add_ui wmpz_add_ui
 #define mpz_clear wmpz_clear
 #define mpz_cmp wmpz_cmp
+#define mpz_cmp_si wmpz_cmp_si
 #define mpz_cmp_ui wmpz_cmp_ui
+#define mpz_cmpabs wmpz_cmpabs
+#define mpz_cmpabs_ui wmpz_cmpabs_ui
+#define mpz_get_str wmpz_get_str
 #define mpz_get_ui wmpz_get_ui
 #define mpz_init wmpz_init
 #define mpz_mul wmpz_mul
@@ -81,10 +99,14 @@
 #define mpz_mul_ui wmpz_mul_ui
 #define mpz_realloc wmpz_realloc
 #define mpz_set_si wmpz_set_si
+#define mpz_set_str wmpz_set_str
 #define mpz_set_ui wmpz_set_ui
+#define mpz_sgn wmpz_sgn
 #define mpz_sub wmpz_sub
 #define mpz_sub_ui wmpz_sub_ui
 #define mpz_tdiv_q_2exp wmpz_tdiv_q_2exp
+#define mpz_tdiv_qr wmpz_tdiv_qr
+#define mpz_tdiv_qr_ui wmpz_tdiv_qr_ui
 #define mpz_ui_sub wmpz_ui_sub
 
 #endif
diff --git a/wmp.h b/wmp.h
index 4c7612d966526c68761f965003c2f82c748721af..c791a7f900e24024c074add7501dda71c9497251 100644
--- a/wmp.h
+++ b/wmp.h
@@ -1,6 +1,7 @@
 #ifndef __WMP_H__
 #define __WMP_H__
 
+#include <stdlib.h>
 #include <stdint.h>
 
 typedef int32_t wmp_size_t;
@@ -39,13 +40,21 @@ void wmpz_set_ui (wmpz_ptr, uint64_t);
 void wmpz_set_si (wmpz_ptr, int64_t);
 uint64_t wmpz_get_ui (wmpz_srcptr);
 
-int32_t wmpz_cmp (wmpz_srcptr, wmpz_ptr);
+int32_t wmpz_cmp (wmpz_srcptr, wmpz_srcptr);
 int32_t wmpz_cmp_ui (wmpz_srcptr, uint64_t);
+int32_t wmpz_cmp_si(wmpz_srcptr, int64_t);
 
-void wmpz_add (wmpz_ptr, wmpz_srcptr, wmpz_ptr);
+int32_t wmpz_cmpabs(wmpz_srcptr, wmpz_srcptr);
+int32_t wmpz_cmpabs_ui(wmpz_srcptr, uint64_t);
+
+int32_t wmpz_sgn(wmpz_srcptr);
+
+void wmpz_abs(wmpz_ptr, wmpz_srcptr);
+
+void wmpz_add (wmpz_ptr, wmpz_srcptr, wmpz_srcptr);
 void wmpz_add_ui (wmpz_ptr, wmpz_srcptr, uint64_t);
 
-void wmpz_sub (wmpz_ptr, wmpz_srcptr, wmpz_ptr);
+void wmpz_sub (wmpz_ptr, wmpz_srcptr, wmpz_srcptr);
 void wmpz_sub_ui (wmpz_ptr, wmpz_srcptr, uint64_t);
 void wmpz_ui_sub (wmpz_ptr, uint64_t, wmpz_srcptr);
 
@@ -56,6 +65,11 @@ void wmpz_mul_ui (wmpz_ptr, wmpz_srcptr, uint64_t);
 void wmpz_mul2exp (wmpz_ptr, wmpz_srcptr, uint64_t);
 void wmpz_tdiv_q_2exp (wmpz_ptr, wmpz_srcptr, uint64_t);
 
+void wmpz_tdiv_qr (wmpz_ptr quot, wmpz_ptr rem, wmpz_srcptr, wmpz_srcptr);
+uint64_t wmpz_tdiv_qr_ui (wmpz_ptr quot, wmpz_ptr rem, wmpz_srcptr, uint64_t);
+
+char *wmpz_get_str (char *, int32_t base, wmpz_srcptr);
+int32_t wmpz_set_str (wmpz_ptr, char const *, int32_t base);
 
 
 int32_t wmpn_cmp (wmp_srcptr, wmp_srcptr, wmp_size_t);
@@ -96,6 +110,9 @@ void wmpn_tdiv_qr (wmp_ptr qp, wmp_ptr rp, wmp_size_t qxn, wmp_srcptr np,
 // not verified when rp and np are aliased.
 wmp_size_t wmpn_sqrtrem (wmp_ptr sp, wmp_ptr rp, wmp_srcptr np, wmp_size_t);
 
+wmp_size_t wmpn_get_str (unsigned char *, int32_t base, wmp_srcptr, wmp_size_t);
+wmp_size_t wmpn_set_str (wmp_ptr, unsigned char const *, size_t, int32_t base);
+
 #ifdef __cplusplus
 }
 #endif