@@ -605,7 +605,15 @@ cdef class Basic(object):
605
605
d[self ] = 1
606
606
return d
607
607
608
- def series (ex , x = None , x0 = 0 , n = 6 , method = ' sympy' , removeO = False ):
608
+ def coeff (self , x , n = 1 ):
609
+ cdef Symbol _x = sympify(x)
610
+ cdef Basic _n = sympify(n)
611
+ return c2py(symengine.coeff(deref(self .thisptr), deref(_x.thisptr), deref(_n.thisptr)))
612
+
613
+ def has (self , *symbols ):
614
+ return any ([has_symbol(self , symbol) for symbol in symbols])
615
+
616
+ def series (ex , x = None , x0 = 0 , n = 6 , as_deg_coef_pair = False ):
609
617
# TODO: check for x0 an infinity, see sympy/core/expr.py
610
618
# TODO: nonzero x0
611
619
# underscored local vars are of symengine.py type
@@ -622,35 +630,31 @@ def series(ex, x=None, x0=0, n=6, method='sympy', removeO=False):
622
630
if not _x in syms:
623
631
return _ex
624
632
625
- if len (syms) > 1 or method == ' sympy' :
626
- from sympy import series as sy_series
627
- return sy_series(_ex._sympy_(), _x._sympy_(), x0, n)
628
- elif method == ' ring_series' :
629
- from sympy.polys.ring_series import rs_series
630
- return rs_series(_ex._sympy_(), _x._sympy_(), n).as_expr().subs(x,x- x0)
631
- elif method != ' symengine' :
632
- raise ValueError (' unknown method in series()' )
633
+ if x0 != 0 :
634
+ _ex = _ex.subs({_x: _x + x0})
633
635
634
636
cdef RCP[const symengine.Symbol] X = symengine.rcp_static_cast_Symbol(_x.thisptr)
635
- cdef unsigned int N = n
636
637
cdef umap_int_basic umap
637
638
cdef umap_int_basic_iterator iter , iterend
638
- cdef Basic coef
639
639
640
- umap = deref(symengine.series(_ex.thisptr, X, N)).as_dict()
640
+ if not as_deg_coef_pair:
641
+ b = c2py(< symengine.RCP[const symengine.Basic]> deref(symengine.series(_ex.thisptr, X, n)).as_basic())
642
+ if x0 != 0 :
643
+ b = b.subs({_x: _x - x0})
644
+ return b
645
+
646
+ umap = deref(symengine.series(_ex.thisptr, X, n)).as_dict()
641
647
642
- from sympy import Add as sAdd, Pow as sPow, O as sO
643
648
iter = umap.begin()
644
649
iterend = umap.end()
645
650
poly = 0
646
651
l = []
647
652
while iter != iterend:
648
- coef = c2py(< symengine.RCP[const symengine.Basic]> (deref(iter ).second))
649
- l.append(sPow(_x,(deref(iter ).first)) * coef)
653
+ l.append([deref(iter ).first, c2py(< symengine.RCP[const symengine.Basic]> (deref(iter ).second))])
650
654
inc(iter )
651
- if removeO is False :
652
- l.append(sO(sPow(_x, n)))
653
- return sAdd (* l)
655
+ if as_deg_coef_pair :
656
+ return l
657
+ return add (* l)
654
658
655
659
656
660
cdef class Symbol(Basic):
0 commit comments