Cramer e Sarrus no Mathematica
Implementação

Esta página contém uma breve descrição das estratégias empregadas na programação do CramerSarrus. Embora seja endereçada a usuários avançados do Mathematica, algumas passagens podem esclarecer e mencionar detalhes relevantes que omitimos da apresentação anterior.

Como já vimos, uma vez escrita uma expressão matemática, o uso do CramerSarrus envolve apenas dois passos:

Passo 1: o usuário coloca o cursor em qualquer ponto da expressão;
Passo 2: o usuário clica num botão apropriado da paleta CramerSarrus.

As expressões matemáticas de interesse são dos seguintes tipos:

• um sistema linear © 2002-2006, Matemática para Gregos & Troianos - Carlos César (com ou sem chave à esquerda). Botão a ser clicado: © 2002-2006, Matemática para Gregos & Troianos - Carlos César.
• uma matriz © 2002-2006, Matemática para Gregos & Troianos - Carlos César. Botão a ser clicado: © 2002-2006, Matemática para Gregos & Troianos - Carlos César.
• uma matriz ou determinante © 2002-2006, Matemática para Gregos & Troianos - Carlos César. Botão a ser clicado: © 2002-2006, Matemática para Gregos & Troianos - Carlos César ou © 2002-2006, Matemática para Gregos & Troianos - Carlos César.
• uma matriz, submatriz ou determinante © 2002-2006, Matemática para Gregos & Troianos - Carlos César. Botão a ser clicado: © 2002-2006, Matemática para Gregos & Troianos - Carlos César.

Todas essas expressões devem ser escritas em notação matemática tradicional, exatamente como nos exemplos apresentados. É importante salientar este fato porque o Mathematica reconhece expressões em diferentes formatos. Por exemplo, sistemas de equações e matrizes podem ser especificados simplesmente como listas (expressões com Head igual a List, também escritas com seus elementos entre chaves). Assim, um sistema linear © 2002-2006, Matemática para Gregos & Troianos - Carlos César pode ser dado como uma lista de © 2002-2006, Matemática para Gregos & Troianos - Carlos César equações lineares com © 2002-2006, Matemática para Gregos & Troianos - Carlos César incógnitas. Internamente, uma matriz numérica © 2002-2006, Matemática para Gregos & Troianos - Carlos César é uma lista com © 2002-2006, Matemática para Gregos & Troianos - Carlos César listas (as linhas da matriz) de comprimento © 2002-2006, Matemática para Gregos & Troianos - Carlos César. (Matematicamente, isso corresponde à idéia de que uma funcão © 2002-2006, Matemática para Gregos & Troianos - Carlos César “equivale” a uma função de © 2002-2006, Matemática para Gregos & Troianos - Carlos César no conjunto das funções de © 2002-2006, Matemática para Gregos & Troianos - Carlos César em © 2002-2006, Matemática para Gregos & Troianos - Carlos César.)

Dado o fim educacional do CramerSarrus, essas representações em termos de listas não serão reconhecidas pelos algoritmos implementados no pacote (embora seja fácil providenciar tal extensão).

Seleção e Captura de Notações

No Mathematica, toda expressão simbólica possui uma representação textual que codifica sua forma visual. Esse “código tipográfico”  determina a apresentação da expressão, a sua “aparência” na tela — independentemente da sua semântica ou interpretação. Em particular, notações estritamente bidimensionais (como a apresentação de matrizes por grades delimitadas por parênteses) são definidas por configurações de caixas tipográficas (objetos Box). A idéia de codificar notações é tão natural quanto a de codificar objetos de desenho, e está presente em linguagens de marcação como o LaTeX e o MathML. (Diga-se de passagem que a arquitetura dos elementos de apresentação do MathML deriva da que é usada no Mathematica.)

Numa sessão normal do Mathematica, não temos que lidar com representações textuais diretamente porque o kernel cuida automaticamente das mesmas durante a avaliação (processamento) das expressões. (A avaliação se dá, por exemplo, quando o usuário pressiona a tecla Enter do teclado numérico.) No CramerSarrus, porém, a avaliação é disparada via botões externos ao caderno do usuário. O principal elemento de um botão é a opção ButtonFunction, que roda um algoritmo quando o botão é clicado.

No CramerSarrus, quando o usuário clica num dos quatro botões acima, o front end expande progressivamente a seleção (usando While e NotebookRead) enquanto examina a representação textual da expressão à procura do padrão (pattern) tipográfico apropriado. Por exemplo, o padrão

© 2002-2006, Matemática para Gregos & Troianos - Carlos César

com

© 2002-2006, Matemática para Gregos & Troianos - Carlos César

descreve a representação textual de uma grade de equações (que corresponde a um sistema) ou de uma matriz em notação tradicional, possivelmente com estilos. Em particular, matrizes e determinantes © 2002-2006, Matemática para Gregos & Troianos - Carlos César são identificados por expressões da forma

© 2002-2006, Matemática para Gregos & Troianos - Carlos César

onde

