void primes_init(QS_t * qs_inf) { unsigned long bits = qs_inf->bits; // set bits to the number of bits of kn qs_inf->num_primes = num_FB_primes(bits); qs_inf->factor_base = (prime_t *) flint_stack_alloc_bytes(qs_inf->num_primes*sizeof(prime_t)); }
/*=========================================================================== Compute Prime Sizes: Function: Computes the size in bits of each prime in the factor base ===========================================================================*/ void compute_sizes(QS_t * qs_inf) { unsigned long num_primes = qs_inf->num_primes; qs_inf->sizes = (unsigned char *) flint_stack_alloc_bytes(num_primes); unsigned char * sizes = qs_inf->sizes; prime_t * factor_base = qs_inf->factor_base; for (unsigned long i = 0; i < num_primes; i++) { sizes[i] = (unsigned char) round(log(factor_base[i].p)/log(2.0)); } return; }
void poly_init(QS_t * qs_inf, poly_t * poly_inf, mpz_t N) { unsigned long num_primes = qs_inf->num_primes; unsigned long s = (qs_inf->bits-1)/28+1; if (s <= 2) s = 3; prime_t * factor_base = qs_inf->factor_base; unsigned long fact_approx, fact, span; unsigned long sieve_size = qs_inf->sieve_size; unsigned long small_primes = qs_inf->small_primes; long min; poly_inf->s = s; poly_inf->B = (unsigned long*) flint_stack_alloc(qs_inf->prec+1); poly_inf->B_terms = (unsigned long*) flint_stack_alloc(s*(qs_inf->prec+1)); poly_inf->A = (unsigned long*) flint_stack_alloc(qs_inf->prec+1); poly_inf->target_A = (unsigned long*) flint_stack_alloc(qs_inf->prec+1); poly_inf->A_ind = (unsigned long*) flint_stack_alloc(s); poly_inf->A_modp = (unsigned long*) flint_stack_alloc(s); poly_inf->A_inv2B = (uint32_t**) flint_stack_alloc(s); poly_inf->inv_p2 = (double*) flint_stack_alloc_bytes(s*sizeof(double)); poly_inf->A_inv = (uint32_t *) flint_stack_alloc_bytes(num_primes*sizeof(uint32_t)); poly_inf->soln1 = (uint32_t *) flint_stack_alloc_bytes(num_primes*sizeof(uint32_t)); poly_inf->soln2 = (uint32_t *) flint_stack_alloc_bytes(num_primes*sizeof(uint32_t)); poly_inf->posn1 = (uint32_t *) flint_stack_alloc_bytes(num_primes*sizeof(uint32_t)); poly_inf->posn2 = (uint32_t *) flint_stack_alloc_bytes(num_primes*sizeof(uint32_t)); uint32_t ** A_inv2B = poly_inf->A_inv2B; A_inv2B[0] = (uint32_t *) flint_stack_alloc_bytes(num_primes*s*sizeof(uint32_t)); mpz_init(poly_inf->A_mpz); mpz_init(poly_inf->B_mpz); mpz_init(poly_inf->C); for (unsigned long i = 1; i < s; i++) { A_inv2B[i] = A_inv2B[i-1] + num_primes; } mpz_t temp; mpz_init(temp); mpz_mul_ui(temp, N, 2*qs_inf->k); mpz_sqrt(temp, temp); mpz_div_ui(temp, temp, 47*sieve_size/100); mpz_to_fmpz(poly_inf->target_A, temp); mpz_root(temp, temp, s); fact_approx = mpz_get_ui(temp); for (fact = 0; fact_approx >= factor_base[fact].p; fact++); span = num_primes/s/s/2; if (span < 6*s) span = 6*s; min = fact - span/2; if (min < (long) small_primes) min = small_primes; if (min + span >= qs_inf->num_primes - 1) span = num_primes - min - 1; fact = min + span/2; #if POLY_PARAMS printf("min = FB[%ld], span = %ld, number of factors = %ld\n", min, span, s); #endif poly_inf->min = min; poly_inf->fact = fact; poly_inf->span = span; mpz_clear(temp); }
void sqrts_init(QS_t * qs_inf) { qs_inf->sqrts = (uint32_t *) flint_stack_alloc_bytes(qs_inf->num_primes*sizeof(uint32_t)); }
void tiny_sqrts_init(QS_t * qs_inf) { qs_inf->sqrts = (uint32_t *) flint_stack_alloc_bytes(sizeof(uint32_t)*qs_inf->num_primes); }
void tiny_poly_init(QS_t * qs_inf, poly_t * poly_inf, mpz_t N) { unsigned long num_primes = qs_inf->num_primes; unsigned long s = (qs_inf->bits-1)/28+1; if (s <= 2) s = 3; prime_t * factor_base = qs_inf->factor_base; unsigned long fact_approx, fact, span; long min; poly_inf->s = s; poly_inf->B_terms = (unsigned long*) flint_stack_alloc(s); poly_inf->A_ind = (unsigned long*) flint_stack_alloc(s); poly_inf->A_modp = (unsigned long*) flint_stack_alloc(s); poly_inf->A_inv2B = (unsigned long**) flint_stack_alloc(s); poly_inf->inv_p2 = (double*) flint_stack_alloc_bytes(s*sizeof(double)); poly_inf->A_inv = (unsigned long*) flint_stack_alloc(num_primes); poly_inf->soln1 = (unsigned long*) flint_stack_alloc(num_primes); poly_inf->soln2 = (unsigned long*) flint_stack_alloc(num_primes); unsigned long ** A_inv2B = poly_inf->A_inv2B; A_inv2B[0] = (unsigned long *) flint_stack_alloc(num_primes*s); mpz_init(poly_inf->C); unsigned long i; for (i = 1; i < s; i++) { A_inv2B[i] = A_inv2B[i-1] + num_primes; } mpz_t temp; mpz_init(temp); mpz_mul_ui(temp, N, 2*qs_inf->k); mpz_sqrt(temp, temp); mpz_div_ui(temp, temp, 300); poly_inf->target_A = mpz_get_ui(temp); mpz_root(temp, temp, s); fact_approx = mpz_get_ui(temp); for (fact = 0; fact_approx >= factor_base[fact].p; fact++); span = num_primes/s/s/2; if (span < 6*s) span = 6*s; min = fact - span/2; if (min < SMALL_PRIMES) min = SMALL_PRIMES; if (min + span >= num_primes - 1) span = num_primes - min - 1; fact = min + span/2; #if POLY_PARAMS printf("num_primes = %ld, min = FB[%ld], span = %ld, number of factors = %ld\n", num_primes, min, span, s); #endif poly_inf->min = min; poly_inf->fact = fact; poly_inf->span = span; mpz_clear(temp); }