Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
Function: laurentseries Section: sums C-Name: laurentseries0 Prototype: GDPDnp Help: laurentseries(f, {M = seriesprecision}, {x='x}): expand f around 0 as a Laurent series in x to order M. Doc: Expand $f$ as a Laurent series around $x = 0$ to order $M$. This function computes $f(x + O(x^n))$ until $n$ is large enough: it must be possible to evaluate $f$ on a power series with $0$ constant term. \bprog ? laurentseries(t->sin(t)/(1-cos(t)), 5) %1 = 2*x^-1 - 1/6*x - 1/360*x^3 - 1/15120*x^5 + O(x^6) ? laurentseries(log) *** at top-level: laurentseries(log) *** ^------------------ *** in function laurentseries: log *** ^--- *** log: domain error in log: series valuation != 0 @eprog Note that individual Laurent coefficients of order $\leq M$ can be retrieved from $s = \kbd{laurentseries}(f,M)$ via \kbd{polcoef(s,i)} for any $i \leq M$. The series $s$ may occasionally be more precise that the required $O(x^{M+1})$. With respect to successive calls to \tet{derivnum}, \kbd{laurentseries} is both faster and more precise: \bprog ? laurentseries(t->log(3+t),1) %1 = 1.0986122886681096913952452369225257047 + 1/3*x - 1/18*x^2 + O(x^3) ? derivnum(t=0,log(3+t),1) %2 = 0.33333333333333333333333333333333333333 ? derivnum(t=0,log(3+t),2) %3 = -0.11111111111111111111111111111111111111 ? f = x->sin(exp(x)); ? polcoef(laurentseries(x->f(x+2), 1), 1) %5 = 3.3129294231043339804683687620360224365 ? exp(2) * cos(exp(2)); %6 = 3.3129294231043339804683687620360224365 ? derivnum(x = 2, f(x)) %7 = 3.3129294231043339804683687620360224364 \\ 1 ulp off ? default(realprecision,115); ? for(i=1,10^4, laurentseries(x->f(x+2),1)) time = 279 ms. ? for(i=1,10^4, derivnum(x=2,f(x))) \\ ... and slower time = 1,134 ms. @eprog \synt{laurentseries}{void *E, GEN (*f)(void*,GEN,long), long M, long v, long prec}.