diff --git a/test.ecm b/test.ecm index e7b7469d6103fc0ba1d0f20e88aa82d8a5bffe4a..eff5ab57fe76a11ad81a7ac2b32a1e61c00a9a56 100755 --- a/test.ecm +++ b/test.ecm @@ -858,7 +858,7 @@ echo 2432902008176640001 | $ECM -torsion Z3xZ3 -sigma 3 1e5; checkcode $? 14 echo 2432902008176640001 | $ECM -torsion Z3xZ3 -sigma -3 1e5; checkcode $? 14 ## found factor in Z3xZ3 (D) echo 171523 | $ECM -torsion Z3xZ3 -sigma 11 1e5; checkcode $? 6 -## D^3=1 => singluar curve +## D^3=1 => singular curve echo 217 | $ECM -torsion Z3xZ3 -sigma 11 1e5; checkcode $? 1 ##### Z3xZ6 ## found factor in Step 1 diff --git a/torsions.c b/torsions.c index af0ce7deb25c55d41a83daeb2d423dde3b1f252f..3408ea40ece9a2b3ccaafc760e60bfbf8e3ba7e1 100644 --- a/torsions.c +++ b/torsions.c @@ -258,6 +258,8 @@ build_curves_with_torsion_Z5(mpz_t f, mpmod_t n, mpz_init(y0); mpz_init(c); mpz_init(tmp); + ell_curve_init(tE[nc], ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE, n); + ell_point_init(tP[nc], tE[nc], n); for(s = smin; s < smax; s++){ mpz_set_si(x0, s); /* c:=1/2*x0*(4*x0+1)/(3*x0+1); */ @@ -290,10 +292,8 @@ build_curves_with_torsion_Z5(mpz_t f, mpmod_t n, ret = ECM_ERROR; break; } - ell_curve_init(tE[nc], ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE,n); mpz_set(tE[nc]->a4, A); mpz_set(tE[nc]->a6, B); - ell_point_init(tP[nc], tE[nc], n); mpz_set(tP[nc]->x, X); mpz_set(tP[nc]->y, Y); nc++; @@ -450,6 +450,8 @@ build_curves_with_torsion_Z7(mpz_t fac, mpmod_t n, mpz_init(kx0); mpz_init(ky0); ell_point_init(Q, E, n); + ell_curve_init(tE[nc], ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE, n); + ell_point_init(tP[nc], tE[nc], n); mpz_set_si(d, umin-1); if(ell_point_mul(fac, Q, d, P, E, n) == 0){ printf("found factor during init of Q in Z7\n"); @@ -505,10 +507,8 @@ build_curves_with_torsion_Z7(mpz_t fac, mpmod_t n, ret = ECM_ERROR; break; } - ell_curve_init(tE[nc], ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE,n); mpz_set(tE[nc]->a4, A); mpz_set(tE[nc]->a6, B); - ell_point_init(tP[nc], tE[nc], n); mpz_set(tP[nc]->x, X); mpz_set(tP[nc]->y, Y); #if DEBUG_TORSION >= 2 @@ -583,6 +583,8 @@ build_curves_with_torsion_Z9(mpz_t fac, mpmod_t n, ell_curve_t *tE, mpz_init(kx0); mpz_init(ky0); ell_point_init(Q, E, n); + ell_curve_init(tE[nc], ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE, n); + ell_point_init(tP[nc], tE[nc], n); mpz_set_si(d, umin-1); if(ell_point_mul(fac, Q, d, P, E, n) == 0){ printf("found factor during init of Q in Z9\n"); @@ -650,10 +652,8 @@ build_curves_with_torsion_Z9(mpz_t fac, mpmod_t n, ell_curve_t *tE, ret = ECM_ERROR; break; } - ell_curve_init(tE[nc], ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE, n); mpz_set(tE[nc]->a4, A); mpz_set(tE[nc]->a6, B); - ell_point_init(tP[nc], tE[nc], n); mpz_set(tP[nc]->x, X); mpz_set(tP[nc]->y, Y); nc++; @@ -718,6 +718,8 @@ build_curves_with_torsion_Z10(mpz_t fac, mpmod_t n, ell_curve_t *tE, mpz_init(kx0); mpz_init(ky0); ell_point_init(Q, E, n); + ell_curve_init(tE[nc], ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE, n); + ell_point_init(tP[nc], tE[nc], n); for(u = umin; u < umax; u++){ if(forbidden("Z10", u)) continue; @@ -791,10 +793,8 @@ build_curves_with_torsion_Z10(mpz_t fac, mpmod_t n, ell_curve_t *tE, ret = ECM_ERROR; break; } - ell_curve_init(tE[nc], ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE, n); mpz_set(tE[nc]->a4, A); mpz_set(tE[nc]->a6, B); - ell_point_init(tP[nc], tE[nc], n); mpz_set(tP[nc]->x, X); mpz_set(tP[nc]->y, Y); nc++; @@ -855,6 +855,10 @@ build_curves_with_torsion_Z2xZ8(mpz_t fac, mpmod_t n, mpz_init(wx0); mpz_init(mb); + /* to Montgomery form */ + ell_curve_init(tE[nc], ECM_EC_TYPE_MONTGOMERY, ECM_LAW_HOMOGENEOUS,n); + ell_point_init(tP[nc], tE[nc], n); + /* Eaux = [-8, -32] */ /* Paux = [12, 40, 1] */ mpres_init(tmp2, n); @@ -1012,9 +1016,6 @@ build_curves_with_torsion_Z2xZ8(mpz_t fac, mpmod_t n, mpz_mul(tmp, d, d); mpz_mul_si(tmp, tmp, 4); #endif - /* to Montgomery form */ - ell_curve_init(tE[nc], ECM_EC_TYPE_MONTGOMERY, ECM_LAW_HOMOGENEOUS,n); - ell_point_init(tP[nc], tE[nc], n); /* this cannot yield a factor, since d is invertible at that point */ mod_from_rat2(tE[nc]->a2, fac, tmp, n->orig_modulus); /* not really needed, but useful for debug */ @@ -1082,6 +1083,8 @@ build_curves_with_torsion_Z3xZ3(mpz_t f, mpmod_t n, mpz_init(den); mpz_init(D); mpz_init_set_si(v0, umin-1); /* to prevent u0 = v0 */ + ell_curve_init_set(tE[nc],ECM_EC_TYPE_HESSIAN,ECM_LAW_HOMOGENEOUS,D,n); + ell_point_init(tP[nc], tE[nc], n); for(u = umin; u < umax; u++){ if(forbidden("Z3xZ3", u)) continue; @@ -1111,12 +1114,10 @@ build_curves_with_torsion_Z3xZ3(mpz_t f, mpmod_t n, mpz_mul(num, num, D); mpz_mod(num, num, n->orig_modulus); if(mpz_cmp_ui(num, 1) == 0){ - printf("D^3=1 => singluar curve\n"); + printf("D^3=1 => singular curve\n"); ret = ECM_ERROR; break; } - ell_curve_init_set(tE[nc],ECM_EC_TYPE_HESSIAN,ECM_LAW_HOMOGENEOUS,D,n); - ell_point_init(tP[nc], tE[nc], n); mpz_set(tP[nc]->x, u0); mpz_set(tP[nc]->y, v0); mpz_set_ui(tP[nc]->z, 1); @@ -1155,6 +1156,8 @@ build_curves_with_torsion_Z3xZ6(mpz_t f, mpmod_t n, mpres_set_ui(tmp, 0, n); ell_curve_init_set(E, ECM_EC_TYPE_WEIERSTRASS, ECM_LAW_AFFINE, tmp, n); ell_point_init(P, E, n); + ell_curve_init(tE[nc], ECM_EC_TYPE_HESSIAN, ECM_LAW_HOMOGENEOUS, n); + ell_point_init(tP[nc], tE[nc], n); mpz_set_str(f, "2", 10); mpres_set_z(P->x, f, n); mpz_set_str(f, "2", 10); @@ -1201,8 +1204,6 @@ build_curves_with_torsion_Z3xZ6(mpz_t f, mpmod_t n, mpz_mod(num, num, n->orig_modulus); mpz_mul_si(den, den, 3); mpz_mod(den, den, n->orig_modulus); - ell_curve_init(tE[nc], ECM_EC_TYPE_HESSIAN, ECM_LAW_HOMOGENEOUS, n); - ell_point_init(tP[nc], tE[nc], n); if(mod_from_rat2(tE[nc]->a4, num, den, n->orig_modulus) == 0){ /* only if t = 0, which seems hard */ printf("found factor in Z3xZ6 (D)\n"); @@ -1262,6 +1263,9 @@ build_curves_with_torsion_Z4xZ4(mpz_t f, mpmod_t n, ell_curve_t *tE, mpz_init(tmp); mpz_init(b); mpz_init(x0); + /* to Montgomery form */ + ell_curve_init(tE[nc], ECM_EC_TYPE_MONTGOMERY, ECM_LAW_HOMOGENEOUS, n); + ell_point_init(tP[nc], tE[nc], n); for(nu = smin; nu < smax; nu++){ mpz_set_si(nu2, nu*nu); /* tau:=(nu^2+3)/2/nu; */ @@ -1303,9 +1307,6 @@ build_curves_with_torsion_Z4xZ4(mpz_t f, mpmod_t n, ell_curve_t *tE, mpz_add_si(tmp, x0, 2); mpz_mul_si(tmp, tmp, -2); mpz_mod(tmp, tmp, n->orig_modulus); - /* to Montgomery form */ - ell_curve_init(tE[nc], ECM_EC_TYPE_MONTGOMERY, ECM_LAW_HOMOGENEOUS, n); - ell_point_init(tP[nc], tE[nc], n); mod_from_rat2(tE[nc]->a4, tmp, x0, n->orig_modulus); /* now compute real x0 */ /* x0:=3*(3*nu^12+34*nu^10+117*nu^8+316*nu^6+1053*nu^4+2754*nu^2+2187); */ @@ -1381,7 +1382,7 @@ build_curves_with_torsion(mpz_t f, mpmod_t n, ell_curve_t *tE, ell_point_t *tP, return build_curves_with_torsion_Z4xZ4(f, n, tE, tP, smin, smax, nE); else{ printf("Unknown torsion group: %s\n", torsion); - ret = ECM_ERROR; + ret = ECM_USER_ERROR; } return ret; } @@ -1414,8 +1415,11 @@ build_curves_with_torsion2(mpz_t f, mpz_t n, ell_curve_t E, mpz_set(x, tP[0]->x); mpz_set(y, tP[0]->y); } - ell_point_clear (tP[0], tE[0], modulus); - ell_curve_clear (tE[0], modulus); + if (ret != ECM_USER_ERROR) // torsion group is known + { + ell_point_clear (tP[0], tE[0], modulus); + ell_curve_clear (tE[0], modulus); + } mpmod_clear (modulus); return ret; }