# Compute elements of n-torsion group of elliptic curve over finite field Suppose $F_q$ is a prime field and $E/F_q$ is an elliptic curve over that field with order $k= n\cdot ...$ and assume that $E$ has embedding degree $l$. Then the $n$-torsion group of $E$ is in $F_{q^l}$. Now assume that $n$ and $l$ are reasonably small, such that the $n$-torsion group contains only a few elements and can be listed.

How can I compute that group and list the elements?

edit retag close merge delete

1

Ideally, provide an example of defining all the pieces to get to the actual question.

Ok, then take say $E$ to be defined over $F_{43}$ by $y^2=x^3+6$. This is a very simple BLS6 curve (hence has embedding degree 6). It has a prime oder subgroup of order 13 and I want to list the entire 13-torsion.

Sort by » oldest newest most voted

The following worked for me:

sage: E = EllipticCurve(GF(43), [0, 6])
....: [P.xy() for P in E if P.order() == 13]
....:
[(13, 15),
(13, 28),
(26, 9),
(26, 34),
(27, 9),
(27, 34),
(33, 9),
(33, 34),
(35, 15),
(35, 28),
(38, 15),
(38, 28)]


Also a slightly bigger case:

sage: E = EllipticCurve(GF(2027), [0, 1])
....: [P.xy() for P in E if P.order() == 13]
[(155, 48),
(155, 1979),
(579, 647),
(579, 1380),
(1304, 910),
(1304, 1117),
(1584, 379),
(1584, 1648),
(1732, 836),
(1732, 1191),
(1819, 992),
(1819, 1035)]


For a "much bigger curve" (i.e. with more rational points) some improvements are necessary. For instance:

p = (3*10^7).next_prime()
E = EllipticCurve(GF(p), [0, 4])
ord = E.order()
print(f'E is the following curve:\n{E}')
print(f'E has order {ord} = {ord.factor()}')
print(f'E has the generator(s): {E.gens()}')


We get the following information on E:

E is the following curve:
Elliptic Curve defined by y^2 = x^3 + 4 over Finite Field of size 30000001
E has order 30010071 = 3 * 7 * 13 * 37 * 2971
E has the generator(s): ((14044277 : 14356696 : 1),)


Now

[P.xy() for P in E if P.order() == 13]


takes a looong time. But we can immediately get the elements of order $13$ as follows:

G = E.gens()    # we already know there is one generator of order <ord>
n = ZZ(ord/13)
Q = n*G
[(k*Q).xy() for k in [1..12]]


This gives:

[(28289013, 19261067),
(11842435, 11155846),
(26389003, 19261067),
(5321986, 10738934),
(15676831, 11155846),
(2480735, 11155846),
(2480735, 18844155),
(15676831, 18844155),
(5321986, 19261067),
(26389003, 10738934),
(11842435, 18844155),
(28289013, 10738934)]


Check:

sage: E( (2480735, 18844155) ).order()
13

more