Per divertimento, ho implementato alcune cose di matematica in C++ e ho tentato di implementare Fermats Factorisation Method, tuttavia, non so che capisco cosa dovrebbe restituire. Questa implementazione che ho, restituisce 105
per l'esempio numero 5959 indicato nell'articolo di Wikipedia.Fattorizzazione di Fermat in C++
Il pseudocodice in Wikipedia si presenta così:
Si cerca vari valori di una, sperando che è un quadrato.
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)
mio implementazione C++, simile a questa:
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();
}
Che cosa è supposto per tornare? Sembra che stia appena ritornando a + b
, che non sono i fattori di 5959
?
EDIT
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;
}
'statico_cast (b2)'? C'è una ragione che c'è? Inoltre, come viene definito 'compare_doubles'? –
jli
@jli 'b2' era un' int' sulla mia precedente implementazione, permettetemi di cambiarlo, non ha più ragione di esistere –
Vorrei usare i tipi interi per 'tmp' e' b2'. Affinché i test possano passare, è comunque necessaria una radice quadrata intera di 'b2'. In effetti, un'implementazione con ints per tutte le variabili locali restituisce 101. :) – vhallac