1
$\begingroup$

I define the following in Sage.

rank=8
R=PolynomialRing(QQ, 'a' ,rank+1)
a=R.gens()

I would like to define a function f which returns the index of a[3]: f(a[3])=3 and define another function g such that g(a[3])=a. How to do this in Sage? Thank you very much!

$\endgroup$
1
  • $\begingroup$ This question is likely out of scope on math stack exchange; such questions are welcome on Ask Sage. $\endgroup$ Feb 23, 2021 at 18:07

2 Answers 2

2
$\begingroup$

This answer draws on the one by Alex J Best for defining f, but also defines g.

Define a multivariate polynomial ring and its generator tuple:

sage: R = PolynomialRing(QQ, 'a', 4)
sage: R
Multivariate Polynomial Ring in a0, a1, a2, a3 over Rational Field
sage: a = R.gens()
sage: a
(a0, a1, a2, a3)

Consider one of the generators (or "indeterminates", or "variables"):

sage: p = a[2]
sage: p
a2

To get its index in the generator tuple:

sage: a.index(p)
2

This can be made into the function f requested in the question:

sage: f = a.index
sage: f(p)
2

The above is tied to the definition of a; more generally:

def f(p):
    r"""
    Return the index of this generator of a polynomial ring.
    """
    return p.parent().gens().index()

What function g the question requests is not entirely clear.

If we want g(a[2]) to return the string 'a':

def g(p):
    r"""
    Return the generator name stripped of its index.
    """
    return ''.join(c for c in str(p) if not c.isdigit())

With that definition:

sage: p = a[2]
sage: aa, k = g(p), f(p)
sage: aa
'a'
sage: k
2
sage: ak = aa + str(k)
sage: ak
'a2'
sage: ak == str(p)
True
sage: R(ak) == p
True

If instead we want g(a[2]) to return the tuple R.gens():

def g(p):
    r"""
    Return the tuple of generators of the parent polynomial ring.
    """
    return p.parent().gens()

With that definition:

sage: p = a[2]
sage: aa, k = g(p), f(p)
sage: aa
(a0, a1, a2, a3)
sage: k
2
sage: ak = aa[k]
sage: ak
a2
sage: ak == p
True
$\endgroup$
2
$\begingroup$

This is something generic about lists in python so

a.index(a[3])

for the first (you can write f = a.index if you like), and for the second if you really want a function rather than using [3] you can do

def g(n):
    return a[n]
$\endgroup$
1
  • $\begingroup$ thanks a lot! a.index(a[3]) works! But the other function I would like to define is to take the name of the variable. For example, g(b[3])=b. In maple, we can use indets(b[3]). Do you know how to do this in Sage? Thank you very much! $\endgroup$
    – LJR
    Feb 23, 2021 at 8:54

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .