@@ -773,12 +773,17 @@ cdef class Basic(object):
773
773
cdef _DictBasic D = get_dict(* args)
774
774
return c2py(symengine.ssubs(self .thisptr, D.c))
775
775
776
- xreplace = subs
776
+ replace = xreplace = subs
777
777
778
778
def msubs (Basic self not None , *args ):
779
779
cdef _DictBasic D = get_dict(* args)
780
780
return c2py(symengine.msubs(self .thisptr, D.c))
781
781
782
+ def as_numer_denom (Basic self not None ):
783
+ cdef RCP[const symengine.Basic] _num, _den
784
+ symengine.as_numer_denom(self .thisptr, symengine.outArg(_num), symengine.outArg(_den))
785
+ return c2py(< RCP[const symengine.Basic]> _num), c2py(< RCP[const symengine.Basic]> _den)
786
+
782
787
def n (self , prec = 53 , real = False ):
783
788
if real:
784
789
return eval_real(self , prec)
@@ -886,7 +891,7 @@ cdef class Basic(object):
886
891
return False
887
892
888
893
def copy (self ):
889
- return self .func( * self .args)
894
+ return self
890
895
891
896
def _symbolic_ (self , ring ):
892
897
return ring(self ._sage_())
@@ -1363,10 +1368,6 @@ class Rational(Number):
1363
1368
symengine.outArg_Integer(_num), symengine.outArg_Integer(_den))
1364
1369
return [c2py(< RCP[const symengine.Basic]> _num), c2py(< RCP[const symengine.Basic]> _den)]
1365
1370
1366
- def as_numer_denom (self ):
1367
- r = self .get_num_den()
1368
- return r[0 ], r[1 ]
1369
-
1370
1371
def _sympy_ (self ):
1371
1372
rat = self .get_num_den()
1372
1373
return rat[0 ]._sympy_() / rat[1 ]._sympy_()
@@ -1486,8 +1487,8 @@ class Integer(Rational):
1486
1487
def q (self ):
1487
1488
return 1
1488
1489
1489
- def as_numer_denom (Basic self ):
1490
- return self , Integer( 1 )
1490
+ def get_num_den (Basic self ):
1491
+ return self , 1
1491
1492
1492
1493
@property
1493
1494
def func (self ):
@@ -1753,16 +1754,6 @@ class NaN(Number):
1753
1754
1754
1755
1755
1756
class AssocOp (Basic ):
1756
-
1757
- @classmethod
1758
- def _from_args (cls , args ):
1759
- if len (args) == 0 :
1760
- return cls .identity
1761
- elif len (args) == 1 :
1762
- return args[0 ]
1763
-
1764
- obj = super (AssocOp, cls ).__new__(cls , * args)
1765
- return obj
1766
1757
1767
1758
@classmethod
1768
1759
def make_args (cls , expr ):
@@ -1774,6 +1765,8 @@ class AssocOp(Basic):
1774
1765
1775
1766
class Add (AssocOp ):
1776
1767
1768
+ identity = 0
1769
+
1777
1770
def __new__ (cls , *args , **kwargs ):
1778
1771
cdef symengine.vec_basic v_
1779
1772
cdef Basic e
@@ -1782,6 +1775,15 @@ class Add(AssocOp):
1782
1775
v_.push_back(e.thisptr)
1783
1776
return c2py(symengine.add(v_))
1784
1777
1778
+ @classmethod
1779
+ def _from_args (self , args ):
1780
+ if len (args) == 0 :
1781
+ return self .identity
1782
+ elif len (args) == 1 :
1783
+ return args[0 ]
1784
+
1785
+ return Add(* args)
1786
+
1785
1787
@property
1786
1788
def is_Add (self ):
1787
1789
return True
@@ -1817,6 +1819,8 @@ class Add(AssocOp):
1817
1819
1818
1820
class Mul (AssocOp ):
1819
1821
1822
+ identity = 1
1823
+
1820
1824
def __new__ (cls , *args , **kwargs ):
1821
1825
cdef symengine.vec_basic v_
1822
1826
cdef Basic e
@@ -1825,6 +1829,15 @@ class Mul(AssocOp):
1825
1829
v_.push_back(e.thisptr)
1826
1830
return c2py(symengine.mul(v_))
1827
1831
1832
+ @classmethod
1833
+ def _from_args (self , args ):
1834
+ if len (args) == 0 :
1835
+ return self .identity
1836
+ elif len (args) == 1 :
1837
+ return args[0 ]
1838
+
1839
+ return Mul(* args)
1840
+
1828
1841
@property
1829
1842
def is_Mul (self ):
1830
1843
return True
@@ -1870,6 +1883,9 @@ class Pow(Basic):
1870
1883
cdef RCP[const symengine.Pow] X = symengine.rcp_static_cast_Pow(self .thisptr)
1871
1884
return c2py(deref(X).get_exp())
1872
1885
1886
+ def as_base_exp (self ):
1887
+ return self .base, self .exp
1888
+
1873
1889
@property
1874
1890
def is_Pow (self ):
1875
1891
return True
0 commit comments