Por diversión, he estado implementando algunas cosas de matemáticas en C++, y he estado intentando implementar Fermats Factorisation Method, sin embargo, no sé si entiendo lo que se supone que debe devolver. Esta implementación que tengo, devuelve 105
para el número de ejemplo 5959 dado en el artículo de Wikipedia.Factorización de Fermat en C++
El pseudocódigo en Wikipedia se parece a esto:
Uno trata de varios valores de a, la esperanza de que es un cuadrado.
FermatFactor(N): // N should be odd
a → ceil(sqrt(N))
b2 → a*a - N
while b2 isn't a square:
a → a + 1 // equivalently: b2 → b2 + 2*a + 1
b2 → a*a - N // a → a + 1
endwhile
return a - sqrt(b2) // or a + sqrt(b2)
Mi C++ aplicación, el siguiente aspecto:
int FermatFactor(int oddNumber)
{
double a = ceil(sqrt(static_cast<double>(oddNumber)));
double b2 = a*a - oddNumber;
std::cout << "B2: " << b2 << "a: " << a << std::endl;
double tmp = sqrt(b2);
tmp = round(tmp,1);
while (compare_doubles(tmp*tmp, b2)) //does this line look correct?
{
a = a + 1;
b2 = a*a - oddNumber;
std::cout << "B2: " << b2 << "a: " << a << std::endl;
tmp = sqrt(b2);
tmp = round(tmp,1);
}
return static_cast<int>(a + sqrt(b2));
}
bool compare_doubles(double a, double b)
{
int diff = std::fabs(a - b);
return diff < std::numeric_limits<double>::epsilon();
}
¿Qué se supone para volver? Parece que solo está devolviendo a + b
, que no son los factores de 5959
?
EDITAR
double cint(double x){
double tmp = 0.0;
if (modf(x,&tmp)>=.5)
return x>=0?ceil(x):floor(x);
else
return x<0?ceil(x):floor(x);
}
double round(double r,unsigned places){
double off=pow(10,static_cast<double>(places));
return cint(r*off)/off;
}
'static_cast (b2)'? ¿Hay alguna razón que esté ahí? ¿Cómo se define 'compare_doubles'? –
jli
@jli 'b2' era un' int' en mi implementación anterior, permítame cambiarlo, no tiene más motivo de existir –
Usaría tipos enteros para 'tmp' y' b2'. Para que las pruebas pasen, necesitas una raíz cuadrada entera de 'b2' de todos modos. De hecho, una implementación con ints para todas las variables locales devuelve 101. :) – vhallac