[Next][Prev] [Right] [Left] [Up] [Index] [Root]

Creating a Hyperelliptic Curve from Invariants

The problem is to construct a curve of genus 2 from a given set of Igusa--Clebsch invariants. To construct such a curve we use an algorithm due to Mestre [Mes91] and implemented by P. Gaudry.

The resulting curve's equation can be huge. To reduce it we implemented an algorithm proposed by P. Van Wamelen in [Wam99] and [Wam01]. While this algorithm works (ie. the resulting curve is `small') most of the time, there are instances where very little reduction is achieved. But so far, this is the best we can do.

HyperellipticCurveFromIgusa(S) : SeqEnum -> CrvHyp
Construct a hyperelliptic curve of genus 2 from a set of Igusa-Clebsch invariants (see Subsection Igusa Invariants).
ReduceCurve(C) : CrvHyp -> CrvHyp
Given a curve C of genus 2, attempt to find an isomorphic curve C' such that its coefficients are much smaller than those of C. The algorithm used is due to Van Wamelen [Wam99].
SetVerbose("CrvHypRed", v) : MonStgElt, RngIntElt ->
Set the verbose printing level for the curve-reduction algorithm. Currently the legal values for v are true, false, 0, 1, 2 or 3 (false is the same as 0, and true is the same as 1).

Example CrvHyp_CurveFromIgusa (H86E5)

A typical run would look like:

> ICInv := [ -549600, 8357701824, -1392544870972992, 
>     -3126674637319431000064 ];
> time NC := HyperellipticCurveFromIgusa(ICInv);
a point on the conic is given by 
-6482228378246214658367268283712373600667908099616174719879\
094839597076141357421875/1363791104410093031413327266775768\
84608685729566758228638696307375685615340204945788400368647\
7312, 10188009335968531191794821132584413878133549529657888\
8800450113779781952464580535888671875/107297694738676628355\
43372267236986876862256732919126043768293539723478848063808\
8198395325811565610468983296
Compute the gb
Compute the resultant
Time: 61.920
> time NNC := ReduceCurve(NC);
Time: 148.389
> _, g := DefiningPolynomials(NNC);
> g;
23*x^6 - 52*x^5 + 55*x^4 - 40*x^3 + 161*x^2 - 92*x + 409

 [Next][Prev] [Right] [Left] [Up] [Index] [Root]