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]) до входа в цикл. Аналогично и в других циклах.
Конечно, правильный оптимизирующий компилятор 
должен в принципе выполнить эту оптимизацию самостоятельно, но на компилятор надейся...