© 2002-2006, Matemática para Gregos & Troianos - Carlos César

Os objetos StyleBox assinalam alterações de estilo tais como cor, tamanho, fonte etc.

Se o padrão esperado não for detectado durante um ciclo, o CramerSarrus abre uma janela (na verdade, um objeto Notebook) com uma mensagem para o usuário — que deve, então, tentar novamente (talvez reposicionando o cursor na expressão ou usando o botão correto).

Interpretação e Processamento

Além de uma representação textual, uma notação matemática possui também uma interpretação (ou conteúdo, na terminologia da MathML). O Mathematica possui um banco padrão de regras que associam um significado a cada representação textual. Essas regras podem ser modificadas caso se queira definir notações especiais. O leitor avançado certamente conhece o pacote Notation, criado por Jason Harris para automatizar essa tarefa. Entretanto, nenhum recurso do pacote Notation é utilizado no CramerSarrus.

No CramerSarrus, feita a captura da representação textual com a seleção progressiva, entram em cena as funções ToExpression e MakeExpression, que convertem as caixas tipográficas nos objetos matemáticos correspondentes (matrizes ou sistemas de equações). Vejamos o caso do botão © 2002-2006, Matemática para Gregos & Troianos - Carlos César. Uma vez convertido um sistema de equações numa lista de equações, temos que extrair as matrizes dos coeficientes e dos termos independentes do sistema (relativamente às incógnitas escolhidas pelo usuário na paleta de abertura). A partir do Mathematica 5.0, essas matrizes se extraem facilmente com a função CoefficientArrays. No caso do botão © 2002-2006, Matemática para Gregos & Troianos - Carlos César, o processamento semântico envolve a extração das submatrizes complementares (desta vez usando Part e Drop) de cada elemento da linha ou coluna especificadas pelo usuário. (Para cuidar do teorema geral de Laplace, a ser apresentado na próxima versão do pacote, usamos apenas Part.)

Formatação e Exibição

Após a realização dos cálculos, é preciso apresentar os resultados novamente em notação bidimensional na tela do usuário. (Além disso, essa “notação de saída” pode ou não ser consistente com a “notação de entrada”.) Note-se, por exemplo, que o CramerSarrus apresenta a regra de Cramer como uma seqüência de quocientes indicados (não efetuados) de determinantes, em cujos numeradores se destacam a coluna das constantes. A apresentação do desenvolvimento por cofatores (botão © 2002-2006, Matemática para Gregos & Troianos - Carlos César) é ainda mais complexa, pois envolve a exibição de uma soma de produtos nos quais participam elementos decorados, potências © 2002-2006, Matemática para Gregos & Troianos - Carlos César não efetuadas e determinantes em notação tradicional.

A formatação dos resultados para apresentação se consegue basicamente com as funções ToBoxes e MakeBoxes atuando em TraditionalForm, mas com algumas alterações nas caixas resultantes — tais como a inserção de RowBox e FractionBox, ajustes nas opções de espaçamento das GridBox, ocultação de expressões por meio de StyleBox etc. A exibição final no caderno do usuário é feita com NotebookWrite.

Elementos da Interface

Como tudo no Mathematica, os botões, sons, janelas e paletas gerados pelo CramerSarrus são expressões normais da linguagem, regidas pela mesma sintaxe abstrata e sujeitas às mesmas manipulações estruturais (Map, MapThread etc) usadas para processar listas. Por exemplo, as paletas geradas pelos botões © 2002-2006, Matemática para Gregos & Troianos - Carlos César e © 2002-2006, Matemática para Gregos & Troianos - Carlos César são objetos Notebook (cadernos) cuja estrutura deve ser cuidadosamente montada como uma matriz (!) de botões (objetos ButtonBox) envolvida numa GridBox — que por sua vez comporá uma célula num caderno com opções especiais (dando-lhe a aparência de uma paleta flutuante). Desse modo, os mesmos elementos GridBox que formatam matrizes também sustentam grades de botões em paletas!

Os sons gerados pelo pacote foram criados com a função Play, mas, por razões de eficiência, essa função não participa diretamente do código-fonte do CramerSarrus. Em vez disso, a codificação em PostScript dos objetos Sound (gerados com Play) foi previamente armazenada em células ocultas para reprodução sonora quando necessário. (Para isso, a célula é localizada com NotebookFind e o som é reproduzido invocando-se FrontEndExecute.)

Funções Utilizadas

O código-fonte do CramerSarrus utilizou um total de 139 (cento e trinta e nove) funções do Mathematica. Esse número não inclui os nomes das diversas opções usadas em 26 (vinte e seis) dessas funções. Apresentamos abaixo uma tabela com os nomes das funções usadas juntamente com suas respectivas freqüências de ocorrência no código-fonte.

© 2002-2006, Matemática para Gregos & Troianos - Carlos César

Criptografia

O código-fonte do CramerSarrus foi criptografado com a função Encode do Mathematica.

Carlos César de Araújo, 10 de novembro de 2006, 19:22:01