In order to get the implemented algorithm for a specific method, it is always a good idea to instantiate some object with the corresponding method, then to ask in the ipython sage interpreter what it is, and/or which code does it work behind. In our case, using a simpler field, 19 elements only, i did first the following:
F = GF(13)
E = EllipticCurve( F, [0,1] )
D = F(2)
E.sextic_twist?
Then, by the last line, we obtain the usual doc string of the method, in this case:
sage: F = GF(13)
....: E = EllipticCurve( F, [0,1] )
....: D = F(2)
....: E.sextic_twist?
....:
Signature: E.sextic_twist(D)
Docstring:
Return the quartic twist of this curve by D.
INPUT:
* "D" (must be nonzero) -- the twisting parameter..
Note: The characteristic must not be 2 or 3, and the j-invariant
must be 0.
EXAMPLES:
sage: E=EllipticCurve_from_j(GF(13)(0)); E
Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 13
sage: E1=E.sextic_twist(2); E1
Elliptic Curve defined by y^2 = x^3 + 11 over Finite Field of size 13
sage: E.is_isomorphic(E1)
False
sage: E.is_isomorphic(E1,GF(13^2,'a'))
False
sage: E.is_isomorphic(E1,GF(13^4,'a'))
False
sage: E.is_isomorphic(E1,GF(13^6,'a'))
True
Init docstring: x.__init__(...) initializes x; see help(type(x)) for signature
File: /usr/lib/python2.7/site-packages/sage/schemes/elliptic_curves/ell_field.py
Type: instancemethod
sage:
Of course, already in this example there are some questions about the way it works, i was alo expecting to pass from E
to "an E1
", which has a 2, not the 11 as free coefficient, so why do we get y2=x3+11 as the 2--twist?
For this i wanted to see also the code computing the story. This is obtained by asking for
sage: E.sextic_twist??
instead of sage: E.sextic_twist?
, and it delivers in our case, after the doc string part:
K=self.base_ring()
char=K.characteristic()
D=K(D)
if char==2 or char==3:
raise ValueError("Sextic twist not defined in chars 2,3")
if self.j_invariant() !=K(0):
raise ValueError("Sextic twist not defined when j!=0")
if D.is_zero():
raise ValueError("Sextic twist requires a nonzero argument")
c4,c6=self.c_invariants()
# E is isomorphic to [0,0,0,0,-54*c6]
assert c4==0
return EllipticCurve(K,[0,0,0,0,-54*c6*D])
File: /usr/lib/python2.7/site-packages/sage/schemes/elliptic_curves/ell_field.py
Type: instancemethod
(END)
Oh, so the way it works is as follows. We start with the elliptic curve given by
y2=x3+1 , over F13 .
Now the code computes its
c4, c6
invariants! There are formulas for the passage from the
a's, to the
b's, then to the
c'c, in our case we pass as follows ...
sage: E
Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 13
sage: E.a_invariants()
(0, 0, 0, 0, 1)
sage: E.b_invariants()
(0, 0, 4, 0)
sage: E.c_invariants()
(0, 7)
The formulas are as folllows. We start with a-invariants, so that only a6≠0, all other invariants are zero.
Then we compute b2,b4,b6,b8, for us is interesting only
b6=4a6 .
Then we associate
c6=−216b6=−216˙4⋅a6=−864a6 .
And indeed:
sage: -864*F(1)
7
We consider now our "twist" (multiplication) of c6=7 with 2,
this is 14=−1 (in F13) and the code is then passing to the curve
y2=x3−54⋅c6⋅D .
Alias
y2=x3+a6⋅D⋅66 .
We get an equivalent twist, since
sage: 4*(-216)*(-54)
46656
sage: _.factor()
2^6 * 3^6
is a sixtth power, the sixth power of 6, so the twisted number D is "twisted itself", leading to an other isomorphic curve.
Finally, let us compare the implemented method with the obvious ad-hoc method implementing the twist:
F = GF(19)
G = F.unit_group()
print "F = %s" % F
print "G = units(F) has as elements those from the list\n%s" % str( G.list() )
print "G^6 has as elements...\n%s" % str( Set( [ g^6 for g in G.list() ] ) )
E = EllipticCurve( F, [0,1] )
print "Let E be the curve: %s" % E
for k in F:
if k == F(0):
continue
E1 = E.sextic_twist( k )
E2 = E.sextic_twist( k/6^6 )
E3 = EllipticCurve( F, [0,k] )
print "k = %s" % k
print "E1 = E.sextic_twist( %s ) = %s" % ( k, E1 )
print "E2 = E.sextic_twist( %s/6^6 ) = %s" % ( k, E2 )
print "E3 = EllipticCurve( F, [0,%s] ) = %s" % ( k, E3 )
print "Is E1 ~ E2? %s" % bool( E1.is_isomorphic( E2 ) )
print "Is E2 = E3? %s" % bool( E2 == E3 )
print
And the results are:
F = Finite Field of size 19
G = units(F) has as elements those from the list
(1, f, f^2, f^3, f^4, f^5, f^6, f^7, f^8, f^9, f^10, f^11, f^12, f^13, f^14, f^15, f^16, f^17)
G^6 has as elements...
{f^6, f^12, 1}
Let E be the curve: Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 19
k = 1
E1 = E.sextic_twist( 1 ) = Elliptic Curve defined by y^2 = x^3 + 11 over Finite Field of size 19
E2 = E.sextic_twist( 1/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 19
E3 = EllipticCurve( F, [0,1] ) = Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 2
E1 = E.sextic_twist( 2 ) = Elliptic Curve defined by y^2 = x^3 + 3 over Finite Field of size 19
E2 = E.sextic_twist( 2/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 2 over Finite Field of size 19
E3 = EllipticCurve( F, [0,2] ) = Elliptic Curve defined by y^2 = x^3 + 2 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 3
E1 = E.sextic_twist( 3 ) = Elliptic Curve defined by y^2 = x^3 + 14 over Finite Field of size 19
E2 = E.sextic_twist( 3/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 3 over Finite Field of size 19
E3 = EllipticCurve( F, [0,3] ) = Elliptic Curve defined by y^2 = x^3 + 3 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 4
E1 = E.sextic_twist( 4 ) = Elliptic Curve defined by y^2 = x^3 + 6 over Finite Field of size 19
E2 = E.sextic_twist( 4/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 4 over Finite Field of size 19
E3 = EllipticCurve( F, [0,4] ) = Elliptic Curve defined by y^2 = x^3 + 4 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 5
E1 = E.sextic_twist( 5 ) = Elliptic Curve defined by y^2 = x^3 + 17 over Finite Field of size 19
E2 = E.sextic_twist( 5/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 5 over Finite Field of size 19
E3 = EllipticCurve( F, [0,5] ) = Elliptic Curve defined by y^2 = x^3 + 5 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 6
E1 = E.sextic_twist( 6 ) = Elliptic Curve defined by y^2 = x^3 + 9 over Finite Field of size 19
E2 = E.sextic_twist( 6/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 6 over Finite Field of size 19
E3 = EllipticCurve( F, [0,6] ) = Elliptic Curve defined by y^2 = x^3 + 6 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 7
E1 = E.sextic_twist( 7 ) = Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 19
E2 = E.sextic_twist( 7/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 7 over Finite Field of size 19
E3 = EllipticCurve( F, [0,7] ) = Elliptic Curve defined by y^2 = x^3 + 7 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 8
E1 = E.sextic_twist( 8 ) = Elliptic Curve defined by y^2 = x^3 + 12 over Finite Field of size 19
E2 = E.sextic_twist( 8/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 8 over Finite Field of size 19
E3 = EllipticCurve( F, [0,8] ) = Elliptic Curve defined by y^2 = x^3 + 8 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 9
E1 = E.sextic_twist( 9 ) = Elliptic Curve defined by y^2 = x^3 + 4 over Finite Field of size 19
E2 = E.sextic_twist( 9/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 9 over Finite Field of size 19
E3 = EllipticCurve( F, [0,9] ) = Elliptic Curve defined by y^2 = x^3 + 9 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 10
E1 = E.sextic_twist( 10 ) = Elliptic Curve defined by y^2 = x^3 + 15 over Finite Field of size 19
E2 = E.sextic_twist( 10/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 10 over Finite Field of size 19
E3 = EllipticCurve( F, [0,10] ) = Elliptic Curve defined by y^2 = x^3 + 10 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 11
E1 = E.sextic_twist( 11 ) = Elliptic Curve defined by y^2 = x^3 + 7 over Finite Field of size 19
E2 = E.sextic_twist( 11/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 11 over Finite Field of size 19
E3 = EllipticCurve( F, [0,11] ) = Elliptic Curve defined by y^2 = x^3 + 11 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 12
E1 = E.sextic_twist( 12 ) = Elliptic Curve defined by y^2 = x^3 + 18 over Finite Field of size 19
E2 = E.sextic_twist( 12/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 12 over Finite Field of size 19
E3 = EllipticCurve( F, [0,12] ) = Elliptic Curve defined by y^2 = x^3 + 12 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 13
E1 = E.sextic_twist( 13 ) = Elliptic Curve defined by y^2 = x^3 + 10 over Finite Field of size 19
E2 = E.sextic_twist( 13/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 13 over Finite Field of size 19
E3 = EllipticCurve( F, [0,13] ) = Elliptic Curve defined by y^2 = x^3 + 13 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 14
E1 = E.sextic_twist( 14 ) = Elliptic Curve defined by y^2 = x^3 + 2 over Finite Field of size 19
E2 = E.sextic_twist( 14/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 14 over Finite Field of size 19
E3 = EllipticCurve( F, [0,14] ) = Elliptic Curve defined by y^2 = x^3 + 14 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 15
E1 = E.sextic_twist( 15 ) = Elliptic Curve defined by y^2 = x^3 + 13 over Finite Field of size 19
E2 = E.sextic_twist( 15/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 15 over Finite Field of size 19
E3 = EllipticCurve( F, [0,15] ) = Elliptic Curve defined by y^2 = x^3 + 15 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 16
E1 = E.sextic_twist( 16 ) = Elliptic Curve defined by y^2 = x^3 + 5 over Finite Field of size 19
E2 = E.sextic_twist( 16/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 16 over Finite Field of size 19
E3 = EllipticCurve( F, [0,16] ) = Elliptic Curve defined by y^2 = x^3 + 16 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 17
E1 = E.sextic_twist( 17 ) = Elliptic Curve defined by y^2 = x^3 + 16 over Finite Field of size 19
E2 = E.sextic_twist( 17/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 17 over Finite Field of size 19
E3 = EllipticCurve( F, [0,17] ) = Elliptic Curve defined by y^2 = x^3 + 17 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
k = 18
E1 = E.sextic_twist( 18 ) = Elliptic Curve defined by y^2 = x^3 + 8 over Finite Field of size 19
E2 = E.sextic_twist( 18/6^6 ) = Elliptic Curve defined by y^2 = x^3 + 18 over Finite Field of size 19
E3 = EllipticCurve( F, [0,18] ) = Elliptic Curve defined by y^2 = x^3 + 18 over Finite Field of size 19
Is E1 ~ E2? True
Is E2 = E3? True
I hope this explains the "twisted behavior" of the `sextic_twist".