def _gen_names(elts): r""" Used to find a name for a generator when rings are created using the ``__getitem__`` syntax, e.g. ``ZZ['x']``, ``ZZ[sqrt(2)]``. EXAMPLES:: sage: from sage.categories.rings import _gen_names sage: list(_gen_names([sqrt(5)])) ['sqrt5'] sage: list(_gen_names([sqrt(-17), 2^(1/3)])) ['a', 'b'] sage: list(_gen_names((1..27)))[-1] 'aa' """ import re from sage.structure.parent_gens import _certify_names from sage.combinat.words.words import Words it = iter(Words("abcdefghijklmnopqrstuvwxyz", infinite=False)) it.next() # skip empty word for x in elts: name = str(x) m = re.match('^sqrt\((\d+)\)$', name) if m: name = "sqrt%s" % m.groups()[0] try: _certify_names([name]) except ValueError: name = it.next().string_rep() yield name