pet_cycleind_symm := proc(n) local p, s; option remember; if n=0 then return 1; fi; expand(1/n*add(a[l]*pet_cycleind_symm(n-l), l=1..n)); end; pet_autom2cycles := proc(src, aut) local numa, numsubs; local marks, pos, cycs, cpos, clen; numsubs := [seq(src[k]=k, k=1..nops(src))]; numa := subs(numsubs, aut); marks := Array([seq(true, pos=1..nops(aut))]); cycs := []; pos := 1; while pos <= nops(aut) do if marks[pos] then clen := 0; cpos := pos; while marks[cpos] do marks[cpos] := false; cpos := numa[cpos]; clen := clen+1; od; cycs := [op(cycs), clen]; fi; pos := pos+1; od; return mul(a[cycs[k]], k=1..nops(cycs)); end; pet_varinto_cind := proc(poly, ind) local subs1, subs2, polyvars, indvars, v, pot, res; res := ind; polyvars := indets(poly); indvars := indets(ind); for v in indvars do pot := op(1, v); subs1 := [seq(polyvars[k]=polyvars[k]^pot, k=1..nops(polyvars))]; subs2 := [v=subs(subs1, poly)]; res := subs(subs2, res); od; res; end; pet_flatten_term := proc(varp) local terml, d, cf, v; terml := []; cf := varp; for v in indets(varp) do d := degree(varp, v); terml := [op(terml), seq(v, k=1..d)]; cf := cf/v^d; od; [cf, terml]; end; pet_multiset_term := proc(varp) local terml, d, cf, v; terml := []; cf := varp; for v in indets(varp) do d := degree(varp, v); terml := [op(terml), [v, d]]; cf := cf/v^d; od; [cf, terml]; end; pet_flat2rep := proc(f) local p, q, res, cyc, t, len; q := 1; res := []; for t in f do len := op(1, t); cyc := [seq(p, p=q+1..q+len-1), q]; res := [op(res), seq(cyc[p], p=1..nops(cyc))]; q := q+len; od; res; end; pet_cycleind_sqmat := proc(n) option remember; local cind, sind, t1, t2, src, autom, p, q, flat1, flat2, rep1, rep2; cind := 0; if n=1 then sind := [a[1]]; else sind := pet_cycleind_symm(n); fi; src := [seq(seq([p, q], q=1..n), p=1..n)]; for t1 in sind do flat1 := pet_flatten_term(t1); rep1 := pet_flat2rep(flat1[2]); for t2 in sind do flat2 := pet_flatten_term(t2); rep2 := pet_flat2rep(flat2[2]); autom := [seq([rep1[src[q][1]], rep2[src[q][2]]], q=1..n*n)]; cind := cind + flat1[1]*flat2[1]* pet_autom2cycles(src, autom); od; od; cind; end; pet_cycleind_sqmat2 := proc(n) option remember; local cind, sind, t1, t2, q, cyc1, cyc2, flat1, flat2, len, len1, len2; cind := 0; if n=1 then sind := [a[1]]; else sind := pet_cycleind_symm(n); fi; for t1 in sind do flat1 := pet_flatten_term(t1); for t2 in sind do flat2 := pet_flatten_term(t2); q := 1; for cyc1 in flat1[2] do len1 := op(1, cyc1); for cyc2 in flat2[2] do len2 := op(1, cyc2); len := lcm(len1, len2); q := q * a[len]^(len1*len2/len); od; od; cind := cind + flat1[1]*flat2[1]*q; od; od; cind; end; v := proc(n) option remember; local cind, gf; cind := pet_cycleind_sqmat(n); gf := pet_varinto_cind(1+z, cind); subs(z=1, gf); end; w := proc(n) option remember; local res, sind, t1, t2, p1, p2, mset1, mset2, cf; res := 0; if n=1 then sind := [a[1]]; else sind := pet_cycleind_symm(n); fi; for t1 in sind do mset1 := pet_multiset_term(t1); for t2 in sind do mset2 := pet_multiset_term(t2); cf := 0; for p1 in mset1[2] do for p2 in mset2[2] do cf := cf + gcd(op(1, p1[1]), op(1, p2[1]))* p1[2]*p2[2]; od; od; res := res + mset1[1]*mset2[1]*2^cf; od; od; res; end;