#include #include #include "add.h" #define eps 1e-16 // Вычисление минимума, максимума и модуля от ЦЕЛОГО числа // ВАЖНО: Не путать с fmax и т.д, а то снова всё ДЗ улетит в FPE... int max(int a, int b) { if (a>=b) return a; else return b; } int min(int a, int b) { if (a<=b) return a; else return b; } int abs(int a) { if (a>=0) return 0; else return -a; } // Вычисление элемента матрицы // k - номер формулы, n, m - размеры матрицы, i, j - индексы элемента // Значения k=5 и k=6 не описаны в условиях и нужны исключительно для большего количества тестов double f(int k, int n, int m, int i, int j) { i=i+1; j=j+1; if (k==1) { return max(n,m)-max(i,j)+1; } else if (k==2) { return max(i,j); } else if (k==3) { return abs(i-j); } // Матрица Гильберта else if (k==4) { return 1.0/(i+j-1); } // Эксперименты с другими матрицами // Матрица Лемера else if (k==5) { return (min(i,j))*1.0/max(i,j); } // Матрица Редхеффера else if (k==6) { if (j==1 || j%i==0) return 1; else return 0; } else return 0; } // Чтение матрицы // A - массив выделенный под матрицу, n, m - размеры матрицы, name - имя файла io_status read_matrix(restrict mat A, int n, int m, char* name) { FILE* f=fopen(name, "rt"); if (!f) return ERROR_OPEN; for (int i=0; inorm) norm=sum; } return norm; } // Элементарное преобразование для метода Гаусса // A - квадратная матрица, n - ее размер, k - номер строки // ВАЖНО: предполагается, что элемент A[k*n+k] уже выбран ненулевым // ВАЖНО: предполагается, что элементы, стоящие левее A[k*n+k], уже являются нулевыми void divide_row(restrict mat A, int n, int k) { double el=A[k*n+k]; for (int i=k+1; imx) { res=i; mx=tmp; } } return res; } void subtract_row(restrict mat A, int n, int a, int b) { double el=A[a*n+b]; for (int i=b+1; i