You asked about an exact symbolic (ie. not floating point) form as the result.
Below are two approaches. The first is to subsequently apply the identify command to an answer (containing floats) obtained by using the complex option to the convert call. Such an approach often will not work on more involved results.
The second approach below involves trying to figure out a factorization and thus the extension field which may be supplied as another optional argument to the convert call. This is followed by a minor rearrangement in order to get 1 as the coefficient of the leading terms of the polynomials in the denominators, similar to how you cast it.
restart:
a:=1/(2*x^3+x^2+2*x):
# One way...
sort(identify(convert(a,parfrac,complex)));
1 1 (1/2) (1/2) 1 1 (1/2) (1/2)
- - - -- I 3 5 - - + -- I 3 5
1 4 60 4 60
--- + ------------------------- + -------------------------
2 x 1 1 (1/2) (1/2) 1 1 (1/2) (1/2)
x + - + - I 3 5 x + - - - I 3 5
4 4 4 4
# Another (somewhat successful) way...
A:=denom(a);
/ 2 \
x \2 x + x + 2/
Q:=map(radnormal,
convert(a, parfrac,
{I} union indets([solve(A/x^(ldegree(A)))],radical)
)
);
(1/2) (1/2)
-15 + I 15 1 15 + I 15
------------------------- + --- - ------------------------
/ (1/2) \ 2 x / (1/2) \
15 \-I 15 + 4 x + 1/ 15 \I 15 + 4 x + 1/
sort(add(subs(R=(numer(1/t)/lcoeff(numer(1/t))),
S=denom(1/t)/lcoeff(numer(1/t)),
S/R),
t in Q));
1 1 (1/2) 1 1 (1/2)
- - + -- I 15 - - - -- I 15
1 4 60 4 60
--- + ------------------- + -------------------
2 x 1 (1/2) 1 1 (1/2) 1
x - - I 15 + - x + - I 15 + -
4 4 4 4