In redu2.c, the GGNFS/Franke siever uses

double in the variant of the code that is used by practically everyone. However, the

very latest version has the gmp mpz_t version:

int reduce2(i32_t*,i32_t*,i32_t*,i32_t*,i64_t,i64_t,i64_t,i64_t,double);
int reduce2gmp(i64_t*,i64_t*,i64_t*,i64_t*,mpz_t,mpz_t,double);
Code:

@ Note that we dont use lattice reduction to organize sieving with the factor
base primes which are larger than the line length. Instead, we use a method
based on the relation with continued fractions and diophantine approximations.
Therefore, the code contained in this file is not time crtitical.
@(redu2.h@>=
int reduce2(i32_t*,i32_t*,i32_t*,i32_t*,i64_t,i64_t,i64_t,i64_t,double);
int reduce2gmp(i64_t*,i64_t*,i64_t*,i64_t*,mpz_t,mpz_t,double);
@ This is done in the straigthforward way. A basis is given by
the fifth to eighth argument (|a0|,|b0|), (|a1|,|b1|). The
reduced basis is written to the addresses given by the first four arguments.
The ninth argument will often be larger than 1 an punishes large |b|.
As a safeguard against numerical instability, the scalar products
are recalculated from the modified vectors after each reduction step and
not updated in a way which would save multiplications. Note again that this
function is not likely time critical for lattice sieving.
The scalar products of the two vector with themselves are called
|a0sq| and |a1sq|. Their scalar product is called |s|.