1.
Однозначно заменить массив
tmp_matrix[j] функцией
tmp_matrix(i, j).
2. Раз уж код планируется портировать код на C - победить лень и заменить все вызовы
pow() на явное возведение в квадрат или куб.
3. Не увлекаться делением целого на целое вроде
4/3. Результат может неприятно удивить.
4. Избавиться от ненужных одномерных массивов. Например, забивать целый массив значениями
x[j] = data[4 * j] не есть разумное использование памяти, эти значения вычисляются достаточно эффективно на ходу. Также, если
summands[k],
first_summand[k] и т.п. используются только для вычисления
result[k], их незачем хранить все - вместо массива достаточно одной временной переменной.
5. Воспользовавшись фактом, что матрица
tmp_matrix симметрична, т.е.
tmp_matrix[i][j] == tmp_matrix[j][i], можно сократить объем вычислений почти вдвое.
6. Повыносить инварианты из циклов. Например, во фрагменте
for (i = 0; i < M; i++)
{
summands[k] += pieces[i] * pieces[j] * cos(r[j] * params[k]) * cos(r[i] * params[k]) * sin(params[k] * tmp_matrix[j][i]);
}
можно вычислить инвариантное подвыражение
pieces[j] * cos(r[j] * params[k]) до входа в цикл. Аналогично и в других циклах.
Конечно, правильный оптимизирующий компилятор
должен в принципе выполнить эту оптимизацию самостоятельно, но на компилятор надейся...