Алгоритм Полига — Хеллмана
Пытаюсь реализовать по примеру.
Получается такой код:
#include <iostream>
#include <math.h>
using namespace std;
int powmod(int a, int b, int m) {
int res = 1;
while (b > 0)
if (b & 1) {
res = (res * a) % m;
--b;
}
else {
a = (a * a) % m;
b >>= 1;
}
return res % m;
}
int algorith(int a, int b, int p)
{
int p1;
int q;
int z=0;
int m;
int x = 0;
p1 = sqrt(p - 1);
z = 13*powmod(3, 17 - 1 - pow(2,2), p);
q = powmod(b, (p - 1) / 2, p) - p;
if (q == 1)
q = 0;
else q = 1;
x = q;
for (int i = 1; i < p1; i++)
{
if (i == 1)
z = b*powmod(a, p - 1 - q, p) % p;
else
z = z*powmod(a, p - 1 - q - pow(2, i - 1), p) % p;
if (z > 0)
z -= p;
else z += p;
m = (p - 1) / pow(2, i + 1);
q = powmod(b, (p - 1) / 2, p) - p;
if (q == 1)
q = 0;
else q = 1;
x += q * pow(2, i);
}
return x;
}
void main()
{
cout<<algorith(3, 11, 17);
system("pause");
}
POWMOD нужен для возведения числа по модулю.Проходит все по примеру, но на последнем этапе должно быть z3=1, а у меня z3=15.
В чем ошибка?
Я наверное не правильно этот z, считаю, но как его правильно, ни как не могу понять. Помогите пожалуйста.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Пишу очередь с приоритетомНеобходимо перегрузить оператор +, но наталкиваюсь на ошибку: "Вызвано исключение: нарушение доступа для чтения
Совсем запутался с этими кодеками
Вопрос такой: как лучше произвольную(самую обычную) хранить матрицу? В виде массива указателей или цельным вектором?
// ConsoleApplication5cpp: определяет точку входа для консольного приложения