Processing math: 100%

First time here? Check out the FAQ!

Ask Your Question
1

Implicitization by symmetric polynomials

asked 4 years ago

A.P. gravatar image

updated 4 years ago

Let p1,,pm be real polynomials (although rational can do as well) in t variables.

What is the most efficient way to compute the smallest degree d such that s(p1,,pm)=0 for some rational symmetric polynomial s in m variables?


At the moment I am doing this for t=1 by iterating the following simple algorithm over d1:

  1. Create a list Sc of the Schur functions corresponding to the partitions of kd with at most m parts, which is a linear basis over Q for the space of symmetric polynomials in m variables with degree up to d.

  2. Compute the list Ps of the evaluations of each element of Sc at (p1,,pm).

  3. Convert the elements of Ps into vectors and stop if they are linearly dependent, otherwise increase d by one and repeat from 1.

This works reasonably well when the degrees of p1,,pm are small, but otherwise iterating over each d involves quite a bit of work and it doesn't scale very well.

I know that the equivalent problem for sQ[X1,,Xm] is "readily" solved through variable elimination via Gröbner bases, but I have yet to find a way to make this work for symmetric polynomials. I also thought that I might compute the relevant ideal and then try to find the subset fixed by the symmetric group in m variables, but I couldn't find any facilities in Sage to compute fixed sets under a group action (which I guess is a hard problem in general).


This is my current code:

S = SymmetricFunctions(QQ).s()
R.<x> = QQ[]

def eval_schur(F, d):
    """
    Returns the evaluation at a vector F of the Schur functions of degree n.
    """
    m = len(F)
    schur_polys = ((l, S(l).expand(m)) for l in Partitions(d) if len(l) <= m)
    return ((l, sch(*F)) for (l,sch) in schur_polys)

def poly_vectors(polys):
    d = max(p.degree() for p in polys)
    return (p.padded_list(d+1) for p in polys)

def order_of_symmetric_dependence(F):
    schur = [R(1)]
    vectors = [1]
    d = 0
    while not FreeModule(QQ,1).are_linearly_dependent(vectors):
        d += 1
        schur.extend((s for (_,s) in eval_schur(F,d)))
        vectors = poly_vectors(schur)
    return d

And here's a sample output:

In [2]: [order_of_symmetric_dependence([x, x^2, x^(2*k)]) for k in range(1,8)]
Out[2]: [4, 5, 8, 11, 12, 12, 12]
Preview: (hide)

Comments

Can you add your code and a sample case? Maybe naive idea: eliminate x1,,xt from yiei(p1(x1,,xt),,pm(x1,,xt)) where ei are the elementary symmetric polynomials in m variables.

rburing gravatar imagerburing ( 4 years ago )
1

@rburing I had to clean up my code a little, but here it is.

A.P. gravatar imageA.P. ( 4 years ago )

@rburing Unfortunately, your suggestion doesn't seem to work, assuming I understand it correctly:

F = [t,t^2,t^3]
Rt.<t,x1,x2,x3> = QQ[]
I = Rt.ideal([x1 - E[1].expand(3)(F), x2 - E[2].expand(3)(F), x3 - E[3].expand(3)(F)])
gs = I.elimination_ideal(t).gens()
[g(x1 = F[0], x2 = F[1], x3 = F[2]) for g in gs]

outputs

[-t^6 - t^5 + t^4 + t^3,
t^7 - t^6 - 3*t^5 + t^4 + 2*t^3,
t^5 + t^4 - t^3 - t^2,
2*t^10 - 4*t^9 - 9*t^8 + 2*t^7 + 5*t^6]

instead of [0,0,0,0].

A.P. gravatar imageA.P. ( 4 years ago )
1

Actually, I made a mistake there. I should have substituted ei back in after eliminating the variables, and indeed evaluating the elements of

gs = [g(x1 = E[1].expand(3), x2 = E[2].expand(3), x3 = E[3].expand(3)) for g in I.elimination_ideal(t).gens()]

at F results in [0,0,0,0]. I'll have to do some performance tests, now.

A.P. gravatar imageA.P. ( 4 years ago )

1 Answer

Sort by » oldest newest most voted
1

answered 4 years ago

rburing gravatar image

As suggested in my comment: you can eliminate x1,,xt from the ideal I=yiei(p1(x1,,xt),,pm(x1,,xt)):i=1,,m in the ring Q[x1,,xt,y1,,ym], where ei are the elementary symmetric polynomials in m variables.

For efficiency reasons we compute the elimination ideal IQ[y1,,ym] manually, using a Groebner basis G of I with respect to a block ordering where the x's are the greatest and the y's have a weighted degrevlex ordering where yk has degree k (simulating the degree of ek), so that substituting yi=ei(x1,,xt) into the polynomials in GQ[y1,,ym] yields symmetric dependencies of minimal degree.

def symmetric_dependencies(p):
    R = p[0].parent()
    m = len(p)
    S = PolynomialRing(R.base_ring(),
                       names=list(R.gens()) + ['y{}'.format(k+1) for k in range(m)],
                       order=TermOrder('degrevlex', R.ngens()) + \
                             TermOrder('wdegrevlex',list(range(1,m+1))))
    p = [S(f) for f in p]
    X = S.gens()[0:R.ngens()]
    Y = S.gens()[R.ngens():]
    E = SymmetricFunctions(QQ).elementary()
    Es = [E[k+1].expand(m) for k in range(m)]
    I = S.ideal([Y[k] - Es[k](p) for k in range(m)])
    G = I.groebner_basis()
    GY = [g for g in G if all(v in Y for v in g.lt().variables())]
    E_subs = {Y[k] : Es[k] for k in range(m)}
    dependencies = [f.subs(E_subs) for f in GY]
    #assert all(f(p) == 0 for f in dependencies)
    return dependencies

Example:

sage: R.<x> = QQ[]
sage: [min(f.degree() for f in symmetric_dependencies([x, x^2, x^(2*k)])) for k in range(1,8)]
[4, 5, 8, 11, 12, 12, 12]

It seems to be slightly faster than your function on this example.

Preview: (hide)
link

Comments

1

Thank you, this is precisely what I was after.

A.P. gravatar imageA.P. ( 4 years ago )

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 4 years ago

Seen: 974 times

Last updated: May 09 '20