Я работаю с криптографией на основе эллиптических кривых и пытаюсь получить значение из моего уравнения ECC. Я использую функцию, передающую x, и пытаюсь зациклить код, пока не получу значение для y в форме целого числа. В качестве заголовка, обратите внимание, что я также использую независимую библиотеку под названием InfInt (которая обрабатывает большие значения Integer).
По сути, моя цель состоит в том, чтобы найти x, которое при включении в уравнение y ^ 2 = x ^ 3 + x + 24 даст мне y, который не является десятичным числом. У меня много проблем с получением правильных результатов. Есть ли решение, как я подхожу к этой проблеме?
КОД В ГЛАВНОМ ______________________________________________________________
// создаем семя, которое нам нужно для «истинных» случайных х
srand (время (NULL));
//TEST PROMPT for getting a random point
int x = rand();
cout << ("Given x: ") << (x) << endl <<endl;
InfInt y;
int i = 0;
//TEST to get an exact point, not a decimal value
//while (i == 0) {
y = getPoint(x);
if (y == NULL) {
cout << ("Bad X") << endl;
x = rand();
cout << ("Next Attempt at x :") << (x) << endl;
}
else {
cout << ("Success!") << endl;
cout << ("Our point is: (") << (x) << (",") << (y) << (")") << endl;
i++;
}
//}
ПОЛУЧИТЬ КОД ТОЧКИ ______________________________________________________________
InfInt getPoint (int x) {
double xx = pow(x, 3) + x + 24;
xx = sqrt(xx);
cout << (xx) << endl;
if (xx == int(xx)) {
y = int(xx);
} else {
cout << ("Failed!");
y = NULL;
}
return InfInt(y);
}
Выберите цель, скажем, у = 3; y ^ 2 = 9. Найдите значение x, x1, которое дает результат y1 <= 3. Найдите второе значение x, x2, которое дает результат y2> = 3. Учитывая, что ваше уравнение непрерывно, тогда ваше целевое значение x будет между x1 и x2. Используйте бинарный поиск, чтобы найти ближайшее значение x в пределах реальных значений, разрешенных на вашем компьютере.
В качестве альтернативы, попробуйте разные x1 и x2, пока не найдете пару с хотя бы одним целым числом между ними.
Учитывая практические ограничения представления действительных чисел на конечном компьютере, вы можете найти решение, которое работает только с ограниченным числом знаков после запятой: y = 3.0000000000120694 … или чем-то еще
Других решений пока нет …