Tutorial PARI/GP (II)
Sab 23 Abr 2005 15:45 |
- Detalhes
- Categoria: Matemática Numaboa
- Atualização: Domingo, 12 Abril 2009 16:14
- Autor: vovó Vicki
- Acessos: 9871
- Funções aritméticas elementares
Como a PARI foi projetada para teóricos dos números, não é de se surpreender que ofereça um grande número de funções aritméticas (veja a lista delas digitando ?4). Já vimos várias delas, como a factor. Saiba que a função factor não lida apenas com números inteiros, mas também com polinômios (univariados). Digite, por exemplo, factor(x^200 - 1). Você também pode pedir para fatorar um módulo polinomial a primo p (factormod) e até mesmo num campo finito que não seja um campo primo (factorff).
Evidentemente existem funções para computar o máximo divisor comum (gdc), o máximo divisor comum estendido (bezout), resolver o teorema chinês dos restos (chinese) e assim por diante.
Além das facilidades de fatoração, existem algumas funções relacionadas a testes de primalidade, como isprime, ispseudoprime, precprime e nextprime. Como foi mencionado anteriormente, apenas pseudoprimos fortes são produzidos pelas duas primeiras funções (elas passam o teste ispseudoprime). Os testes de primalidade mais sofisticados de isprime, sendo muito mais lentos, não são aplicados como default.
As funções aritméticas multiplicativas também estão presentes: a função µ de Möbius (moebius), a função φ de Euler (eulerphi), as funções ω e Ω (omega e bigomega), as funções σk (sigma) que calculam a k-ésima potência dos divisores positivos de um dado inteiro, etc.
Você pode calcular frações contínuas. Por exemplo, entre com \p 1000, depois com contfrac(exp(1)) para obter a fração contínua da base dos logaritmos naturais que, como se pode ver, obedece a um padrão muito simples.
Em muitos casos, queremos realizar determinada tarefa somente se uma determinada condição aritmética for satisfeita. A GP oferece as seguintes funções: isprime, como mencionado acima, issquare, isfundamental para testar se um inteiro é um discriminante fundamental (isto é, 1 ou o discriminante de um campo quadrático), e os loops forpeimw, fordiv e sumdiv. Imagine que se queira calcular o produto de todos os divisores positivos de um inteiro positivo n. A maneira mais fácil é escrever p = 1; fordiv(n,d, p *= d); p. A notação p *= d é apenas uma forma abreviada de p = p * d.
Se quisermos saber a lista dos números primos p menores do que 1000, de modo que 2 seja uma raiz primitiva módulo p, poderíamos escrever forprime(p=3,1000, if (znprimroot(p) == 2, print(p))). Observe que isto pressupõe que znprimroot retorne a menor raiz primitiva e este é efetivamente o caso. Se soubéssemos disso, poderíamos ter escrito forprime(p=3,1000, if (znorder(Mod(2,p)) == p-1, print(p))) (que é mais rápido porque apenas calculamos a ordem de 2 em Z/pB ao invés de procurar por um gerador testando elementos sucessivos cujas ordens também precisam ser calculadas).
Acho que vou parar por aqui, por que já tem material suficiente para fundir a cabeça da maioria das pessoas
vovó Vicki
- << Anterior
- Próximo