diff --git a/symengine/lib/symengine.pxd b/symengine/lib/symengine.pxd index ef94aa19..9b7da674 100644 --- a/symengine/lib/symengine.pxd +++ b/symengine/lib/symengine.pxd @@ -24,6 +24,8 @@ cdef extern from 'symengine/mp_class.h' namespace "SymEngine": integer_class(const string &s) except + mpz_t get_mpz_t(integer_class &a) const mpz_t get_mpz_t(const integer_class &a) + string mp_get_hex_str(const integer_class &a) + void mp_set_str(integer_class &a, const string &s) cdef cppclass rational_class: rational_class() rational_class(mpq_t) diff --git a/symengine/lib/symengine_wrapper.pyx b/symengine/lib/symengine_wrapper.pyx index 5b2858be..a77f5bb4 100644 --- a/symengine/lib/symengine_wrapper.pyx +++ b/symengine/lib/symengine_wrapper.pyx @@ -1685,10 +1685,10 @@ class Rational(Number): return c2py(symengine.Rational.from_two_ints(p_, q_)); except OverflowError: # Too big, need to use mpz - tmp = str(p).encode("utf-8") - p__ = symengine.integer_class(tmp) - tmp = str(q).encode("utf-8") - q__ = symengine.integer_class(tmp) + tmp = hex(p).encode("utf-8") + symengine.mp_set_str(p__, tmp) + tmp = hex(q).encode("utf-8") + symengine.mp_set_str(q__, tmp) return c2py(symengine.Integer(p__).divint(symengine.Integer(q__))) @property @@ -1756,8 +1756,8 @@ class Integer(Rational): except OverflowError: # Too big, need to use mpz int_ok = False - tmp = str(i).encode("utf-8") - i__ = symengine.integer_class(tmp) + tmp = hex(i).encode("utf-8") + symengine.mp_set_str(i__, tmp) # Note: all other exceptions are left intact if int_ok: return c2py(symengine.integer(i_)) @@ -1817,7 +1817,7 @@ class Integer(Rational): def _sympy_(Basic self): import sympy - return sympy.Integer(deref(self.thisptr).__str__().decode("utf-8")) + return sympy.Integer(int(self)) def _sage_(Basic self): try: @@ -1828,7 +1828,9 @@ class Integer(Rational): return sage.Integer(str(self)) def __int__(Basic self): - return int(str(self)) + cdef string s = symengine.mp_get_hex_str( + deref(symengine.rcp_static_cast_Integer(self.thisptr)).as_integer_class()) + return int(s.decode("utf-8"), base=16) @property def p(self): diff --git a/symengine/tests/test_sympy_conv.py b/symengine/tests/test_sympy_conv.py index 67253637..7692ad71 100644 --- a/symengine/tests/test_sympy_conv.py +++ b/symengine/tests/test_sympy_conv.py @@ -806,3 +806,12 @@ def test_conv_doubles(): assert sympify(a._sympy_()) == a assert float(a) == f assert float(a._sympy_()) == f + +def test_conv_large_integers(): + a = Integer(10)**10000 + # check that convert to python int does not throw + b = int(a) + # check that convert to sympy int does not throw + if have_sympy: + c = a._sympy_() + d = sympify(c) diff --git a/symengine_version.txt b/symengine_version.txt index f979adec..08007dd1 100644 --- a/symengine_version.txt +++ b/symengine_version.txt @@ -1 +1 @@ -v0.9.0 +5a9d4fa8c769b2dc8d7904ec16d7ea76328c4565