I am no longer at KTH, and this page may not be up to date.
Publications and Preprints
The monomial to ultraspherical basis transformation , in preparation.
Infinite log-concavity for polynomial Pólya frequency sequences (with P. Brändén), Proc. Amer. Math. Soc., to appear.
Stable regions of Turán expressions (with Lukasz Grabarek and Mirkó Visontai), J. Approx. Theory, to appear.
Classification theorems for operators preserving zeros in a strip (with P. Brändén), J. Anal. Math., to appear.
Discrete Lagaurre inequalities and a conjecture of I. Krasikov (with G. Csordas), Ann. Sci. Math. Quèbec 36, (2012), 259--273.
Laguerre multiplier sequences and sector properties of entire functions , Complex Var. Elliptic Equ. 58 (2011), 875-885.
Dissertation
Physics Papers on SPIRES
wxMaxima Functions
Here are a few wxmaxima functions I use somewhat regularly (some of them depend on others in the list). Maxima is an open source symbolic manipulator included as part of SAGE.
/*
remSeq writes a sturm sequence candidate to the
return vector r[j] by using the negative remainder procedure
*/
remSeq(f,g):=block(r:[],
r:append(r,[f]),
r:append(r,[g]),
for j:2 while not(diff(r[j])=0) do
r:append(r, [ -1*remainder(r[j-1],r[j]) ]),
return(r)
)$
/* given a list of extended real numbers v,
this function counts the number of sign changes */
countSignChanges(v):=block([sc:0], for j:1 while (not(v[j]=0) and j<length(v)) do
if v[j+1]*v[j]<0 then sc:sc+1,
return(sc)
)$
/*
If p is a polynomial *in z*, then 1 is returned
if it is weakly Hurwitz stable, otherwise zero is returned */
nb: if the polynomial is not in z, it is a constant,
which is always stable or 0, so the function returns a 1
*/
WeakHurwitzStableP(p):=block(
n:hipow(expand(p),z),
p_rot:expand((-%i)^n*subst(z=%i*z,p)),
re_pr:realpart(expand(p_rot)),
im_pr:imagpart(expand(p_rot)),
rseq:remSeq(re_pr,im_pr),
deltaV:countSignChanges(limit(rseq,z,inf)) - countSignChanges(limit(rseq,z,-inf)),
g:gcd(re_pr,im_pr),
if (hipow(expand(g),z)+deltaV = n) then 1 else 0
)$
/*
Plots the zero loci of a vector of univariate polynomials
using a different color and point style for each polynomial.
For example,
zeroPlots([x^2-1,z^3+2*z], -3, 3, -2, 2);
will plot the roots of x^2-1=0 and z^3+2*z=0, on a single plot
*/
zeroPlots(p, xmin, xmax, ymin, ymax):=block(
for j:1 step 1 thru length(p) do
block([v:allroots(%i*p[j])],[n:length(v)],xy[j]:[],
for k:1 step 1 thru n do
xy[j]:append(xy[j],[[realpart(rhs(v[k])),imagpart(rhs(v[k]))]])),
discreteplots:[],
dps:[style],
for j:1 step 1 thru length(p) do
discreteplots:append(discreteplots, [[discrete, xy[j]]]),
for j:1 step 1 thru length(p) do
dps:append(dps, [[points, 2, mod(j,5), mod(j,3)]]),
plot2d(discreteplots, dps, [x, xmin, xmax], [y, ymin, ymax],[xlabel,""], [ylabel,""]) )$
/*
Computes the n-th Jensen polynomial for an entire function f
in the variable x. e.g. jensen(%e^x,3,x) returns (1+x)^3
*/
jensen(f,n,x):=sum(binomial(n,k)*k!*coeff(taylor(f,x,0,k),x,k)*x^k, k, 0, n)$
Thanks to Cesar and Lisa for answering a question of mine:
Critical Points