Polinómios

Os polinómios consistem em expressões algébricas que envolvem coeficientes de um determinado anel, um conjunto de variáveis e as operações de adição e multiplicação. Polinómios que envolvam uma única variável são designados por univariáveis ao passo que os polinómios que envolvam um número superior de variáveis têm a designação genérica de multivariáveis.
Encontram-se definidas na livraria três classes que implementam polinómios. Os polinómios univariáveis são representáveis por intermédio das classes UnivariatePolynomialNormalForm<CoeffType> e GeneralDegUnivarPolynomNormalForm<CoeffType, DegreeType>. A diferença entre ambas encontra-se no tipo de dados que define os graus dos vários termos dos polinómios. Na classe UnivariatePolynomialNormalForm o grau é representado por uma variável do tipo int. Por seu turno, esse tipo de dados é definido como argumento de tipo pelo utilizador na classe GeneralDegUnivarPolynomNormalForm sendo as operações sobre o grau delegadas para uma estrutura algébrica que implemente a interface IIntegerNumber. Esta última classe constitui uma generalização da primeira que poderá desaparecer nas próximas versões. A sua manutenção justifica-se pelo suporte fundamental a vários dos algoritmos implementados. Os polinómios multivariáveis, por seu turno, são representados pela classe Polynomial<T>.

Os construtores das classes que representam polinómios recebem um objecto que implementa a interface IMonoid<CoeffType> para identificar os coeficientes que constituem uma unidade aditiva. Os termos com coeficientes nulos são descartados por não integrarem a representação polinomial.
É possível, portanto, instanciar polinómios simples. A construção de polinómios mais complexos consegue-se com o auxílio das funções de adição e multiplicação. Encontram-se implementados um leitor de polinómios univariáveis e um leitor de polinómios multivariáveis. Estes leitores permitem reconstruir um polinómio com base na sua representação textual. O seguinte código permite efectuar a leitura de um polinómio univariável cujos coeficientes são matrizes de inteiros.

    // O texto com a representação polinomial
    var polynomialText = "[[1,2],[3,4]]*x^2-[[1,0],[0,1]]*x+[[7,6],[9,8]]";
    var variableName = "x";
    var integerDomain = new IntegerDomain();
    var integerParser = new IntegerParser<string>();
    var integerSquareArrayMatrixfactory = new ArraySquareMatrixFactory<int>();
    var integerGenericMatrixRing = new GeneralMatrixRing<int>(
                2,
                integerSquareArrayMatrixfactory,
                integerDomain);
    var integerMatrixConversion = new CantConvertConversion<int, IMatrix<int>>();
    var integerMatrixConfigParser = new ConfigMatrixParser<int>(
                integerParser,
                2,
                2,
                integerSquareArrayMatrixfactory);
    integerMatrixConfigParser.SeparatorSymbType = "comma";
    integerMatrixConfigParser.MapInternalDelimiters("left_bracket", "right_bracket");
    integerMatrixConfigParser.AddBlanckSymbolType("blancks");

    var polInputReader = new StringReader(polynomialRepresentation);
    var polSymbolReader = new StringSymbolReader(polInputReader, readNegativeNumbers);
    var polParser = new UnivariatePolynomialReader<T, CharSymbolReader<string>>(
                "x",
                integerMatrixConfigParser ,
                integerGenericMatrixRing );
    polParser.RegisterExternalDelimiterTypes("left_bracket", "right_bracket");

    var result = default(UnivariatePolynomialNormalForm<T>);
    if (polParser.TryParsePolynomial(polSymbolReader, conversion, out result))
    {
                // O polinómio foi lido com sucesso.
                // TODO: processar o polinómio que se encontra em "result"
    }
    else
    {
                // Não é possível ler o polinómio.
                throw new Exception("Can't read polynomial.");
    }


Na sua essência, o leitor de polinómios necessita de um leitor para os seus coeficientes, um objecto capaz de converter um coeficiente num valor inteiro e um objecto responsável pelas operações de anel sobre os coeficientes. O conversor entre o tipo de coeficientes e um número inteiro permite identificar os graus com os coeficientes. Esta identificação verifica-se nos casos matemáticos mais comuns. A definição de delimitadores externos permite delegar para os leitores de coeficientes todo o conteúdo que se encontre por testes delimitado. No caso das matrizes são definidos os delimitadores [ e ].

Last edited Aug 3, 2014 at 8:12 PM by SergioMarques, version 1

Comments

No comments yet.