Existe o que você deseja alcançar, existe realidade e, às vezes, eles estão em conflito. Primeiro, verifique se o seu problema é um caso especial que pode ser resolvido mais rapidamente, por exemplo, uma matriz esparsa. Então você procura algoritmos mais rápidos; A decomposição da LU terminará um pouco mais rápida. Em seguida, você investiga o que Strassen pode fazer por você (o que não é muito; pode economizar 1/2 das operações se você multiplicar o tamanho do problema por 32).
E então você usa força bruta. Use um sistema multiprocessador com vários threads. Use unidades vetoriais disponíveis. Organize seus dados e operações para serem compatíveis com o cache. Investigue qual é a maneira mais rápida de fazer cálculos no módulo p para alguns p fixos. E você pode salvar operações com frequência, não realizando as operações módulo p (resultado no intervalo 0 ≤ resultado <p), mas um pouco mais relaxado (por exemplo, resultado no intervalo -p <resultado <p).