aboutsummaryrefslogtreecommitdiff
path: root/src/math/curve.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/math/curve.c')
-rw-r--r--src/math/curve.c68
1 files changed, 56 insertions, 12 deletions
diff --git a/src/math/curve.c b/src/math/curve.c
index 7b74556..0d4cd12 100644
--- a/src/math/curve.c
+++ b/src/math/curve.c
@@ -18,7 +18,7 @@ curve_t *curve_new(void) {
return curve;
}
-curve_t *curve_copy(curve_t *src, curve_t *dest) {
+curve_t *curve_copy(const curve_t *src, curve_t *dest) {
if (src->seed) dest->seed = seed_copy(src->seed, dest->seed);
if (src->field) dest->field = gcopy(src->field);
if (src->a) dest->a = gcopy(src->a);
@@ -26,25 +26,69 @@ curve_t *curve_copy(curve_t *src, curve_t *dest) {
if (src->curve) dest->curve = gcopy(src->curve);
if (src->order) dest->order = gcopy(src->order);
if (src->generators) {
- dest->generators = points_new(src->ngens);
- dest->generators =
- points_copy(src->generators, dest->generators, src->ngens);
+ dest->generators = points_new_copy(src->generators, src->ngens);
dest->ngens = src->ngens;
}
if (src->points) {
- dest->points = points_new(src->npoints);
- dest->points = points_copy(src->points, dest->points, src->npoints);
+ dest->points = points_new_copy(src->points, src->npoints);
dest->npoints = src->npoints;
}
return dest;
}
+curve_t *curve_new_copy(const curve_t *src) {
+ curve_t *result = curve_new();
+ return curve_copy(src, result);
+}
+
+curve_t *curve_clone(const curve_t *src, curve_t *dest) {
+ if (src->seed) dest->seed = seed_clone(src->seed, dest->seed);
+ if (src->field) dest->field = gclone(src->field);
+ if (src->a) dest->a = gclone(src->a);
+ if (src->b) dest->b = gclone(src->b);
+ if (src->curve) dest->curve = gclone(src->curve);
+ if (src->order) dest->order = gclone(src->order);
+ if (src->generators) {
+ dest->generators = points_new_clone(src->generators, src->ngens);
+ dest->ngens = src->ngens;
+ }
+ if (src->points) {
+ dest->points = points_new_clone(src->points, src->npoints);
+ dest->npoints = src->npoints;
+ }
+ return dest;
+}
+
+curve_t *curve_new_clone(const curve_t *src) {
+ curve_t *result = curve_new();
+ return curve_clone(src, result);
+}
+
void curve_free(curve_t **curve) {
if (*curve) {
seed_free(&(*curve)->seed);
+
if ((*curve)->curve) {
+ // TODO, this is possibly dangerous...
obj_free((*curve)->curve);
+ if (isclone((*curve)->curve)) {
+ gunclone((*curve)->curve);
+ }
+ }
+
+ if ((*curve)->field && isclone((*curve)->field)) {
+ gunclone((*curve)->field);
+ }
+ if ((*curve)->a && isclone((*curve)->a)) {
+ gunclone((*curve)->a);
+ }
+ if ((*curve)->b && isclone((*curve)->b)) {
+ gunclone((*curve)->b);
}
+ if ((*curve)->order && isclone((*curve)->order)) {
+ gunclone((*curve)->order);
+ }
+
points_free_deep(&(*curve)->generators, (*curve)->ngens);
points_free_deep(&(*curve)->points, (*curve)->npoints);
pari_free(*curve);
@@ -52,7 +96,7 @@ void curve_free(curve_t **curve) {
}
}
-int curve_any(curve_t *curve, config_t *cfg, arg_t *args) {
+int curve_any(curve_t *curve, const config_t *cfg, arg_t *args) {
pari_sp ltop = avma;
GEN v = gen_0;
switch (typ(curve->field)) {
@@ -75,7 +119,7 @@ int curve_any(curve_t *curve, config_t *cfg, arg_t *args) {
return 1;
}
-int curve_nonzero(curve_t *curve, config_t *cfg, arg_t *args) {
+int curve_nonzero(curve_t *curve, const config_t *cfg, arg_t *args) {
pari_sp ltop = avma;
curve_any(curve, cfg, args);
if (gequal0(ell_get_disc(curve->curve))) {
@@ -86,17 +130,17 @@ int curve_nonzero(curve_t *curve, config_t *cfg, arg_t *args) {
}
}
-static int curve_seed_fp(curve_t *curve, config_t *cfg, arg_t *args) {
+static int curve_seed_fp(curve_t *curve, const config_t *cfg, arg_t *args) {
// TODO implement
return INT_MIN;
}
-static int curve_seed_f2m(curve_t *curve, config_t *cfg, arg_t *args) {
+static int curve_seed_f2m(curve_t *curve, const config_t *cfg, arg_t *args) {
// TODO implement
return INT_MIN;
}
-int curve_seed(curve_t *curve, config_t *cfg, arg_t *args) {
+int curve_seed(curve_t *curve, const config_t *cfg, arg_t *args) {
switch (typ(curve->field)) {
case t_INT:
return curve_seed_fp(curve, cfg, args);
@@ -108,7 +152,7 @@ int curve_seed(curve_t *curve, config_t *cfg, arg_t *args) {
}
}
-GEN curve_params(curve_t *curve) {
+GEN curve_params(const curve_t *curve) {
pari_sp ltop = avma;
GEN result = field_params(curve->field);