Ошибки при компиляции с библиотекой boost

272
15 февраля 2018, 15:29

Не могу понять в чем проблема. В код смотришь, ошибок нигде нет, они появляются при компиляции.

Код:

vector<vector<mp::cpp_int>> gauss(mp::cpp_int **a, mp::cpp_int *y, mp::cpp_int n, mp::cpp_int p)
{
    //mp::cpp_int **mas = new mp::cpp_int *[n];
    vector<vector<mp::cpp_int>> mas(n.convert_to<size_t>());
    mp::cpp_int *x, max = -1;
    int k, index;
    mp::cpp_int s = 0; //предыдущще гцд
    mp::cpp_int rez = 0; //сумарное гцд
    mp::cpp_int w = 0;//для подсчета гцд
    mp::cpp_int ost = 0; //ответы для дерева
    bool check = true;
    bool new_check = true;
    mp::cpp_int gcd;
    //x = new mp::cpp_int[n];
    k = 0;
    while (k < n - 1)
    {
        // Поиск строки с обратным элементом
        index = k;
        for (int i = k; i < n&& check; i++)
        {
            if (ReverseElement(abs(a[i][k]), p) != -1)
            {
                max = abs(a[i][k]);
                index = i;
                check = false;
            }
        }
        //если нет обратного элемента
        if (max == -1)
        {
            // Поиск строки с максимальным a[i][k]
            max = abs(a[k][k]);
            index = k;
            for (int i = k + 1; i < n; i++)
            {
                if (abs(a[i][k]) > max)
                {
                    max = abs(a[i][k]);
                    index = i;
                }
            }
            // Перестановка строк
            for (int j = 0; j < n; j++)
            {
                mp::cpp_int temp = a[k][j];
                a[k][j] = a[index][j];
                a[index][j] = temp;
            }
            mp::cpp_int temp = y[k];
            y[k] = y[index];
            y[index] = temp;
            for (int i = k + 1; i < n; i++)
            {
                mp::cpp_int temp = a[i][k];
                if (abs(temp) < 0) continue; // для нулевого коэффициента пропустить
                for (int j = k; j < n; j++)
                {
                    a[i][j] = mp::cpp_int(max*a[i][j] - a[k][j] * temp) % p;
                    if (a[i][j] < 0)
                        do {
                            a[i][j] += p;
                        } while (a[i][j] < 0);
                }
                y[i] = mp::cpp_int(max*y[i] - y[k] * temp) % p;
                if (y[i] < 0)
                    do {
                        y[i] += p;
                    } while (y[i] < 0);
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                    std::cout << a[i][j] << " ";
                std::cout << y[i];
                std::cout << endl;
            }
        }
        //если существует обратный элемент
        else
        {
            for (int j = 0; j < n; j++)
            {
                mp::cpp_int temp = a[k][j];
                a[k][j] = a[index][j];
                a[index][j] = temp;
            }
            mp::cpp_int temp = y[k];
            y[k] = y[index];
            y[index] = temp;

            for (int i = 0; i < n; i++)
                a[k][i] = mp::cpp_int(a[k][i] * ReverseElement(max, p)) % p;
            y[k] = mp::cpp_int(y[k] * ReverseElement(max, p)) % p;

            // Нормализация уравнений
            for (int i = k + 1; i < n; i++)
            {
                mp::cpp_int temp = a[i][k];
                if (abs(a[i][k]) < 0) continue; // для нулевого коэффициента пропустить
                for (int j = k; j < n; j++)
                {
                    a[i][j] = mp::cpp_int(a[i][j] - temp * a[k][j]) % p;
                    if (a[i][j] < 0)
                        do {
                            a[i][j] += p;
                        } while (a[i][j] < 0);
                }
                y[i] = mp::cpp_int(y[i] - temp*y[k]) % p;
                if (y[i] < 0)
                    do {
                        y[i] += p;
                    } while (y[i] < 0);
            }
        }
        k++;
        max = -1;
        check = true;
    }
    // обратная подстановка
    for (k = int(n - 1); k >= 0; k--)
    {
        gcd = NOD(a[k][k], p);
        rez = gcd*s;
        if (k == n - 1)
        {
            mas[k] = vector<mp::cpp_int>(gcd);
            for (int i = 0; i < gcd; i++)
                mas[k][i] = y[k] / gcd*ReverseElement(a[k][k] / gcd, p / gcd) % (p / gcd) + i*(p / gcd);
        }
        else
        {
            mas[k] = vector<mp::cpp_int>(rez.convert_to<size_t>());
            for (int i = 0; i < rez; i++)
            {
                ost = y[k];
                for (int r = int(n - 1); r > k; r--)
                {
                    ost -= a[k][r] * mas[r][int(i / (rez / mas[r].size()))] % p;
                }
                if (ost < 0)
                    ost += p;
                mas[k][i] = ost / gcd*ReverseElement(a[k][k] / gcd, p / gcd) % (p / gcd) + w*(p / gcd);
                if (mas[k][i] < 0)
                    mas[k][i] += p;
                w++;
                if (w >= gcd)
                    w = 0;
            }
        }
        s = mas[k].size();
    }
    return mas;
}

Если закоментить после слов обратная подстановка, то все работает.Если убрать boost библиотеку, то все работает, а вот с ней ошибки:

enable_if::result_type,detail::expression::result_type>,bool>::type boost::multiprecision::operator >(const boost::multiprecision::detail::expression &,const boost::multiprecision::detail::expression &): не удалось вывести аргумент шаблон для "const boost::multiprecision::detail::expression &" из "const next_type"

Вторая ошибка:

bool std::operator >(const std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &): не удалось вывести аргумент шаблон для "const std::move_iterator<_RanIt> &" из "const next_type"

Из-за чего это?

Answer 1

В коде Вы используете cpp_int с буста (видимо, чтобы работать с большими числами). А потом, к примеру, пытаетесь создать вектор размера, который задается переменной такого типа... вектор точно не сможет так. Мне было достаточно исправить всего пару строк:

  • заменить _int64 на int64_t (это видимо с студии)
  • изменить void main на int main (это известный глюк студии)
  • mas[k] = vector<mp::cpp_int>(gcd); заменить на mas[k] = vector<mp::cpp_int>(gcd.convert_to<size_t>()); (это оказалось ключевым)
  • убрать system("pause");

После этого все скомпилилось и даже что-то вывело (x=639669654)

READ ALSO
осортировать слова по алфавиту (с++)

осортировать слова по алфавиту (с++)

Вводится последовательность слов (обязательно string) до встречи слова "stop" (Количество слов НЕ более 10)Вывести в алфавитном порядке

211
поиск подстроки без цифр

поиск подстроки без цифр

Дан строковый массив из n элементов, где n – натуральное числоНайти в этом массиве самую длинную подстроку, не содержащую цифры

248
QFileDialog стандартная папка

QFileDialog стандартная папка

Как задать при вызове QFileDialog стандартную папку, которая должна показываться?

224
Как найти фамилию и номер из контактов?

Как найти фамилию и номер из контактов?

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

186