PointRef PointCreateInvert(PointRef p, CurveRef curve) { if (PointIsTeta(p)) return PointCreateTeta(); PointRef q = PointCopy(p); // P = (xp, yp) // -P = (xp, - yp - a1.xp - a3) mpz_t mon; // mon = a1.xp mpz_init_set(mon, curve->a[1]); mpz_mul(mon, mon, q->x); mpz_mod(mon, mon, curve->mod); // yp = -yp mpz_neg(q->y, q->y); mpz_mod(q->y, q->y, curve->mod); // yp = -yp - a1.xp mpz_sub(q->y, q->y, mon); mpz_mod(q->y, q->y, curve->mod); // yp = -yp - a1.xp - a3 mpz_sub(q->y, q->y, curve->a[3]); mpz_mod(q->y, q->y, curve->mod); mpz_clear(mon); return q; }
void test_point() { int ndim = 5; int i; double diff; int retval = 0; printf("\nTesting points\n"); struct Point* p1 = PointAlloc(ndim); struct Point* p2 = PointAlloc(ndim); struct Point* p3; for (i=0; i<p1->x->size; i++) { p1->x->data[i] = (double) i; p2->x->data[i] = (double) 2*i; printf("p1->x->data[%d]: %lf\n", i, p1->x->data[i]); printf("p2->x->data[%d]: %lf\n", i, p2->x->data[i]); } if (PointEqual(p1,p2)) { printf("Points are equal\n"); } else { printf("Points differ\n"); } diff = PointDist(p1,p2); if (diff < 0.0) { retval = 1; } else { printf("diff: %lf\n", diff); } printf("copying Points\n"); PointCopy(p2,p1); if (PointEqual(p1,p2)) { printf("Points are equal\n"); } else { printf("Points differ\n"); } // this would fail //PointEqual(p1,p3); PointFree(p1); PointFree(p2); }