Processing math: 100%
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

answered 6 years ago

dan_fulea gravatar image

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 a60, 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˙4a6=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=x354c6D . Alias y2=x3+a6D66 .

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".