Torsor modules

Torsors under commutative finite flat group schemes.

class dual_pairs.torsor_pair.TorsorPair(*args: Any, **kwargs: Any)

A torsor for a dual pair of algebras.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x, x^2 + 17])
sage: Phi = Matrix(QQ, [[1/4,  1/4,  1/2,   0],
....:                   [1/4,  1/4, -1/2,   0],
....:                   [1/2, -1/2,    0,   0],
....:                   [  0,    0,    0, -17]])
sage: D = DualPair(A, Phi)
sage: T = FiniteFlatAlgebra(QQ, x^4 - 17)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix(QQ, [[1, 0, 0,   0],
....:                   [0, 0, 1,   0],
....:                   [0, 1, 0,   0],
....:                   [0, 0, 0, -17]])
sage: X = TorsorPair(D, T, U, Psi)
sage: X
Torsor for Dual pair of algebras over Rational Field
A = Finite flat algebra of degree 4 over Rational Field, product of:
Number Field in a0 with defining polynomial x
Number Field in a1 with defining polynomial x
Number Field in a2 with defining polynomial x^2 + 17
B = Finite flat algebra of degree 4 over Rational Field, product of:
Number Field in a0 with defining polynomial x
Number Field in a1 with defining polynomial x
Number Field in a2 with defining polynomial x^2 + 17
T = Monogenic algebra of degree 4 over Rational Field with defining polynomial x^4 - 17

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair

sage: A = FiniteFlatAlgebra(QQ, [x^3 - 1])
sage: B = FiniteFlatAlgebra(QQ, [x, x, x])
sage: Phi = Matrix.identity(QQ, 3)
sage: D = DualPair(A, B, Phi)

sage: t = polygen(QQ, 't')
sage: T = FiniteFlatAlgebra(QQ, t^3 - 7)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix.identity(QQ, 3)
sage: X = TorsorPair(D, T, U, Psi)

sage: L.<a> = X.splitting_field()
sage: points_D = D.points(L)
sage: points_X = X.points(L)
sage: Matrix([[points_X.index(X.add(P, Q))
....:          for Q in points_X] for P in points_D])
[0 1 2]
[1 2 0]
[2 0 1]
add(P, Q)

Return the sum of P and Q.

INPUT:

  • P – a point of the group scheme for which self is a torsor

  • Q – a point of self

OUTPUT:

The point P + Q of self.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x, x^2 + 17])
sage: Phi = Matrix(QQ, [[1/4,  1/4,  1/2,   0],
....:                   [1/4,  1/4, -1/2,   0],
....:                   [1/2, -1/2,    0,   0],
....:                   [  0,    0,    0, -17]])
sage: D = DualPair(A, Phi)
sage: T = FiniteFlatAlgebra(QQ, x^4 - 17)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix(QQ, [[1, 0, 0,   0],
....:                   [0, 0, 1,   0],
....:                   [0, 1, 0,   0],
....:                   [0, 0, 0, -17]])
sage: X = TorsorPair(D, T, U, Psi)

sage: K.<a> = NumberField(x^4 - 17)
sage: o, p = D.points(K)
sage: x, y = X.points(K)
sage: o
(1, 0, 0, 0)
sage: p
(0, 1, 0, 0)
sage: x
(1, a, a^2, a^3)
sage: y
(1, -a, a^2, -a^3)
sage: X.add(o, x) == x
True
sage: X.add(o, y) == y
True
sage: X.add(p, x) == y
True
sage: X.add(p, y) == x
True

sage: R.<x> = QQ[]
sage: L.<a> = QuadraticField(-1, 'i').extension(x^4 - 17)
sage: o, p, q, r = D.points(L)
sage: points_X = X.points(L)
sage: p
(0, 1, 0, 0)
sage: points_X
[(1, -i*a, -a^2, i*a^3),
 (1, i*a, -a^2, -i*a^3),
 (1, a, a^2, a^3),
 (1, -a, a^2, -a^3)]
