# $Source: /u/maple/research/lib/DEtools/diffop/src/RCS/symmetric_power,v $ # $Notify: hoeij@sci.kun.nl $ # Procedures for users # symmetric_power, symmetric_product, exterior_power # Procedures for use only in the rest of the diffop package: # none # Procedures for use only in this file: # symext ######################## # Various tools #----------------------------------------- ######################## diffop_tools macro( x=`DEtools/diffop/x`, DF=`DEtools/diffop/DF`, solve=readlib(`solve/linear`), symmetric_power=`DEtools/diffop/symmetric_power`, symmetric_product=`DEtools/diffop/symmetric_product`, symext=`DEtools/diffop/symext`, exterior_power=`DEtools/diffop/exterior_power` ): # Input: f in Qbar(x)[DF] (in RootOf syntax) # Output: g such that f(y)=0 -> g(y^n)=0 symmetric_power:=proc(f,n) global DF,x; local i,zero,a,y,ypower,k,subs_rem,co; option `Copyright (c) 1997 Waterloo Maple Inc. All rights reserved.`; ypower:=y(x)^n; zero:=a[0]*ypower; subs_rem:=diff(y(x),seq(x,k=1..degree(f,DF)))=-convert([y(x)* coeff(f,DF,0)/lcoeff(f,DF),seq(diff(y(x),seq(x,k=1..i))* coeff(f,DF,i)/lcoeff(f,DF),i=1..degree(f,DF)-1)],`+`); co:=combinat[numbcomp](degree(f,DF)+n,degree(f,DF)); readlib(symext)(co,subs_rem,a,ypower,zero) end: # This is not a mathematically correct name, but we use it anyway # because of the resemblance with symmetric_power. # Input: a sequence of differential operators (no optional arguments allowed). symmetric_product:=proc() local i,zero,a,ypower,k,subs_rem,co,j,y; global DF,x; option `Copyright (c) 1997 Waterloo Maple Inc. All rights reserved.`; ypower:=convert([seq(y[i](x),i=1..nargs)],`*`); zero:=a[0]*ypower; subs_rem:={seq(diff(y[j](x),seq(x,k=1..degree(args[j],DF)))=-convert([y[j](x)* coeff(args[j],DF,0)/lcoeff(args[j],DF),seq(diff(y[j](x),seq(x,k=1..i))* coeff(args[j],DF,i)/lcoeff(args[j],DF),i=1..degree(args[j],DF)-1)],`+`) ,j=1..nargs)}; co:=convert([seq(degree(i,DF),i=args)],`*`); readlib(symext)(co,subs_rem,a,ypower,zero) end: symext:=proc(co,subs_rem,a) local i,z,zero,res,k,vars,b; global DF,x; option `Copyright (c) 1997 Waterloo Maple Inc. All rights reserved.`; z:=args[4]; zero:=args[5]; vars:={seq(a[k],k=0..co)}; b[0]:=1; for i from 1 to co do z:=evala(Normal(subs(subs_rem,diff(z,x))),'independent'); b[i]:=collect(denom(z)*(diff(b[i-1],x)+b[i-1]*DF),DF,evala@Normal); z:=numer(z); zero:=expand(zero+a[i]*z) od; userinfo(5,'diffop',`solving linear equations...`); res:=subs(solve({coeffs(zero,{seq(`if`(has(i,indets(args[4],function)),i,NULL) ,i=indets(zero))})},vars),convert([seq(a[k]*b[k],k=0..co)],`+`)); userinfo(5,'diffop',`done solving linear equations.`); z:=nops(indets(res) intersect vars)-1; collect(subs(solve({coeff(res,DF,co-z)=1,seq(coeff(res,DF,i)=0 ,i=co-z+1..co)},vars),res),DF,evala@Normal) end: # Also called: associated equation exterior_power:=proc(f,d) local a,z,i,j,subs_rem,k,co,zero,y; option `Copyright (c) 1997 Waterloo Maple Inc. All rights reserved.`; if d<=0 then RETURN('undefined') elif d>degree(f,DF) then RETURN(1) fi; z:=linalg[det](linalg[matrix](d,d,[ seq(y[i](x),i=1..d),seq(seq(diff(y[i](x),x$j),i=1..d),j=1..d-1)])); subs_rem:=[seq( diff(y[j](x),seq(x,k=1..degree(f,DF)))=-convert([y[j](x)* coeff(f,DF,0)/lcoeff(f,DF),seq(diff(y[j](x),seq(x,k=1..i))* coeff(f,DF,i)/lcoeff(f,DF),i=1..degree(f,DF)-1)],`+`),j=1..d)]; co:=binomial(degree(f,DF),d); zero:=a[0]*z; readlib(symext)(co,subs_rem,a,z,zero) end: #savelib('symmetric_power','`DEtools/diffop/symmetric_power.m`'): #savelib('symmetric_product','`DEtools/diffop/symmetric_product.m`'): #savelib('symext','`DEtools/diffop/symext.m`'): #savelib('exterior_power','`DEtools/diffop/exterior_power.m`'):