### Abelian Group for Elliptic Curve

To produce the abelian group for an elliptic curve.
Given a field, and a conventional elliptic curve in that field, provide the group operation for the abelian group.
`(((fileVal "AGEC") `*field sqrt*) *a b*) returns tools for the Abelian group for that curve.
Here a *point* means a pair of values, <x, y> where x and y are both field elements such that y^{2} = x^{3} + ax + b (the Weierstraß equation).
.
The multiplication and addition in this equation are from the given field.
There is also an honorary point at infinity which serves as the group identity and that we call 0 here.
Together these points form an Abelian (commutative) group defined by the peculiar rule that when three points, A, B, C, are on a line, then A+B+C = 0.
A line is defined by field values a, b and c, not all zero.
For a point <x, y> to be on the line (a, b, c) means that ax+by+c=0.

This is the code which is designed to be used in this framework.

In AG = `(((fileVal "AGEC") `*field sqrt*) *a b*) the argument *field* is a list such as returned by `((fileVal "GFpq") p q st)`.
`sqrt` takes a field value and returns some y such that y^{2} = x modulo the characteristic of the field, if there is one, and returns `'none` otherwise.
AG is a function that maps selected symbols to particular group tools.
`(AG 'add)` is the operation of the Abelian group.
`((AG 'add) `*p q*) returns the curve-sum of the two points p and q.
`(AG 'neg)` is point negation (the group inverse operator),
and `(AG 'mul)` is multiplication of an integer by a point.
`((AG 'mul) `*n p*) yields p added to itself n times where p is a point and n is an integer.
`(AG 'pg)` returns a generator of random points on the curve.
If `(AG 'pg)` is not used then the 2nd argument of `(fileVal "AGEC")` is not used.
Points are either pairs of field values or the integer 0 for the honorary point.

`((fileVal "AGEC") `*field*) yields #f if the characteristic of the field is 2 or 3 and `(((fileVal "AGEC") `*field*) *a b*) yields #f if the discriminant of the curve is zero.
Since I have a square root for GF(p) but not GF(P^{q}) just now we stick to prime fields for now.

For some odd prime p `((fileVal "AGECp") `*p a b*) returns the same tool set as above but for the curve y^{2} = x^{3} + ax + b modulo p.

This is the first reference I have found that describes how the number of points on an elliptic curve over a finite field is found.

elliptic curve