aboutsummaryrefslogtreecommitdiff
path: root/src/math/curve.c
diff options
context:
space:
mode:
authorJ08nY2017-02-14 21:20:08 +0100
committerJ08nY2017-02-14 21:20:08 +0100
commit39c6155e0193ff69dcdf765e936487bfcf4f1b17 (patch)
tree93230b214c64951ded6451f439f304ccca02b7e0 /src/math/curve.c
parent0c5ff628d52678bb44b9c595daf1289833d0e532 (diff)
downloadecgen-39c6155e0193ff69dcdf765e936487bfcf4f1b17.tar.gz
ecgen-39c6155e0193ff69dcdf765e936487bfcf4f1b17.tar.zst
ecgen-39c6155e0193ff69dcdf765e936487bfcf4f1b17.zip
Diffstat (limited to 'src/math/curve.c')
-rw-r--r--src/math/curve.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/src/math/curve.c b/src/math/curve.c
index 57f46e6..2ff3d8f 100644
--- a/src/math/curve.c
+++ b/src/math/curve.c
@@ -5,8 +5,9 @@
#include "curve.h"
#include "exhaustive/seed.h"
#include "field.h"
+#include "point.h"
-curve_t *curve_new() {
+curve_t *curve_new(void) {
curve_t *curve = pari_malloc(sizeof(curve_t));
if (!curve) {
perror("Couldn't malloc.");
@@ -16,10 +17,29 @@ curve_t *curve_new() {
return curve;
}
+curve_t *curve_copy(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);
+ if (src->b) dest->b = gcopy(src->b);
+ if (src->curve) dest->curve = gcopy(src->curve);
+ if (src->order) dest->order = gcopy(src->order);
+ if (src->points) {
+ dest->points = points_new(src->npoints);
+ dest->points = points_copy(src->points, dest->points, src->npoints);
+ dest->npoints = src->npoints;
+ }
+}
+
void curve_free(curve_t **curve) {
if (*curve) {
seed_free(&(*curve)->seed);
- pari_free((*curve)->points);
+ if ((*curve)->points) {
+ for (size_t i = 0; i < (*curve)->npoints; ++i) {
+ point_free(&(*curve)->points[i]);
+ }
+ points_free(&(*curve)->points);
+ }
pari_free(*curve);
*curve = NULL;
}
@@ -82,6 +102,15 @@ GEN curve_params(curve_t *curve) {
if (curve->a) result = gconcat(result, field_elementi(curve->a));
if (curve->b) result = gconcat(result, field_elementi(curve->b));
if (curve->order) result = gconcat(result, gtovec(curve->order));
+ if (curve->points) {
+ for (size_t i = 0; i < curve->npoints; ++i) {
+ GEN point =
+ gconcat(field_elementi(gel(curve->points[i]->point, 1)),
+ field_elementi(gel(curve->points[i]->point, 2)));
+ result = gconcat(result, point);
+ result = gconcat(result, curve->points[i]->order);
+ }
+ }
return gerepilecopy(ltop, result);
}