Embora eu já tenha aprendido algo sobre os tempos de execução assintóticos dos algoritmos de multiplicação de matrizes (algoritmo de Strassen e coisas semelhantes), nunca encontrei nenhuma referência explícita e satisfatória a um modelo de computação usado para medir essa complexidade. De fato, encontrei três respostas possíveis, nenhuma das quais me parece absolutamente satisfatória:
- A Wikipedia diz que o modelo usado aqui é a Multitape Turing Machine. Isso não parece fazer muito sentido para mim, pois na análise da multiplicação de matrizes, a multiplicação escalar deve ter uma complexidade de tempo constante. Este não é o caso das máquinas de Turing.
- Alguns textos descrevem a complexidade apenas vagamente como o número de operações aritméticas usadas. No entanto, o que exatamente são operações aritméticas neste contexto? Suponho que adição, multiplicação e provavelmente subtração. Mas e quanto à divisão, divisão inteira, restante, etc.? E as operações bit a bit - como elas se encaixam nessa configuração?
- Finalmente, descobri recentemente um artigo, que usa a máquina BSS como modelo de computação. No entanto, isso também me parece um pouco estranho, pois, por exemplo, matrizes inteiras, não faz muito sentido desabilitar operações como, por exemplo, divisão inteira.
Eu ficaria grato a qualquer um que pudesse me ajudar a resolver essas coisas.
Respostas:
Os algoritmos de multiplicação de matrizes são analisados em termos de complexidade aritmética . O modelo de computação é programas lineares com instruções do formulárioa ← b ∘ c , Onde ∘ ∈ { + , - , × , ÷ } , uma é uma variável e b , c podem ser variáveis, entradas ou constantes. Além disso, certas variáveis são distinguidas como saídas . Por exemplo, aqui está como multiplicar dois2 × 2 matrizes usando o algoritmo usual, com matrizes de entrada umaeu j,beu j e matriz de saída ceu j :
Para multiplicação de matrizes, pode-se provar uma forma normal para todos os algoritmos. Todo algoritmo pode ser convertido em um algoritmo da seguinte forma, ao custo de apenas um aumento multiplicativo constante na complexidade:
Isso é conhecido como forma normal bilinear . No algoritmo de multiplicação de matrizes mostrado acima,xj k,yj k funcionar como o γEu , mas no algoritmo de Strassen as combinações lineares são mais interessantes; eles são oMEu está na descrição da Wikipedia .
Usando uma abordagem de tensor (ou seja, aplicando recursivamente o mesmo algoritmo), semelhante à análise assintótica do algoritmo de Strassen, pode-se mostrar que, dado esse algoritmo para multiplicarn × n matriz com r produtos (ie r variáveis γEu ), então arbitrário N× N matrizes podem ser multiplicadas em complexidade O (Nregistronr) ; portanto, apenas o número de produtos é importante assintoticamente. No algoritmo de Strassen,n = 2 e r = 7 e, portanto, o limite é O (Nregistro27) .
O problema de encontrar o número mínimo de produtos necessários para calcular a multiplicação de matrizes pode ser formulado como a classificação de um tensor de terceira ordem (uma "matriz" com três índices em vez de dois), e isso forma a conexão com a teoria da complexidade algébrica. Você pode encontrar mais informações neste livro ou nestas notas da aula (continuação aqui ).
A razão pela qual esse modelo é usado é dupla: primeiro, é muito simples e passível de análise; segundo, está intimamente relacionado ao modelo de RAM mais comum.
Programas lineares podem ser implementados no modelo de RAM, e a complexidade de ambos os modelos está fortemente relacionada: operações aritméticas têm custo unitário em várias variantes do modelo (por exemplo, o modelo de RAM com números reais) e, de outra forma, são polinomialmente relacionadas para o tamanho dos números. No caso da multiplicação de matrizes modulares, portanto, a complexidade aritmética fornece um limite superior à complexidade no modelo de RAM. No caso de multiplicação de matriz inteira ou racional, pode-se mostrar que, para algoritmos bilineares resultantes de tensorização, o tamanho dos números não cresce muito e, portanto, a complexidade aritmética fornece um limite superior para o modelo de RAM, até fatores logarítmicos .
Pode ser a priori que uma máquina de RAM possa fazer alguns truques aos quais o modelo aritmético não sabe. Mas geralmente queremos que os algoritmos de multiplicação de matrizes funcionem para matrizes em campos arbitrários (ou mesmo anéis) e, nesse caso, o algoritmo uniforme deve usar apenas as operações aritméticas especificadas pelo modelo. Portanto, este modelo é uma formalização de algoritmos "independentes de campo".
fonte