Факторизация Ферма #39;s факторизация в C++

Ради интереса я реализовал некоторые математические штуки на C++, и я пытался реализовать метод факторизации Ферма , однако я не знаю, понимаю ли я, что он должен вернуться. Эта реализация, которая у меня есть, возвращает 105для номера примера 5959, приведенного в статье Википедии.

Псевдокод в Википедии выглядит так:

Пробуют разные значения a, надеясь, что это квадрат.

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)

Моя реализация на C++ выглядит так:

int FermatFactor(int oddNumber)
{
    double a = ceil(sqrt(static_cast(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(a + sqrt(b2));
}

bool compare_doubles(double a, double b)
{
    int diff = std::fabs(a - b);
    return diff < std::numeric_limits::epsilon();
}

Что она должна возвращать? Кажется, просто возвращается a + b, что не является фактором 5959?

РЕДАКТИРОВАТЬ

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(places));
    return cint(r*off)/off;
}

5
задан Tony The Lion 6 May 2012 в 21:00
поделиться