Number of Elliptic Curves over Fp

cryptographyelliptic-curvesfinite-fields

I am a beginner/amateur in the topic

according to https://www.math.brown.edu/~jhs/Presentations/WyomingEllipticCurve.pdf on page 45,

There are approximately 2p different elliptic curves defined over $F_p$.

On SAGE, I tried to enumerate elliptic curves over $F_5$ looking at all curves $Y^2 = X^3 + iX+j$ with a non-null discriminant $\Delta = 4i^3 + 27j^2$

> p = 5 Fp = FiniteField(p)
  R = IntegerModRing(p) 
  A = matrix(R, p, p, lambda i,j: 4*i*i*i+27*j*j)
> L= [] 
> for i in range(p): 
>     for j in range(p):
>         if A[i,j]!=0 :
>            E = EllipticCurve(Fp,[i,j])
>            L.append(E.points()) 
> S = list (set(L))
> S

and i get 20 answers

[[(0 : 0 : 1), (0 : 1 : 0)],
 [(0 : 1 : 0), (0 : 2 : 1), (0 : 3 : 1), (2 : 1 : 1), (2 : 4 : 1), (4 : 1 : 1), (4 : 4 : 1)],
 [(0 : 1 : 0), (3 : 1 : 1), (3 : 4 : 1)],
 [(0 : 1 : 0), (0 : 1 : 1), (0 : 4 : 1), (2 : 1 : 1), (2 : 4 : 1), (3 : 1 : 1), (3 : 4 : 1), (4 : 2 : 1), (4 : 3 : 1)],
 [(0 : 1 : 0), (2 : 0 : 1), (3 : 2 : 1), (3 : 3 : 1), (4 : 1 : 1), (4 : 4 : 1)],
 [(0 : 1 : 0), (3 : 2 : 1), (3 : 3 : 1), (4 : 2 : 1), (4 : 3 : 1)],
 [(0 : 1 : 0), (0 : 1 : 1), (0 : 4 : 1), (1 : 1 : 1), (1 : 4 : 1), (3 : 0 : 1), (4 : 1 : 1), (4 : 4 : 1)],
 [(0 : 1 : 0), (0 : 1 : 1), (0 : 4 : 1), (2 : 2 : 1), (2 : 3 : 1), (4 : 0 : 1)],
 [(0 : 1 : 0), (0 : 2 : 1), (0 : 3 : 1), (1 : 2 : 1), (1 : 3 : 1), (2 : 0 : 1), (4 : 2 : 1), (4 : 3 : 1)],
 [(0 : 1 : 0), (1 : 2 : 1), (1 : 3 : 1), (2 : 1 : 1), (2 : 4 : 1), (3 : 0 : 1)],
 [(0 : 0 : 1), (0 : 1 : 0), (1 : 2 : 1), (1 : 3 : 1), (2 : 2 : 1), (2 : 3 : 1), (3 : 1 : 1), (3 : 4 : 1), (4 : 1 : 1), (4 : 4 : 1)],
 [(0 : 1 : 0), (0 : 2 : 1), (0 : 3 : 1), (1 : 1 : 1), (1 : 4 : 1), (2 : 2 : 1), (2 : 3 : 1), (3 : 2 : 1), (3 : 3 : 1)],
 [(0 : 1 : 0), (1 : 0 : 1), (4 : 1 : 1), (4 : 4 : 1)],
 [(0 : 0 : 1), (0 : 1 : 0), (1 : 0 : 1), (2 : 1 : 1), (2 : 4 : 1), (3 : 2 : 1), (3 : 3 : 1), (4 : 0 : 1)],
 [(0 : 1 : 0), (0 : 2 : 1), (0 : 3 : 1), (1 : 0 : 1), (3 : 1 : 1), (3 : 4 : 1)],
 [(0 : 1 : 0), (1 : 2 : 1), (1 : 3 : 1), (4 : 0 : 1)],
 [(0 : 1 : 0), (2 : 2 : 1), (2 : 3 : 1)],
 [(0 : 1 : 0), (0 : 1 : 1), (0 : 4 : 1), (1 : 2 : 1), (1 : 3 : 1), (3 : 2 : 1), (3 : 3 : 1)],
 [(0 : 0 : 1), (0 : 1 : 0), (2 : 0 : 1), (3 : 0 : 1)],
 [(0 : 1 : 0), (1 : 1 : 1), (1 : 4 : 1), (2 : 1 : 1), (2 : 4 : 1)]]

have i done something wrong ? or am I missing something ?
According to Silverman i was expecting around 2×5 = 10 different curves. are some identifiable by some symmetry ? i can see there are indeed pairs of curves with the same number of points but they don't really look obviously the same to me, nor can i see an obvious relationship between the coefficients of those having the same number of points.

Best Answer

Elliptic curves over an algebraically closed field are isomorphic if and only if they have the same $j$-invariant, so computing the $j$-invariants will tell you when two curves are not isomorphic at least (if the $j$-invariants are different!)

Over a non-algebraically closed field elliptic curves of fixed $j$-invariant (not equal to 0, 1728) are all quadratic twists of each other, that is there exists $D\in \mathbf F_p^\times$ s.t. $E_1\cong E_2^{(D)}$, where the $D$th quadratic twist is defined by $$y^2 = x^3 + ax +b \mapsto Dy^2 = x^3 +ax+b$$ this is short Weierstrass form, so lets use $p\ne 2,3$, the quadratic twist is isomorphic to the original curve when $D$ is a square. For a finite field the group $\mathbf F_p^\times/(\mathbf F_p^\times)^2 \cong C_2$, there every non-square differs from each other by a square, so there is only one possible quadratic twist of each elliptic curve, which is not isomorphic to the original, this is what gives us that there are roughly $2p$ curves, excluding $0, 1728$ we have $\approx p-2$ $j$-invariants, each of which gives two non-isomorphic quadratic twists over $\mathbf F_p$.

In Sage you can use the .is_quadratic_twist method of an elliptic curve to check if two curves are quadratic twists, and .is_isomorphic to check isomorphism. You can also find the twisted curves using .quadratic_twist.

Using these methods you can reduce your list down to the exact number of curves, or build up the complete list starting from the set of all $j$-invariants.

Note that when $j = 0,1728$ this is more complicated as you also get sextic and quartic twists!