Eu tenho que resolver um sistema de até 10000 equações com 10000 incógnitas o mais rápido possível (de preferência em alguns segundos). Eu sei que a eliminação gaussiana é muito lenta para isso, então qual algoritmo é adequado para esta tarefa?
Todos os coeficientes e constantes são números inteiros não negativos módulo p (onde p é primo). É garantido que haja apenas 1 solução. Eu preciso da solução módulo p.
fonte
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).
fonte
A melhor maneira de resolver grandes equações lineares é usar paralelização ou, de alguma forma, distribuir cálculos entre CPUs ou algo assim.
Consulte CUDA, OpenCL, OpenMP.
Muitas pessoas sugerem,
Strassen's algorithm
mas ela tem uma constante oculta muito grande, o que a torna ineficiente.A propósito: suas equações lineares podem ser muito esparsas (muitos zeros), existem poucas otimizações muito claras para resolvê-las em paralelo.
fonte