07c50e4
--- src/_fastmath.c
07c50e4
+++ src/_fastmath.c
07c50e4
@@ -134,12 +134,18 @@ longObjToMPZ (mpz_t m, PyLongObject * p)
07c50e4
 static PyObject *
07c50e4
 mpzToLongObj (mpz_t m)
07c50e4
 {
07c50e4
-	/* borrowed from gmpy */
07c50e4
 #ifdef IS_PY3K
07c50e4
-	int size = (mpz_sizeinbase (m, 2) + PyLong_SHIFT - 1) / PyLong_SHIFT;
07c50e4
+	PyObject *retval;
07c50e4
+	int size = mpz_sizeinbase(m, 10) + 2;
07c50e4
+	char *str = malloc(size);
07c50e4
+	if (!str)
07c50e4
+		return NULL;
07c50e4
+	retval = PyLong_FromString(mpz_get_str(str, 10, m), NULL, 10);
07c50e4
+	free(str);
07c50e4
+	return retval;
07c50e4
 #else
07c50e4
+	/* borrowed from gmpy */
07c50e4
 	int size = (mpz_sizeinbase (m, 2) + SHIFT - 1) / SHIFT;
07c50e4
-#endif
07c50e4
 	int sgn;
07c50e4
 	int i;
07c50e4
 	mpz_t temp;
07c50e4
@@ -151,36 +157,16 @@ mpzToLongObj (mpz_t m)
07c50e4
 	mpz_mul_si(temp, m, sgn);
07c50e4
 	for (i = 0; i < size; i++)
07c50e4
 	{
07c50e4
-#ifdef IS_PY3K
07c50e4
-#if PY_VERSION_HEX < 0x030C0000
07c50e4
-		l->ob_digit[i] = (digit) (mpz_get_ui (temp) & PyLong_MASK);
07c50e4
-#else
07c50e4
-		l->long_value.ob_digit[i] = (digit) (mpz_get_ui (temp) & PyLong_MASK);
07c50e4
-#endif
07c50e4
-		mpz_fdiv_q_2exp (temp, temp, PyLong_SHIFT);
07c50e4
-#else
07c50e4
 		l->ob_digit[i] = (digit) (mpz_get_ui (temp) & MASK);
07c50e4
 		mpz_fdiv_q_2exp (temp, temp, SHIFT);
07c50e4
-#endif
07c50e4
 	}
07c50e4
 	i = size;
07c50e4
-#if PY_VERSION_HEX < 0x030C0000
07c50e4
 	while ((i > 0) && (l->ob_digit[i - 1] == 0))
07c50e4
-#else
07c50e4
-	while ((i > 0) && (l->long_value.ob_digit[i - 1] == 0))
07c50e4
-#endif
07c50e4
 		i--;
07c50e4
-#ifdef IS_PY3K
07c50e4
-#if PY_VERSION_HEX < 0x030C0000
07c50e4
-	l->ob_base.ob_size = i * sgn;
07c50e4
-#else
07c50e4
-	l->long_value.lv_tag = TAG_FROM_SIGN_AND_SIZE(sgn, (size_t)i);
07c50e4
-#endif
07c50e4
-#else
07c50e4
 	l->ob_size = i * sgn;
07c50e4
-#endif
07c50e4
 	mpz_clear (temp);
07c50e4
 	return (PyObject *) l;
07c50e4
+#endif
07c50e4
 }
07c50e4
 
07c50e4
 typedef struct