Не могу понять в чем проблема. В код смотришь, ошибок нигде нет, они появляются при компиляции.
Код:
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"
Из-за чего это?
В коде Вы используете 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)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Вводится последовательность слов (обязательно string) до встречи слова "stop" (Количество слов НЕ более 10)Вывести в алфавитном порядке
Дан строковый массив из n элементов, где n – натуральное числоНайти в этом массиве самую длинную подстроку, не содержащую цифры
Как задать при вызове QFileDialog стандартную папку, которая должна показываться?
Моя задача состоит в том чтобы получить имя фамилию и номер телефона абонентаВот так я получаю все значения, кроме фамилии