проблема с модом и обратным модулем в Shamir Secret Sharing - PullRequest
0 голосов
/ 08 ноября 2019

У меня проблема с разделением по модулю, я не знаю, почему заданы неправильные параметры

Ошибка C2660: inverse_modulo не принимает 2 аргумента C ++

Ошибка C2660: мод непринять 2 аргумента C ++

int inverse_modulo(int a, int p, int is, int ij)
{
    a = mod(is - ij, p);
    //a = a % p;
    for (int x = 1; x < p; x++)
        if ((a * x) %p == 1)
            return x;
}

int mod(int is, int ij, int p) {
    long  x = 1, y = ij;
    while (ij > 0) {
        if (ij % 2 == 1) {
            x = (x * y) % p; 
        }
        y = (y * y) % p; 
        ij /= 2;
    }
    return x % p;
}


int getSecret(std::vector<int> ids, std::vector<int> ms, int p) {
    start = clock();
    auto sum = 0;
    auto i = 0;
    for (auto is : ids) {
        auto prod = ms[i];
        for (auto ij : ids) {
            if (is == ij)
                continue;
            prod *= mod(is, -ij, p);
            prod *= inverse_modulo(mod(is - ij, p), p);
        }
        sum += prod;
        i++;
    }
    auto M = mod(sum, p);
    return M;
}```

1 Ответ

0 голосов
/ 08 ноября 2019

Ваша int mod функция принимает 3 аргумента:

  1. int is
  2. int ij
  3. int p

Вы, однако, называете его меньше, чем (то есть самая первая строка в inverse_modulo теле):

a = mod(is - ij, p);

Аргументы должны быть разделены ',' (* запятая * тысяча двадцать один) * * тысяча двадцать-два. Поэтому вы вызываете его только с двумя аргументами:

  1. is - ij - обратите внимание, что вы можете передать целое выражение как один аргумент
  2. p

Если вы хотите передать is, ij и p в качестве аргументов, вы бы вызвали вашу функцию мода следующим образом:

a = mod(is, ij, p);

Аналогичноваш inverse_modulo вызывается с меньшим количеством аргументов, чем необходимо:

prod *= inverse_modulo(mod(is - ij, p), p);
  1. mod(is - ij, p) - что само по себе является ошибкой
  2. p
...