Помогите,пожалуйста.
Не могу разобраться в алгоритме. Понял его так (если не прав, поправьте):
0)нужно разложить число n.
1)выбираем кривую, точку.
2)задаем В С, высчитываем к.
3)умножаем точку Р на к по модулю: кР mod n
4)в результате получеам либо конечную точку, либо бесконечность...
5)если точка конечная - задаем другую прямую, если бесконечность - то нашли делитель. Где он? Как мы вообще находим делитель?
Написал на си функцию сложения точек в классе Dot ( Dot задается х,у и а-коэффициентом кривой):
Код:
bool Add(int x2, int y2, int mod)
{
if (x2==0 && y2==0)
{
return true;
};
if (x==0 && y==0)
{
x = x2;
y = y2;
return true;
};
if (x==x2 && y!=y2)
{
x=0;
y=0;
return true;
};
if (x==x2 && y==y2)
{
int temp;
int x1 = x;
temp = Antonim(2*y,mod);
x = ( (3*x1*x1+a)*temp*(3*x1*x1+a)*temp - 2*x1 ) % mod;
y = ( ((3*x1*x1+a)*temp)*(x1-x) - y ) % mod;
return true;
}
else
{
int temp;
int x1 = x;
temp = Antonim(x2-x1,mod);
x = ( (y2-y)*temp*(y2-y)*temp - x1 - x2 ) % mod;
y = ( (y2-y)*temp*(x1-x) - y ) % mod;
return true;
};
return false;
};
Считает она, по-видимому, неправильно, т.к.
Код:
Dot dot(1,1,1);
dot.Add(dot.GetX(),dot.GetY(),35);
dot.Add(dot.GetX(),dot.GetY(),35);
и
Код:
Dot dot(1,1,1);
dot.Add(1,1,35);
dot.Add(1,1,35);
dot.Add(1,1,35);
выдают разные результаты. В чем ошибка?