День добрый. Ниже вы видете код, который по моему замыслу должен находить простой делитель от введенного числа n по алгоритму Ферма. О том как работает алгоритм можно почитать в "Введение в теорию чисел Алгоритм RSA", главы 2-8 сего труда на www.cryptography.ru Вот сам код: Код (Text): #include <iostream> #include <math.h> using namespace std; int main() { int n = 0; int x = 0; double y = 0; cout << "\nEnter number: "; cin >> n; if(!(n % 2)) // все числа с делимостью на 2, разложимы { cout << "\nPrime devisor: 2\n"; return 0; } // Step 1. x = (int)sqrt(n); if(n == (x*x)) // для случаев подобных: - 3^2=9 { cout << "\nPrime devisor: " << x << "\n"; } // Step 2. else { x++; while(true) { if(x == (n+1)/2) { cout << "\nPrime devisor: " << x << "\n"; break; } else { //Step 3. y = sqrt((x*x)-n); if(!(y-(int)y)) // дробно ли число y? { cout << "\nPrime devisor: " << y << "\n"; break; } x++; } } } return 0; } [\code] я испытываю сложность в отладке шагов 2 и 3. Просьба: Если не трудно ткуть носом: где я допускаю ошибки? А ошибки есть, т.к. на простое число 19 программа находит "делитель" 10!
Если не трудно выложи исходный код прям в сообщение... Мне не позволяют почему то скачать приложенные файлики
Я когда-то разбирался с этим методом, код рабочий: Код (Text): int sq_root (int n) { return (int) sqrt (n + .0); } template <class T, class T2> T ferma (const T & n, T2 unused) { T2 x = sq_root (n), y = 0, r = x*x - y*y - n; for (;;) if (r == 0) return x!=y ? x-y : x+y; else if (r > 0) { r -= y+y+1; ++y; } else { r += x+x+1; ++x; } }