Реализация алгоритма Полига — Хеллмана

353
18 декабря 2017, 14:47

Алгоритм Полига — Хеллмана

Пытаюсь реализовать по примеру.

Получается такой код:

#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, считаю, но как его правильно, ни как не могу понять. Помогите пожалуйста.

READ ALSO
Проблема с перезагрузкой оператора

Проблема с перезагрузкой оператора

Пишу очередь с приоритетомНеобходимо перегрузить оператор +, но наталкиваюсь на ошибку: "Вызвано исключение: нарушение доступа для чтения

214
Как хранить матрицу [требует правки]

Как хранить матрицу [требует правки]

Вопрос такой: как лучше произвольную(самую обычную) хранить матрицу? В виде массива указателей или цельным вектором?

228
На входе 0.16e-4 , на выходе 1.6e-05 Почему?

На входе 0.16e-4 , на выходе 1.6e-05 Почему?

// ConsoleApplication5cpp: определяет точку входа для консольного приложения

277