Torsor class groups

Torsor class groups for finite commutative group schemes.

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

Return a torsor pair corresponding to this extension.

OUTPUT:

A torsor pair for the dual group scheme.

EXAMPLES:

sage: from dual_pairs import DualPair, FiniteFlatAlgebra
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x])
sage: Phi = 1/2 * Matrix([[1, 1], [1, -1]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([])
sage: H.gens()[0].torsor_pair()
Torsor for Dual pair of algebras over Rational Field
A = Finite flat algebra of degree 2 over Rational Field, product of:
Number Field in a0 with defining polynomial x
Number Field in a1 with defining polynomial x
B = Finite flat algebra of degree 2 over Rational Field, product of:
Number Field in a0 with defining polynomial x
Number Field in a1 with defining polynomial x
T = Finite flat algebra of degree 2 over Rational Field

sage: A = FiniteFlatAlgebra(QQ, [x, x^3 - x^2 - 10*x + 8], [[1], [1, -x, -1/2*x^2 + 1/2*x + 3]])
sage: Phi = 1/4 * Matrix([[1, 3, -1, -1], [3, -3, 1, 1], [-1, 1, 41, -21], [-1, 1, -21, 41]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([2])
sage: H.one().torsor_pair().points(QQ)
[(1, 1, 0, 0)]
sage: [T.torsor_pair().points(QQ) for T in H.gens()]
[[], [], [], []]
class dual_pairs.torsor_class_group.TorsorClassGroup(*args: Any, **kwargs: Any)

The group of isomorphism classes of torsors under a group scheme.

EXAMPLES:

sage: from dual_pairs import DualPair, FiniteFlatAlgebra
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x^3 - x^2 - 10*x + 8], [[1], [1, -x, -1/2*x^2 + 1/2*x + 3]])
sage: Phi = 1/4 * Matrix([[1, 3, -1, -1], [3, -3, 1, 1], [-1, 1, 41, -21], [-1, 1, -21, 41]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([2]); H
Group of isomorphism classes of G-torsors where G is defined by
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^3 - x^2 - 10*x + 8
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^3 - x^2 - 10*x + 8
sage: H.group_structure()
(Multiplicative Abelian group isomorphic to C2 x C2 x C2 x C2,
 [Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e4 - 219/31*e5 + 38/31*e6 + 80/31*e7 + 38/31*e9 + 100/31*e10 + 14/31*e11 + 80/31*e13 + 14/31*e14 - 22/31*e15),
  Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e4 - 6/31*e5 + 14/31*e6 - 1/31*e7 + 14/31*e9 - 16/31*e10 - 4/31*e11 - 1/31*e13 - 4/31*e14 + 1/31*e15),
  Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e4 + 85/31*e5 - 52/31*e6 - 34/31*e7 - 52/31*e9 + 17/31*e10 + 13/31*e11 - 34/31*e13 + 13/31*e14 + 9/31*e15),
  Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e4 - 401/31*e5 - 102/31*e6 - 78/31*e7 - 102/31*e9 - 22/31*e10 - 36/31*e11 - 78/31*e13 - 36/31*e14 + 50/31*e15)],
 <function TorsorClassGroup.group_structure.<locals>.exp at 0x...>,
 <function TorsorClassGroup.group_structure.<locals>.log at 0x...>)
Element

alias of Torsor

gens()

Return a list of generators of self.

EXAMPLES:

