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
, 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
. Ou seja, o
anel sob estudo é
. Mais concretamente, pretende-se estudar
o polinómio dado por
Defina-se, no
Para mais informações, digite
» ?Dom::Polynomial
Para definir
, nada mais fácil:
» f:=Polin3(x^2+x+5);
O polinómio é irredutível:
» irreducible(f);
Para se calcular
,
» evalp(f,x=1);
Temos, então, um polinómio irredutível, e portanto,
é um corpo, no caso um corpo de Galois. Será um corpo gerado pelo polinómio
?
Uma forma expedita de se verificar se
é primitivo é escrever os
elementos de
enquanto potências de
. Por exemplo,
é calculado da forma seguinte:
» powermod(x,3,f);
Para verificarmos se
é primitivo, ou de forma
equivalente, se o corpo
é gerado por
, basta percorrer
as potências de
e verificar se todas, até certo expoente, são
diferentes de 1. Pode ser ainda de interesse apresentar todas as
potências modulo
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 é:
Poderá ser conveniente (e certamente sê-lo-á) criar um procedimento que tem como entrada um polinómio (para simplificar, em
) primitivo
e como saída uma tabela com a correspondência entre as potências de
(polinómio gerador do grupo cíclico) e os polinómios de
. 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
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
. Este polinómio é primitivo, pelo que
é um corpo e
Pretende-se saber que elementos de
anulam
.
» // 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
é uma das raízes. Como se escreve a outra raiz como potência de
?