File tree Expand file tree Collapse file tree 2 files changed +22
-1
lines changed Expand file tree Collapse file tree 2 files changed +22
-1
lines changed Original file line number Diff line number Diff line change @@ -379,6 +379,7 @@ cdef extern from "<symengine/integer.h>" namespace "SymEngine":
379
379
Integer(integer_class i) nogil
380
380
int compare(const Basic & o) nogil
381
381
integer_class as_integer_class() nogil
382
+ RCP[Number] divint(const Integer & other) nogil
382
383
cdef long mp_get_si(integer_class & i) nogil
383
384
cdef double mp_get_d(integer_class & i) nogil
384
385
cdef RCP[const Integer] integer(int i) nogil
@@ -390,6 +391,8 @@ cdef extern from "<symengine/integer.h>" namespace "SymEngine":
390
391
cdef extern from " <symengine/rational.h>" namespace " SymEngine" :
391
392
cdef cppclass Rational(Number):
392
393
rational_class as_rational_class() nogil
394
+ @staticmethod
395
+ RCP[const Number] from_two_ints(const long n, const long d) nogil
393
396
cdef double mp_get_d(rational_class & i) nogil
394
397
cdef RCP[const Number] from_mpq " SymEngine::Rational::from_mpq" (rational_class r) nogil
395
398
cdef void get_num_den(const Rational & rat, const Ptr[RCP[Integer]] & num,
Original file line number Diff line number Diff line change @@ -1664,7 +1664,25 @@ cdef class Number(Expr):
1664
1664
class Rational (Number ):
1665
1665
1666
1666
def __new__ (cls , p , q ):
1667
- return Integer(p)/ q
1667
+ p = int (p)
1668
+ q = int (q)
1669
+ cdef int p_
1670
+ cdef int q_
1671
+ cdef symengine.integer_class p__
1672
+ cdef symengine.integer_class q__
1673
+ cdef string tmp
1674
+ try :
1675
+ # Try to convert p and q to int
1676
+ p_ = p
1677
+ q_ = q
1678
+ return c2py(< rcp_const_basic> symengine.Rational.from_two_ints(p_, q_));
1679
+ except OverflowError :
1680
+ # Too big, need to use mpz
1681
+ tmp = str (p).encode(" utf-8" )
1682
+ p__ = symengine.integer_class(tmp)
1683
+ tmp = str (q).encode(" utf-8" )
1684
+ q__ = symengine.integer_class(tmp)
1685
+ return c2py(< rcp_const_basic> symengine.Integer(p__).divint(symengine.Integer(q__)))
1668
1686
1669
1687
@property
1670
1688
def is_Rational (self ):
You can’t perform that action at this time.
0 commit comments