±Û¾´ÀÌ: dskim (dskim)
³¯ Â¥: Wed Mar 11 08:35:19 1998
Á¦ ¸ñ: qfactor
## qfactor(ser_in_q, deg_q) factors a ser_in_q with constant term 1 into
## a product of factors of the form (1-q^i)^j, denoted [i,j], for j <= deg_q.
## ser_in_q may be a list of integers.
qfactor:=proc(ser_in_q,deg_q)
local c,d,i,qfactors,z,temp,low_term,low_coeff;
if type(expand(args[1]),monomial) then RETURN(expand(args[1])) fi;
qfactors:=NULL;
if type(ser_in_q,list) then
temp:=sum(ser_in_q['i']*q^('i'-1),'i'=1..nops(ser_in_q))
else
temp:=convert(taylor(ser_in_q,q,deg_q+1),polynom);
fi;
low_coeff:=tcoeff(temp,q,'low_term');
if low_coeff<>1 then
[coeffs(temp,q)];
for i from 1 to nops(") do
if (modp("[i],low_coeff)<>0) then ERROR(`Can't be factored`) fi;
od;
fi;
temp:=normal(temp/low_coeff/low_term);
c:=tcoeff(temp-1,q,'z');
d:=degree(z,q);
qfactors:=qfactors,[d,-c];
while (d<=deg_q) do
temp:=convert(taylor(temp*(1-q^d)^c,q,deg_q+1),polynom);
c:=tcoeff(temp-1,q,'z');
d:=degree(z,q);
if d=0 then
break
fi;
qfactors:=qfactors,[d,-c];
od;
low_coeff*low_term,qfactors;
end: