Constructor for skew polynomial rings

This module provides the function SkewPolynomialRing(), which constructs rings of univariate skew polynomials, and implements caching to prevent the same ring being created in memory multiple times (which is wasteful and breaks the general assumption in Sage that parents are unique).

AUTHOR:

  • Xavier Caruso (2012-06-29): initial version
  • Arpit Merchant (2016-08-04): improved docstrings, added doctests and refactored method
  • Johan Rosenkilde (2016-08-03): changes to import format
sage.rings.polynomial.skew_polynomial_ring_constructor.SkewPolynomialRing(base_ring, base_ring_automorphism=None, names=None, sparse=False)

Return the globally unique skew polynomial ring with the given properties and variable names.

Given a ring \(R\) and a ring automorphism \(\sigma\) of \(R\), the ring of skew polynomials \(R[X, \sigma]\) is the usual abelian group polynomial \(R[X]\) equipped with the modification multiplication deduced from the rule \(X a = \sigma(a) X\).

INPUT:

  • base_ring – a commutative ring
  • base_ring_automorphism – an automorphism of the base ring (also called twisting map)
  • names – a string or a list of strings
  • sparse – a boolean (default: False). Currently not supported.

Note

The current implementation of skew polynomial rings does not support derivations. Sparse skew polynomials and multivariate skew polynomials are also not implemented.

OUTPUT:

A univariate skew polynomial ring over base_ring twisted by base_ring_automorphism when names is a string with no commas (,) or a list of length 1. Otherwise we raise a NotImplementedError as multivariate skew polynomial rings are not yet implemented.

UNIQUENESS and IMMUTABILITY:

In Sage, there is exactly one skew polynomial ring for each triple (base ring, twisting map, name of the variable).

EXAMPLES of VARIABLE NAME CONTEXT:

sage: R.<t> = ZZ[]
sage: sigma = R.hom([t+1])
sage: S.<x> = SkewPolynomialRing(R, sigma); S
Skew Polynomial Ring in x over Univariate Polynomial Ring in t over Integer Ring
 twisted by t |--> t + 1

The names of the variables defined above cannot be arbitrarily modified because each skew polynomial ring is unique in Sage and other objects in Sage could have pointers to that skew polynomial ring.

However, the variable can be changed within the scope of a with block using the localvars context:

sage: with localvars(S, ['y']):
....:     print(S)
Skew Polynomial Ring in y over Univariate Polynomial Ring in t over Integer Ring
 twisted by t |--> t + 1

SQUARE BRACKETS NOTATION:

You can alternatively create a skew polynomial ring over \(R\) twisted by base_ring_automorphism by writing R['varname', base_ring_automorphism].

EXAMPLES:

We first define the base ring:

sage: R.<t> = ZZ[]; R
Univariate Polynomial Ring in t over Integer Ring

and the twisting map:

sage: base_ring_automorphism = R.hom([t+1]); base_ring_automorphism
Ring endomorphism of Univariate Polynomial Ring in t over Integer Ring
  Defn: t |--> t + 1

Now, we are ready to define the skew polynomial ring:

sage: S = SkewPolynomialRing(R, base_ring_automorphism, names='x'); S
Skew Polynomial Ring in x over Univariate Polynomial Ring in t over Integer Ring
 twisted by t |--> t + 1

Use the diamond brackets notation to make the variable ready for use after you define the ring:

sage: S.<x> = SkewPolynomialRing(R, base_ring_automorphism)
sage: (x + t)^2
x^2 + (2*t + 1)*x + t^2

Here is an example with the square bracket notations:

sage: S.<x> = R['x', base_ring_automorphism]; S
Skew Polynomial Ring in x over Univariate Polynomial Ring in t over Integer Ring
 twisted by t |--> t + 1

Rings with different variables names are different:

sage: R['x', base_ring_automorphism] == R['y', base_ring_automorphism]
False

Todo

  • Sparse Skew Polynomial Ring
  • Multivariate Skew Polynomial Ring
  • Add derivations.