예제 #1
0
파일: cofact.c 프로젝트: pstach/gls
static void pp1_ul64_process(cofact_algo_t *algo, candidate_t **batch, int n_batch)
{
	mod64 n;
	ul64 f, X;
	candidate_t *cand;
	int i;
	pp1_plan_t *plan;
	mpz_t gf;
	double tin, tout;

	plan = (pp1_plan_t *) algo->plan;
	ul64_init(f);
	ul64_init(X);
	mod64_init(n);
	mpz_init(gf);

	tin = dbltime();
	for(i = 0; i < n_batch; i++)
	{
		cand = batch[i];

		mpz_get_ul64(n->n, cand->rem[cand->side]);
		mod64_set(n, n->n);
		ul64_set_ui(X, 0);
		pp1_stage1_ul64(f, X, n, plan);
		if(ul64_cmp_ui(f, 1) != 0 && ul64_cmp(f, n->n) != 0)
		{
			/* factor found in stage1 */
			mpz_set_ul64(gf, f);
#if PRINTF_FACTOR_FOUND
            gmp_printf("pp1s1(64) factor found: %Zd (mod %Zd)\n", gf, cand->rem[cand->side]);
#endif
			candidate_add_factor_mpz(cand, cand->side, gf);
			cofact_next_algo(cand, algo->algo_idx + 1);
			continue;
		}

		pp1_stage2_ul64(f, X, n, &plan->stage2);
		if(ul64_cmp_ui(f, 1) != 0 && ul64_cmp(f, n->n) != 0)
		{
			/* factor found in stage2 */
			mpz_set_ul64(gf, f);
#if PRINTF_FACTOR_FOUND
            gmp_printf("pp1s2(64) factor found: %Zd (mod %Zd)\n", gf, cand->rem[cand->side]);
#endif
			candidate_add_factor_mpz(cand, cand->side, gf);
		}
		cofact_next_algo(cand, algo->algo_idx + 1);
	}
	tout = dbltime();
	pp1_total += (tout - tin);

	mpz_clear(gf);
	mod64_clear(n);
	ul64_clear(X);
	ul64_clear(f);
	return;
}
예제 #2
0
파일: cofact.c 프로젝트: pstach/gls
static void ecm_ul64_process(cofact_algo_t *algo, candidate_t **batch, int n_batch)
{
	mod64 n;
	ul64 f, b;
	ellM64_point_t X;
	candidate_t *cand;
	int i;
	ecm_plan_t *plan;
	mpz_t gf;
	double tin, tout;

	plan = (ecm_plan_t *) algo->plan;
	ul64_init(f);
	ul64_init(b);
	ul64_init(X->x);
	ul64_init(X->z);
	mod64_init(n);
	mpz_init(gf);

	tin = dbltime();
	for(i = 0; i < n_batch; i++)
	{
		cand = batch[i];

		mpz_get_ul64(n->n, cand->rem[cand->side]);
		mod64_set(n, n->n);
		ecm_stage1_ul64(f, X, b, n, plan);
		if(ul64_cmp_ui(f, 1) != 0 && ul64_cmp(f, n->n) != 0)
		{
			/* factor found in stage1 */
			mpz_set_ul64(gf, f);
			candidate_add_factor_mpz(cand, cand->side, gf);
			cofact_next_algo(cand, algo->algo_idx + 1);
			continue;
		}

		ecm_stage2_ul64(f, X, b, n, &plan->stage2);
		if(ul64_cmp_ui(f, 1) != 0 && ul64_cmp(f, n->n) != 0)
		{
			/* factor found in stage2 */
			mpz_set_ul64(gf, f);
			candidate_add_factor_mpz(cand, cand->side, gf);
		}
		cofact_next_algo(cand, algo->algo_idx + 1);
	}
	tout = dbltime();
	ecm_total += (tout - tin);

	mpz_clear(gf);
	mod64_clear(n);
	ul64_clear(X->x);
	ul64_clear(X->z);
	ul64_clear(b);
	ul64_clear(f);
	return;
}
예제 #3
0
void vec_mulmod64_initp(uint64_t p)
{
  mulmod_p = p;
  mod64_init(p);
}