sage: from dual_pairs import DualPair, FiniteFlatAlgebra
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x])
sage: Phi = 1/2 * Matrix([[1, 1], [1, -1]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([])
sage: H.gens()
[Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e2 - e3)]
gens_orders()

Return a list of generators of self.

EXAMPLES:

sage: from dual_pairs import DualPair, FiniteFlatAlgebra
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x])
sage: Phi = 1/2 * Matrix([[1, 1], [1, -1]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([])
sage: H.gens_orders()
(2,)
group_structure()

Return the group structure of self.

EXAMPLES:

sage: from dual_pairs import DualPair, FiniteFlatAlgebra
sage: from dual_pairs.dual_pair_from_dihedral_field import dual_pair_from_dihedral_field
sage: R.<x> = QQ[]

sage: A = FiniteFlatAlgebra(QQ, [x, x, x, x])
sage: Phi = 1/4 * Matrix([[1, 1, -1, -1], [1, 1, 1, 1], [-1, 1, 1, -1], [-1, 1, -1, 1]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([])
sage: H.group_structure()[0]
Multiplicative Abelian group isomorphic to C2 x C2

sage: D = dual_pair_from_dihedral_field(x^3 - x - 1, GF(2))
sage: H = D.torsor_class_group([2, 23])
sage: H.group_structure()
(Multiplicative Abelian group isomorphic to C2 x C2,
 [Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e4 + 10/23*e5 - 31/23*e6 + 47/23*e7 - 31/23*e9 + 126/23*e10 - 56/23*e11 + 47/23*e13 - 56/23*e14 - 39/23*e15),
  Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e4 - 9/23*e5 - 2/23*e6 + 6/23*e7 - 2/23*e9 + 20/23*e10 - 14/23*e11 + 6/23*e13 - 14/23*e14 + 19/23*e15)],
 <function TorsorClassGroup.group_structure.<locals>.exp at 0x...>,
 <function TorsorClassGroup.group_structure.<locals>.log at 0x...>)

sage: D = dual_pair_from_dihedral_field(x^3 + 4*x - 1, GF(2))
sage: H = D.torsor_class_group([])
sage: H.group_structure()
(Multiplicative Abelian group isomorphic to C2 x C2,
 [Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e4 + 40/283*e5 + 41/283*e6 + 15/283*e7 + 41/283*e9 + 134/283*e10 - 20/283*e11 + 15/283*e13 - 20/283*e14 + 41/283*e15),
  Torsor defined by ((Fractional ideal (1), Fractional ideal (3, a + 1)), e0 + e1 + e4 + 1670/849*e5 - 19/283*e6 + 697/849*e7 - 19/283*e9 + 359/849*e10 + 14/849*e11 + 697/849*e13 + 14/849*e14 + 226/849*e15)],
 <function TorsorClassGroup.group_structure.<locals>.exp at 0x...>,
 <function TorsorClassGroup.group_structure.<locals>.log at 0x...>)

# from elliptic curve 2184.j1
# 2-descent shows that 2-Selmer group is isomorphic to (Z/2Z)^4
# rank 1, torsion Z/2Z
# Sha[2] is isomorphic to (Z/2Z)^2
# factorisation of conductor: 2^3 * 3 * 7 * 13
# Tamagawa numbers: 1, 1, 1, 2
# so the only bad prime should be 13
sage: A = FiniteFlatAlgebra(QQ, [x, x, x^2 - 42])
sage: Phi = Matrix([[1/4, 1/4, 1/2, 0],
....:               [1/4, 1/4, -1/2, 0],
....:               [1/2, -1/2, 0, 0],
....:               [0, 0, 0, 42]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([13])
sage: B, gens, exp, log = H.group_structure()
sage: B
Multiplicative Abelian group isomorphic to C2 x C2 x C2 x C2
sage: exp(B.gen(0))
Torsor defined by ((Fractional ideal (1), Fractional ideal (1), Fractional ideal (1)), 13*e0 + 13*e1 + 13*e2 + 13*e4 + 13*e5 - 13*e6 + 13*e8 - 13*e9 + 1/42*e15)
sage: log(gens[1])
f1
sage: log(exp(B.gen(3))) == B.gen(3)
True
one()

Return the unit element of self.

EXAMPLES:

sage: from dual_pairs import DualPair, FiniteFlatAlgebra
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x])
sage: Phi = 1/2 * Matrix([[1, 1], [1, -1]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([])
sage: H.one()
Torsor defined by ((Fractional ideal (1), Fractional ideal (1)), e0 + e1 + e2 + e3)
order()

Return the order of self.

EXAMPLES:

sage: from dual_pairs import DualPair, FiniteFlatAlgebra
sage: R.<x> = QQ[]
sage: A = FiniteFlatAlgebra(QQ, [x, x])
sage: Phi = 1/2 * Matrix([[1, 1], [1, -1]])
sage: D = DualPair(A, Phi)
sage: H = D.torsor_class_group([])
sage: H.order()
2