Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
Arquivo: test.c Projeto: esheldon/misc
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);

}