sage: [X.add(o, x) for x in points_X] == points_X
True
sage: [X.add(p, x) for x in points_X]
[(1, i*a, -a^2, -i*a^3),
 (1, -i*a, -a^2, i*a^3),
 (1, -a, a^2, -a^3),
 (1, a, a^2, a^3)]
sage: [X.add(q, x) for x in points_X]
[(1, -a, a^2, -a^3),
 (1, a, a^2, a^3),
 (1, i*a, -a^2, -i*a^3),
 (1, -i*a, -a^2, i*a^3)]
sage: [X.add(r, x) for x in points_X]
[(1, a, a^2, a^3),
 (1, -a, a^2, -a^3),
 (1, -i*a, -a^2, i*a^3),
 (1, i*a, -a^2, -i*a^3)]
sage: all(X.add(q, X.add(p, x)) == X.add(D.add(p, q), x) for x in points_X)
True
algebra()

Return the R-algebra T attached to self.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair

sage: x = polygen(QQ, 'x')
sage: y = polygen(QQ, 'y')
sage: A = FiniteFlatAlgebra(QQ, [x^3 - 1])
sage: B = FiniteFlatAlgebra(QQ, [y, y, y])
sage: Phi = Matrix.identity(QQ, 3)
sage: D = DualPair(A, B, Phi)

sage: t = polygen(QQ, 't')
sage: T = FiniteFlatAlgebra(QQ, t^3 - 7)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix.identity(QQ, 3)
sage: X = TorsorPair(D, T, U, Psi)
sage: X.algebra() is T
True
contracted_product()

Return the contracted product of self and other.

TODO: is this a good name?

dual_module()

Return the B-module U attached to self.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair

sage: x = polygen(QQ, 'x')
sage: y = polygen(QQ, 'y')
sage: A = FiniteFlatAlgebra(QQ, [x^3 - 1])
sage: B = FiniteFlatAlgebra(QQ, [y, y, y])
sage: Phi = Matrix.identity(QQ, 3)
sage: D = DualPair(A, B, Phi)

sage: t = polygen(QQ, 't')
sage: T = FiniteFlatAlgebra(QQ, t^3 - 7)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix.identity(QQ, 3)
sage: X = TorsorPair(D, T, U, Psi)
sage: X.dual_module() is U
True
dual_pair()

Return the dual pair for which self is a torsor.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair

sage: x = polygen(QQ, 'x')
sage: y = polygen(QQ, 'y')
sage: A = FiniteFlatAlgebra(QQ, [x^3 - 1])
sage: B = FiniteFlatAlgebra(QQ, [y, y, y])
sage: Phi = Matrix.identity(QQ, 3)
sage: D = DualPair(A, B, Phi)

sage: t = polygen(QQ, 't')
sage: T = FiniteFlatAlgebra(QQ, t^3 - 7)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix.identity(QQ, 3)
sage: X = TorsorPair(D, T, U, Psi)
sage: X.dual_pair() is D
True
is_isomorphic(other)

Return True if self is isomorphic to other.

Todo

  • more efficient algorithm

  • optionally also return an isomorphism

is_trivial()

Return True if self is a trivial torsor.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair

sage: x = polygen(QQ, 'x')
sage: y = polygen(QQ, 'y')
sage: A = FiniteFlatAlgebra(QQ, [x^3 - 1])
sage: B = FiniteFlatAlgebra(QQ, [y, y, y])
sage: Phi = Matrix.identity(QQ, 3)
sage: D = DualPair(A, B, Phi)
sage: X = D.trivial_torsor()
sage: X.is_trivial()
True

sage: t = polygen(QQ, 't')
sage: T = FiniteFlatAlgebra(QQ, t^3 - 7)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix.identity(QQ, 3)
sage: X = TorsorPair(D, T, U, Psi)
sage: X.is_trivial()
False
isom_torsor(other)

