Зачем хранить все эти промежуточные значения? Вам действительно не нужно помещать x и y в массив. Просто используйте 2 переменные, которые вы продолжаете использовать, x
и y
.
Также замените while(1)
на while(d == 1)
и обрежьте цикл до
if(d!= 1 && d!=n)
std::cout <<d<<std::endl;
if(i+1==k){
y = x[i];
k = 2*k;
Таким образом, ваш цикл должен стать
while(d == 1)
{
x = (x*x - 1) % n;
y = (y*y - 1) % n;
y = (y*y - 1) % n;
d = abs(gcd(y-x,n))%n;
}
if(d!=n)
std::cout <<d<<std::endl;
else
std::cout<<"Can't find result with this function \n";
Дополнительные точки, если вы передаете функцию, используемую в цикле в качестве параметра, pollard
, поэтому, если он не может найти результат с одной функцией, он пытается другую.