next up previous contents
Seguinte: Códigos de Hamming Acima: Alguns códigos lineares com Anterior: Procedimentos   Conteúdo

Polinómios

Antes de mais, façamos um reset do kernel:
» reset();

O conjunto (mais do que isso, o anel) dos polinómios com tantas variáveis quantas se queira é denotado por Dom::Polynomial.

Dom::Polynomial(R, ..) cria o domínio dos polinómios com coeficientes no anel comutativo $ R$ , podendo a representação ser exibida de uma forma pré-definida.

Sintaxe:
Dom::Polynomial( <R <, Order»)
Order pode tomar o valor LexOrder, DegreeOrder, ou DegInvLexOrder ou um elemento de Dom::MonomOrdering. Default: LexOrder.

Por exemplo, suponha o leitor que se quer estudar polinómios com uma variável, em que os coeficientes são elementos de $ {\mathbb{Z}}_3$ . Ou seja, o anel sob estudo é $ {\mathbb{Z}}_3[x]$ . Mais concretamente, pretende-se estudar o polinómio dado por

$\displaystyle f(x)=x^2+x+2.$

Defina-se, no $ \mu$ -pad, o domínio $ {\mathbb{Z}}_3[x]$ . Usaremos a sigla Polin3 para representar essa entidade:
» Polin3:=Dom::Polynomial(Dom::IntegerMod(3));

Para mais informações, digite
» ?Dom::Polynomial

Para definir $ f$ , nada mais fácil:
» f:=Polin3(x^2+x+5);

(1 mod 3) x$ ^2$ + (1 mod 3) x + (2 mod 3)

O polinómio é irredutível:
» irreducible(f);

TRUE

Para se calcular $ f(1)$ ,
» evalp(f,x=1);

1 mod 3

Temos, então, um polinómio irredutível, e portanto, $ {\mathbb{Z}}_3[x]/(f(x))$ é um corpo, no caso um corpo de Galois. Será um corpo gerado pelo polinómio $ x$ ? Uma forma expedita de se verificar se $ f(x)$ é primitivo é escrever os elementos de $ {\mathbb{Z}}_3[x]/(f(x))$ enquanto potências de $ x$ . Por exemplo, $ x^3 \mod f(x)$ é calculado da forma seguinte:
» powermod(x,3,f);

2 x + 2

Para verificarmos se $ f(x)$ é primitivo, ou de forma equivalente, se o corpo $ {\mathbb{Z}}_3[x]/(f(x))$ é gerado por $ x$ , basta percorrer as potências de $ x$ e verificar se todas, até certo expoente, são diferentes de 1. Pode ser ainda de interesse apresentar todas as potências modulo $ f(x)$ para cálculos futuros:
» for i from 1 to 8 do
t:=powermod(x,i,f);
print(x^i,"elemento do corpo:",t);
end_for

O resultado é:

x, "elemento do corpo:", x
x$ ^2$ , "elemento do corpo:", 2 x + 1
x$ ^3$ , "elemento do corpo:", 2 x + 2
x$ ^4$ , "elemento do corpo:", 2
x$ ^5$ , "elemento do corpo:", 2 x
x$ ^6$ , "elemento do corpo:", x + 2
x$ ^7$ , "elemento do corpo:", x + 1
x$ ^8$ , "elemento do corpo:", 1

Poderá ser conveniente (e certamente sê-lo-á) criar um procedimento que tem como entrada um polinómio (para simplificar, em $ {\mathbb{Z}}_2[x]$ ) primitivo $ p(x)$ e como saída uma tabela com a correspondência entre as potências de $ x$ (polinómio gerador do grupo cíclico) e os polinómios de $ {\mathbb{Z}}_2/(p(x))$ . Antes de passarmos à resolução do problema, e portanto construção do procedimento), vejamos qual o metodologia a ser usada na implementação. Até agora, tem-se usado o MuPad não só como interpretador, mas também como editor (colocado ponto de vista de uma forma simplista). Faremos neste caso uso de um editor de texto externo, ficando o MuPad com a função de interpretador. Num editor de texto, crie um ficheiro, por exemplo, TabPrim.txt2. Comente as instruções de forma a que mais tarde seja fácil a si ou outrem entender o caminho que vai sendo traçado.

TabPrim:=proc(f)

   local grau,tabela, i;

   begin
        grau:=degree(f):
        tabela:=array(1..2^grau-1):
        for i from 1 to 2^grau-1 do
            tabela[i]:=powermod(x,i,f)
        end_for:
        return(tabela):
   end_proc:

Agora, e já no MuPad, o procedimento construido externamente é carregado com
» read("TabPrim.txt")
Tenha atenção ao caminho (vulgo PATH) onde o seu ficheiro está. Temos então um procedimento no kernel do sistema que, dado um polinómio irredutível, constrói uma tabela das potências:

>> Polin2:=Dom::Polynomial(Dom::IntegerMod(2))

               Dom::Polynomial(Dom::IntegerMod(2), LexOrder)
>> f:=Polin2(x^4+x+1);

                             4
                  (1 mod 2) x  + (1 mod 2) x + (1 mod 2)
>> TabPrim(f);

Se se quiser saber como se escreve $ x^{10}$ basta fazer

>> TabPrim(f)[10]

                                 2
                                x  + x + 1

Mais adiante, será crucial encontrar raizes de polinómios cujos coeficientes estão num certo corpo de Galois. Consulte Dom::GaloisField no MuPad.

Considere $ \pi(x)=x^4+x+1\in {\mathbb{Z}}_2[x]$ . Este polinómio é primitivo, pelo que $ {\mathbb{F}}={\mathbb{Z}}_2[x]/(\pi(x))$ é um corpo e $ {\mathbb{F}}^*=\langle x\rangle $ Pretende-se saber que elementos de $ {\mathbb{F}}$ anulam $ m(x)=x^2+x+1\in {\mathbb{Z}}_2[x]$ .
» // Criar um corpo de Galois usando Dom::GaloisField
» p:=a^4+a+1: // polinomio primitivo p
» F:=Dom::GaloisField(2,4,p): // corpo de Galois criado!
» PolF:=Dom::Polynomial(F); // anel dos polinomios dobre F
» m:=PolF(x^2+x+1) // o polinomio m sobre Z2: calcula-se as raizes sobre F
» solve(m=0,x); // as raizes de m
» F(a^5);

A última instrução revela que $ a^5$ é uma das raízes. Como se escreve a outra raiz como potência de $ a$ ?


next up previous contents
Seguinte: Códigos de Hamming Acima: Alguns códigos lineares com Anterior: Procedimentos   Conteúdo
2006-12-21