Return the torsor Isom(self, other).

TODO: is this a good name?

opposite()

Return the opposite torsor of self.

TODO: is this a good name?

points(R)

Return the set of points of self over R.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x, x^2 + 17])
sage: Phi = Matrix(QQ, [[1/4,  1/4,  1/2,   0],
....:                   [1/4,  1/4, -1/2,   0],
....:                   [1/2, -1/2,    0,   0],
....:                   [  0,    0,    0, -17]])
sage: D = DualPair(A, Phi)
sage: T = FiniteFlatAlgebra(QQ, x^4 - 17)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix(QQ, [[1, 0, 0,   0],
....:                   [0, 0, 1,   0],
....:                   [0, 1, 0,   0],
....:                   [0, 0, 0, -17]])
sage: X = TorsorPair(D, T, U, Psi)
sage: K.<i> = QuadraticField(-1)
sage: L.<a> = K.extension(x^4 - 17)
sage: X.points(L)
[(1, -i*a, -a^2, i*a^3),
 (1, i*a, -a^2, -i*a^3),
 (1, a, a^2, a^3),
 (1, -a, a^2, -a^3)]
psi()

Return the pairing matrix \(\Psi\) attached to self.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x, x^2 + 17])
sage: Phi = Matrix(QQ, [[1/4,  1/4,  1/2,   0],
....:                   [1/4,  1/4, -1/2,   0],
....:                   [1/2, -1/2,    0,   0],
....:                   [  0,    0,    0, -17]])
sage: D = DualPair(A, Phi)
sage: T = FiniteFlatAlgebra(QQ, x^4 - 17)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix(QQ, [[1, 0, 0,   0],
....:                   [0, 0, 1,   0],
....:                   [0, 1, 0,   0],
....:                   [0, 0, 0, -17]])
sage: X = TorsorPair(D, T, U, Psi)
sage: X.psi() == Psi
True
splitting_field(names)

Return a splitting field for self.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x, x^2 + 17])
sage: Phi = Matrix(QQ, [[1/4,  1/4,  1/2,   0],
....:                   [1/4,  1/4, -1/2,   0],
....:                   [1/2, -1/2,    0,   0],
....:                   [  0,    0,    0, -17]])
sage: D = DualPair(A, Phi)
sage: T = FiniteFlatAlgebra(QQ, x^4 - 17)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix(QQ, [[1, 0, 0,   0],
....:                   [0, 0, 1,   0],
....:                   [0, 1, 0,   0],
....:                   [0, 0, 0, -17]])
sage: X = TorsorPair(D, T, U, Psi)
sage: X.splitting_field('a')
Number Field in a with defining polynomial x^8 + 68*x^6 + 1700*x^4 + 23120*x^2 + 73984
upsilon()

Return the matrix \(\Upsilon\) attached to self.

EXAMPLES:

sage: from dual_pairs import FiniteFlatAlgebra, DualPair
sage: from dual_pairs.finite_flat_algebra_module import FiniteFlatAlgebraModule
sage: from dual_pairs.torsor_pair import TorsorPair
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x, x^2 + 17])
sage: Phi = Matrix(QQ, [[1/4,  1/4,  1/2,   0],
....:                   [1/4,  1/4, -1/2,   0],
....:                   [1/2, -1/2,    0,   0],
....:                   [  0,    0,    0, -17]])
sage: D = DualPair(A, Phi)
sage: T = FiniteFlatAlgebra(QQ, x^4 - 17)
sage: U = FiniteFlatAlgebraModule(A)
sage: Psi = Matrix(QQ, [[1, 0, 0,   0],
....:                   [0, 0, 1,   0],
....:                   [0, 1, 0,   0],
....:                   [0, 0, 0, -17]])
sage: X = TorsorPair(D, T, U, Psi)
sage: X.upsilon()
[    1     0     0     0]
[    0     0     1     0]
[    0     1     0     0]
[    0     0     0 -1/17]