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 torsorQ – 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
andother
.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
ifself
is isomorphic toother
.Todo
more efficient algorithm
optionally also return an isomorphism
- is_trivial()¶
Return
True
ifself
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]