• Nenhum resultado encontrado

De modo geral, as rotinas escritas no ambiente do CAS Maxima trazidas neste trabalho funcionam de maneira satisfatória, de modo a ser possível utilizá-las para complementar a rotina de integração nativa do próprio Maxima, a qual,

aparentemente, recorre ao algoritmo de Bernoulli para a integração de funções ra- cionais e não trabalha com extensões que envolvam fórmulas cúbicas ou quárticas, oferecendo resultados muito limitados. Na verdade, os resultados obtidos pelas rotinas presentes neste trabalho têm apresentação muito semelhante à daqueles obtidos pelos CAS Wolfram Alpha e Maple.

Porém, durante a elaboração dos códigos, o autor do presente trabalho obje- tivou apenas obter códigos estáveis e legíveis em uma primeira instância, isto é, apenas códigos que funcionassem e fossem fáceis de compreender. Isto refletiu na eficiência dos códigos.

Por exemplo, em uma computação de resultante sobre �[�][�] de grau 34 na variável � e conteúdo com cerca de 150 dígitos, o algoritmo das subresultantes implementado pelo autor, por exemplo, chegou a demorar 4.1 segundos e utilizar cerca de 550MB de memória, contra cerca de 0.2 segundos e 70MB de memória da rotina nativa do Maxima para o cálculo de resultantes através do algoritmo das subresultantes. O resultado obtido pelas duas implementações, todavia, foi idêntico.

Isto sugere que não necessariamente há falhas no código, mas programação inapropriada, ou seja, os comandos poderiam ser reescritos de modo a aproveitar melhor as potencialidades de cálculo do Maxima, reduzindo drasticamente o tempo de execução.

Corroborando com esta hipótese, após uma alteração dos códigos Group,

PPsDiv e SubRes, todas relativas a simplificações de expressões, o código im-

plementado passou a levar cerca de apenas 0.6 segundos e 135MB para o cálculo da mesma resultante mencionada acima. As alerações que resultaram num ganho de eficiência, contudo, não foram mantidas por uma questão de segurança Ů apesar de proporcionarem um resultado satisfatório dentro da rotina das subresultantes, não foi testado com segurança como afetariam a execução das demais rotinas. O autor pretende realizar estes testes e efetuar estas alterações para maior eficiência em breve.

Finalmente, apontamos para o fato de que os códigos foram testados principal- mente para funções racionais em Q(�). Poucos testes foram feitos utilizando-se corpos K mais gerais. Além disso, é natural que, ao se utilizar os códigos pro- postos com a rotina CubeSolve, o tempo de computação aumente muito, ou

a apresentação das funções fique muito extensa, especialmente no caso real. As configurações ideais para a função IRF, portanto, são

1. para o caso real: recomenda-se utilizar, no máximo, a rotina QuadSolve; apresentação inerte em termos dos fatores da resultante; versão linear do algoritmo de Hermite, ou algoritmo de Horowitz-Ostrogradsky; Algoritmo de Czichowski, ou Lazard-Rioboo-Trager, caso a computação de bases de Gröbner falhe por algum motivo; Algoritmo de Rioboo; conversão para arcos tangentes hiperbólicos;

2. para o caso complexo: recomenda-se utilizar, no máximo, a rotina Cube-

Solve; apresentação inerte em termos dos fatores da resultante; versão

linear do algoritmo de Hermite, ou algoritmo de Horowitz-Ostrogradsky; Algoritmo de Czichowski, ou Lazard-Rioboo-Trager, caso a computação de bases de Gröbner falhe por algum motivo;

Lançamos agora algumas considerações a respeito da integração de uma fun- ção � com coeficientes reais. Digamos que a resultante encontrada durante o processo de obtenção da parte transcendental seja �. Quando (por opção ou impossibilidade) nem todas as raízes deste polinômio são determinadas, somos deixados com um polinômio, digamos ˜�, que é a divisão de � por todos os fatores � ⊗ Ò, onde os Ò são todas as raízes de � que determinamos. A parte inerte de

∫ �, como vimos, será escrita em termos das raízes de ˜�.

Este polinômio poderá conter raízes envolvendo parte imaginária ou não. No caso da integração real, seria desejável, portanto, saber se � possui pelo menos uma raiz real pura e pelo menos uma raiz com unidade imaginária. Desse modo, poderíamos expressar ︁ = �1+ ︁ γ∈R♣ ˜Qi(γ)=0 Òlog(�i(Ò,�)) +γ=a+bI∈C♣ ˜Qi(γ)=0 b>0 Òlog(�2+ �2) + �ã,

onde �1é a parte da integral que conseguimos expressar de modo explícito a partir

da determinação de parte das raízes de �, a partir dos algoritmos que estudamos neste trabalho, � = �(�,�,�), � = �(�,�,�), ã = ã(�,�,�) e os ˜�i são fatores

de quadrados, independente do método que utilizamos.

Para realizar esta determinação, é possível recorrer ao algoritmo de Sturm: um algoritmo capaz de calcular o número de raízes reais distintas de um polinômio. Este algoritmo pode ser aplicado a ˜�i, de modo que se � é o número de raízes

reais de ˜�i então grau( ˜�i) ⊗ � é o número de raízes complexas distintas de ˜�i.

Este algoritmo não foi implementado, todavia, nos códigos deste trabalho, de modo que o somatório mais à direita é sempre dado em termos explícitos, não em termos de raízes não determinadas. A fonte original que fundamenta este algoritmo se encontra em [32].

[1] G. Almkvist and D. Zeilberger. The method of differentiating under the integral sign. Journal of Symbolic Computation, 10:571Ű591, 1990.

[2] M. Bronstein. Symbolic Integration I: transcendental functions. Cambridge University Press, 2nd edition, 1997.

[3] M. Bronstein and B. Salvy. Full partial fraction decomposition of rational functions. Proceedings of ISSACŚ93, pages 157Ű160, 1993.

[4] W.S. Brown and J.F. Traub. On euclidŠs algorithm and the theory of subre- sultants. Journal of the ACM, 18:505Ű514, 1971.

[5] G.W. Cherry. Integration in finite terms with special functions: the error function. Journal of Symbolic Computation, 1:282Ű302, 1985.

[6] G.W. Cherry. Integration in finite terms with special functions: the logarith- mic function. SIAM J. Computing, 15:1Ű21, 1986.

[7] G.E. Collins. Subresultants and reduced polynomial remainder sequences.

Journal of the ACM, 14:128Ű142, 1967.

[8] S. C. Coutinho. Polinômios e Computação Algébrica. IMPA, Rio de Janeiro, 2012.

[9] G. Czichowski. A note on gröbner bases and integration of rational functions.

Journal of Symbolic Computation, 20:163Ű167, 1995.

[10] G.M. Fichtenholz. Differential- und Integralrechnung, volume 15. Springer- Verlag, New York, 1990.

[11] K.O. Geddes, S.R. Czapor, and G. Labahn. Algorithms for Computer Algebra. Kluwer Academic Publishers, Boston, Drodrecht, London, 1992.

[12] C. Hermite. Sur lŠintégration des fractions rationnelles. Annales scientifiques

de lŠÉcole Normale Supérieure, 1:215Ű218, 1872.

[13] E. Horowitz. Algorithms for partial fraction decomposition and rational function integration. In Proceedings of the Second ACM Symposium on

Symbolic and Algebraic Manipulation, SYMSAC Š71, pages 441Ű457, New

York, NY, USA, 1971. ACM.

[14] D.J. Jeffrey. Rectifying transformations for the integration of rational tri- gonometric functions. Journal of Symbolic Computation, 24(5):563 Ű 573, 1997.

[15] S. Lang. Algebra. Springer, New York, 3rd edition, 2002.

[16] S. Lang. Undergraduate Algebra. Springer, New Haven, 3rd edition, 2005. [17] D. Lazard and R. Rioboo. Integration of rational functions: Rational computa-

tion of the logarithmic part. Journal of Symbolic Computation, 9(2):113Ű116, 1990.

[18] J. Liouville. Premier mémoire sur la détermination des intégrales dont la valeur es algebrique. Journal de lŠEcole Polytechnique, 14:124Ű148, 1833. [19] J. Liouville. Second mémoire sur la détermination des intégrales dont la

valeur es algebrique. Journal de lŠEcole Polytechnique, 14:149Ű193, 1833. [20] J. Liouville. Mémoire sur lŠintegration dŠune classe de fonctions transcendan-

tes. Journal für die reine und angewandte Mathematik, 13:93Ű118, 1835. [21] J. Luetzen. Studies in the history of mathematics and physical sciences,

volume 15. Springer-Verlag, New York, 1990.

[22] D. Mack. On rational function integration. Computer Science Department,

University of Utah, UCP-38, 1975.

[24] T. Mulders. A note on subresultants and a correction to the lazard-rioboo- trager formula in rational function integration. Journal of Symbolic Compu-

tation, 24(1):45Ű50, 1997.

[25] D.R.R. Musser. Algorithms for polynomial factorization. PhD thesis, Uni- versity of Wisconsin, 1971.

[26] M.W. Ostrogradsky. De lŠintégration des fractions rationnelles. Bulletin de

la Classe Physico-Mathématiques de lŠAcadémie Impériale des Sciences de St. Pétersbourg, IV:145Ű167,286Ű300, 1845.

[27] Loos. R. Generalized polynomial remainder sequences. pages 115Ű137. Springer-Verlag, New York, 1982.

[28] R. Rioboo. Quelques aspects du calcul exact avec des nombre réels. PhD thesis, Université de Paris 6, Informatique, 1991.

[29] R.H. Risch. On the integration of elementary functions which are built up using algebraic operations. Sys. Dev. Corp., Santa Mônica, CA, Report SP-2801/002/00, 1968.

[30] J.F. Ritt. Integration in Finite Terms. Columbia University Press, New York, 1948.

[31] M. Rothstein. Aspects of Symbolic Integration and Simplification of Exponen-

tial and Primitive Functions. PhD thesis, University of Wisconsin-Madison,

1976.

[32] Charles Sturm. Mémoire sur la résolution des équations numériques. Sprin- ger, 2009.

[33] R.G. Tobey. Algorithms for Antidifferentiation of Rational Functions. PhD thesis, Harvard University, 1967.

[34] Barry M. Trager. Algebraic factoring and rational function integration. In Proceedings of the Third ACM Symposium on Symbolic and Algebraic

[35] J. von zur Gathen and J. Gerhard. Algorithms for Computer Algebra. Cam- bridge University Press, Cambridge, 2nd edition, 2003.

[36] D.Y.Y. Yun. On square-free decomposition algorithms. In Proceedings of

Integração de Funções

Hiperexponenciais

A.1

O Algoritmo de Almkvist-Zeilberger

Apresentaremos aqui um algoritmo para integração das funções ditas hiperex- ponenciais. Brevemente, seriam aquelas funções cuja derivada logarítmica é racional, como veremos a seguir. O método calcula a integral deste tipo de função quando esta integral é um múltiplo racional da mesma. Este algoritmo se encontra originalmente em [1].

Definição A.1.1. Seja �(�) uma função na variável �. Se �

/� ∈ K(�), K ⊖ C então dizemos que � é hiperexponencial sobre K(�) (ou que é uma extensão

hiperexponencial de K(�)).

Exemplos de funções hiperexponenciais sobre K(�) (ou simplesmente hiperex- ponenciais) são:

1. as funções racionais, pois é evidente que se � ∈ K(�) então �

/� ∈ K(�);

2. exponenciais de funções racionais, pois, dada � ∈ K(�), temos que exp(�)/

exp(�) = �

∈ K(�);

3. produtos finitos de funções exponenciais, pois se � e � são hiperexponenciais, então (��)/� �= �/� + �

4. potências de funções hiperexponenciais, pois se � é hiperexponencial e � ∈ K então (�r)/�r = �(�r⊗1)�/�r = ��

/� ∈ K(�).

Considere o problema de encontrar a integral de uma função � hiperexponencial sobre K(�), isto é, encontrar uma função � (não necessariamente pertencente a K(�)) tal que

= �

Se assumirmos que o problema acima possui uma solução também hiperexponen- cial, o algoritmo de Almkvist-Zeilberger, o qual discutiremos nesta seção, nos mostra como obtê-la. Consequentemente, quando o algoritmo não é capaz de encontrar qualquer solução hiperexponencial, então não existe solução alguma do problema satisfazendo esta condição. Por este motivo, dizemos que este é um algoritmo de decisão.

Primeiramente, observemos que se � é hiperexponencial então temos que a sua derivada logaritmica à = �/� pertence a K(�). Se o problema admite solução �

hiperexponencial então � = �/� e

= �= ��.

Portanto, � = �/�. Naturalmente, � ̸= 0, ou teríamos � = 0, pela equação acima. Portanto, se a solução � existir, deve ser um múltiplo racional de �, o que quer dizer que � ∈ K(�).

Seja, portanto � uma solução do para �= �, isto é, � = á� para alguma

função á ∈ K(�). Temos que

= (á�)= á�+ á�= (á+ àá)�.

A equação acima possui solução se e só se á é solução da equação diferencial

de Risch

á+ àá = 1. (A.1)

Na equação (A.1) acima, há apenas termos racionais, isto é, eliminamos todos os termos puramente hiperexponenciais do problema original e agora nossa questão

se reduz a encontrar soluções racionais.

Mais além, se escrevermos à = �/� em sua forma reduzida com �,� ∈ K[�], e, de modo semelhante, á = �/� em sua forma reduzida com �,� ∈ K[�] e multiplicarmos a equação (A.1) por ��2, vemos que o problema se reduz a encontrar

polinômios �,� ∈ K[�] tais que

��� ⊗ ���+ ��� = ��2. (A.2)

Uma vez encontrados polinômios �,� ∈ K[�] que satisfazem (A.2), temos uma solução para o problema original. Basta fazer � = (�/�)�.

Vamos, discutir como resolver a equação (A.2). Nossa abordagem será procurar primeiro algum múltiplo do polinômio �, tal que a equação (A.2) aplicada a este polinômio no lugar de � possua solução em um múltiplo de �. Mostraremos que, para a obtenção do múltiplo de �, precisamos tão somente conhecer � e �. Definimos, para tanto, �0 = �* = �/�e �1 = �/�, ambos em K[�]. Observe

que �0 e �1 são relativamente primos. Dividindo (A.2) por gcd(�,�′), temos

��0⊗ ���1 + ���0 = ���0 (A.3)

Observe que �0 divide ���1 e, como mdc(�,�) = mdc(�c,�1) = 1, também

divide �. Portanto, podemos dividir (A.3) por �0 obtendo

��′ + ︃ � ⊗ 0 1 ︃ �= ��,

donde podemos concluir que �0 divide � ⊗ (�/�0)�1, uma vez que �0 divide � e é

relativamente primo a �. Seja � = ℎ1 1≤ ≤ ≤ ℎkk a flq de �. Temos que �0 = ℎ1≤ ≤ ≤ ℎk e 1 = ︀k i=1ℎii ′︂ j̸=iℎjjk i=1ℎi⊗1i = ︀k i=1�ℎik i=1ℎi⊗1ij̸=iℎjk i=1ℎi⊗1i =︁k i=1 �ℎij̸=i ℎj = ki=1 �ℎi�0 ℎi .

Além disso, para cada ℎi, 0 1 ⊕ 0 �ℎi0 ℎi = �� ℎi i ⊕ � ℎi i+ ︃ ℎi ︃′ ℎi= ��mod ℎ i.

Cada ℎi divide � pelas contas acima e ambas as parcelas do lado esquerdo na

equação ︃ � ⊗ 0 1 ︃ + ︃ 0 1⊗ ��′ ︃ = � ⊗ ��,

portanto cada ℎi divide mdc(�,� ⊗ ��′). Lançamos o seguinte teorema

Teorema A.1.1 ([35], Cap. 22, ğ4). Sejam �,� ∈ K[�] polinômios relativamente

primos em K[�] constituindo uma solução para (A.2), com � ̸= 0 mônico e = ℎ11≤ ≤ ≤ ℎkk sendo decomposição em fatores livres de quadrados de �. Definamos

�(�) = resx(�,� ⊗ ��),

�= max¶� ∈ N ♣ � = 0 ou �(�) = 0♢, �i = gcd(�,� ⊗ ��), (1 ⊘ � ⊘ �).

Então, � ⊘ � e ℎi ♣ �i, para 1 ⊘ � ⊘ �.

Demonstração. Podemos supor que grau(�) ⊙ 1. Temos que grau(ℎm) > 0, pela

definição de decomposição livre de quadrados. Observe que, como já dissemos, ℎi

divide mdc(�,�⊗��) para todo �. Em particular, isto quer dizer que grau(mdc(�,�⊗

��)) > 0 e, portanto �(�) = resx(�,� ⊗ ��) = 0. Logo, � ⊘ � e ℎi ♣ �i para

1 ⊘ � ⊘ �. Finalmente,

= ℎ122≤ ≤ ≤ ℎmm ♣ �122≤ ≤ ≤ �mm ♣ �122≤ ≤ ≤ �mm�m+1m+1≤ ≤ ≤ �dd= �.

Portanto, alcançamos nosso objetivo de calcular um múltiplo � = �1≤ ≤ ≤ �dd

de � conhecendo tão somente os polinômios � e �. Observe que � =

ii

é própria flq de � : se Ò ∈ K e � é um fator irredutível de mdc(�,� ⊗ Ò�),

então � ♣ �, � ⊗ Ò�. Por outro lado, se ocorresse �2

♣ �, então teríamos � ♣ �e, portanto, � ♣ �, contrariando o fato de que � e � são primos entre si. Assim,

para todo Ò ∈ K, mdc(�,� ⊗ Ò�) é livre de quadrados. Então, dados Ò

12 ∈ K,

se �1 = mdc(�,� ⊗ Ò1), �2 = mdc(�,� ⊗ Ò2) e � = mdc(�1,�2), então � ♣

�, � ⊗ Ò1, � ⊗ Ò2, donde � ♣ (Ò1⊗ Ò2)�e, portanto, se Ò1 ̸= Ò2, � ♣ �, donde

�= 1. Concluímos que os �i são livres de quadrados e dois a dois primos entre

si.

O algoritmo sugerido pelo TeoremaA.1.1 pode ser melhorado se a cada passo retirarmos �i de � e � ⊗ ��: se �0 = � e �0 = �, definimos as sequências

�i = mdc(�i⊗1,�i⊗1⊗ �i⊗1), �i =

�i⊗1⊗ �i⊗1 �i , �i = �i⊗1 �i . (A.4)

Observe que, dado 1 ⊘ � ⊘ �, se para algum par � tal que 1 ⊘ � < � temos que

�i = mdc(�i⊗k,�i⊗k⊗ ��i⊗k) então

�i = mdc(�i⊗k2 �i⊗k,�i⊗k2 (�i⊗k⊗ ��i⊗k))

= mdc(�i⊗k�i⊗k⊗1,�i⊗k(�i⊗k⊗1⊗ �i⊗k⊗1) ⊗ �i⊗k2 ��i⊗k)

= mdc(�i⊗k�i⊗k⊗1,�i⊗k�i⊗k⊗1⊗ (� + 1)�i⊗k�i⊗k⊗1 ⊗ �i⊗k⊗1�i⊗k′ )

= mdc(�i⊗(k+1),�i⊗(k+1)⊗ (� + 1)�i⊗(k+1))

onde utilizamos o fato de que �i⊗k ♣ �i⊗k⊗1 na última igualdade. O argumento

acima é válido para � = 1 e por indução, válido para qualquer � tal que 1 ⊘ � < �, em particular para � = � ⊗ 1, donde concluímos que �i = mdc(�,� ⊗ ��′), para

todo �. Assim, as sequências definidas em (A.4) também nos fornecem um modo mais eficiente de calcular o múltiplo � fornecido pelo Teorema A.1.1 [35, Cap. 22, ğ4].

Damos prosseguimento à nossa abordagem, buscando um múltiplo � do po- linômio � para o qual a equação (A.2) aplicada a � e � possua solução. Isto é, buscamos uma solução � para a equação

�� �⊗ (��⊗ �� )� = ��2 (A.5)

cuja existência implica que á = �/� ∈ K(�) é solução de (A.1) e � = ��/� resolve o problema em questão. Reciprocamente, se á = �/� satisfaz (A.1), com

Dividindo-se ambos os lados da equação (A.1) por ℎ = mdc(��,��

⊗�� ) ∈ K[�], temos a equação equivalente

��⊗ �� = �, (A.6)

onde � = ��/ℎ,� = (��

⊗ �� )/ℎ é mônico, e � = �� é não nulo.

A equação (A.6) é uma identidade polinomial à qual corresponde um sistema linear cujas incógnitas são os coeficientes de �. A solubilidade desta equação, portanto, depende da solubilidade do seu sistema linear associado. Assim, tudo o que precisamos é determinar um limite superior para o grau de �, a fim de que tenhamos as dimensões do sistema linear associado. Este limite é fornecido pelo seguinte resultado.

Lema A.1.1 ([35], Cap. 22, ğ4). Sejam �,�,�,� ∈ K[�] satisfazendo (A.6), com �,� não nulos e � mônico, � = max¶grau(�) ⊗ 1, grau(�)♢, e seja Ó ∈ K o coeficiente de �m em �. (Como de costume, Ó = 0 se � < 0 ou grau(�) < �.)

Além disso, seja

= ⎧ ︁ ︁ ︁ ︁ ︁ ︁ ︁ ︁ ︁ ︁

grau(�) ⊗ � se grau(�) ⊗ 1 < grau(�) ou

Ó /∈ N ⊗ ¶0,1, . . . , grau(�) ⊗ �♢, Ó caso contrário.

Então, o seguinte se verifica.

1. Ou grau(�) = grau(�) ⊗ �, ou grau(�) = Ó > grau(�) ⊗ � e grau(�) ⊗ 1 ⊙

grau(�). Em particular, grau(�) ⊘ �.

2. Se grau(�) ⊗ 1 ⊙ grau(�), então grau(�) ⊗ � ̸= Ó.

3. Se � = 0, então grau(�) ⊗ 1 ⊙ grau(�) e grau(�) = Ó ∈ N.

4. Se grau(�) ⊗ 1 < grau(�) ou Ó /∈ N, então exatamente um � ∈ � [�] satisfaz a equação (A.6).

Lembramos que o polinômio nulo possui grau ⊗∞, portanto grau(�) ⊗ � deve ser interpretado como ⊗∞ se � = 0. Temos que N ⊖ Q ⊖ K, então qualquer inteiro é também um elemento de K.

Demonstração. Faremos uma comparação de coeficientes e graus em (A.6). Pri- meiramente, temos que

grau(�) ⊘ max¶grau(��), grau(��)♢

max¶grau(�) + grau(�) ⊗ 1, grau(�) + grau(�)♢ = � + grau(�).

Seja Ò o coeficiente de �m+1 em �. Temos que o coeficiente de �m+grau(U ) em ��

é ÒÖ grau(�), onde Ö = cl(�), e o coeficiente de �m+grau(U ) de �� é ÓÖ. Logo, o

coeficiente de �m+grau(U ) em � é (Ò grau(�) ⊗ Ó)Ö, e grau(�) < � + grau(�) se e

só se esse coeficiente é 0.

Se grau(�)⊗1 < grau(�), então Ò = 0 e Ó é o coeficiente (não nulo) de �, donde grau(�) = grau(�) ⊗ �. Caso contrário, temos que Ò = cl(�) = 1. Finalmente, temos que grau(�) ⊙ grau(�) ⊗ �, onde a desigualdade estrita ocorre se e só se grau(�) ⊗ 1 ⊙ grau(�) e grau(�) = Ó. Com isto, provamos as afirmações 1,2 e 3.

Agora, se �*

∈ K[�] é outra solução para (A.6), então � ⊗ �* satisfaz a equação homogênea �(� ⊗ �*)

⊗ �(� ⊗ �*) = 0 e, portanto, a afirmação 4 segue da afirmação 3.

Conhecidos os polinômios �,�,� = �� , podemos, portanto, determinar um limite superior para o grau de �. Se o valor de � é inteiro e não negativo, e se grau(�)⊗1 < grau(�), ou se grau(�)⊗� ̸= Ó, tudo o que precisamos fazer é montar e resolver o sistema linear associado a (A.6) cujas incógnitas são os coeficientes de

. Neste caso, nossa solução para a equação (A.6) é á = �/� ∈ K(�), donde ��/�

é uma integral hiperexponencial de �. Se � é negativo, ou se grau(�) ⊗1 ⊙ grau(�) e grau(�) ⊗ � = Ó, ou se o sistema linear não possui solução, então (A.1) não possui solução racional em á, e, portanto, o problema original não possui solução hiperexponencial. Note que, uma vez que encontramos á = �/� ∈ K(�), é interessante colocar á em sua forma canônica, retirando mdc(�,� ) do numerador e do denominador.

Isto conclui o algoritmo de Almkvist-Zeilberger. A respeito do espaço de soluções do sistema linear associado a (A.6), este é vazio, possui exatamente um elemento, ou é uma variedade afim unidimensional. Neste último caso, em geral, é

preferível escolher por uma solução deste espaço para a qual o polinômio � possua o menor grau possível. O sistema linear em questão é triangular, de modo que pode ser resolvido tão somente através de substituição retroativa, dispensando a eliminação de Gauss, o que leva �(�2) operações em K. Há, no máximo, um 0 na

diagonal, o que ocorre apenas quando grau(�) ⊗ 1 ⊙ grau(�).

A equação A.6 pode ser reduzida ainda mais através das seguintes considera- ções. Temos que mdc(�,�) = mdc(�,�� ) = � e mdc(�,�) = 1, onde � = �� . Pela equação A.6, isso significa que � ♣ �, isto é � = �*. Assim,

�(�*)′⊗ �(�*�) = �� =⇒ �(�*′�+ �*) ⊗ ��*�= ��

=⇒ ��*′

⊗ (� ⊗ �)�* = �. (A.7)

A equação (A.7) pode ser utilizada no lugar da equação (A.6) durante o algoritmo de Almkvist-Zeilberger, de modo que só precisamos encontrar o polinômio �* de

grau � ⊗ grau(�) e então multiplicá-lo por � para obter a solução da equação (A.6) e, consequentemente, do problema de integração. Evidentemente, isso diminui a quantidade de operações do algoritmo, uma vez que o sistema induzido pela (A.7) possui � ⊗ grau(�) equações e � ⊗ grau(�) incógnitas.

A.1.1

Exemplos

Exemplo A.1.1 (extraído de [35], Cap. 22, ğ4). Seja � = �nexp(�) ∈ Q(�, exp(�)),

onde � ∈ N. Como vimos, � é hiperexponencial. Sua derivada logarítmica é

= �+ �

,

donde � = � + � e � = �. �(�) = resx(�,� ⊗ ��′) = resx(�,� + � ⊗ �) = � ⊗ �,

donde �(�) = 0 apenas para � = � e, portanto, � = �. O código A.2.1 calcula

�i = 1 para 1 ⊘ � ⊘ �, e �n= �, donde � = �n.

No códigoA.2.2, temos que �� = �n+1, ��

⊗�� = ⊗�n+1e, portanto, ℎ = �n+1,

�= 1, � = ⊗1 e � = �n. Assim, temos

Temos que � = max¶grau(�)⊗1, grau(�)♢ = 0 > grau(�)⊗1 e, portanto, estamos no primeiro caso do Lema A.1.1, de modo que � = grau(�) ⊗ � = �. Portanto,

= (�n⊗ 1)�n+ (��n+ �n⊗1)�n⊗1+ ≤ ≤ ≤ + (2�2+ �1)� + (�1+ �0).

O sistema linear a resolver se torna

�n⊗ 1 = 0

��n+ �n⊗1= 0

. . .

2�2+ �1 = 0

1+ �0 = 0.

O sistema possui solução única e satisfaz �0 ̸= 0, donde mdc(�,� ) = 1. A resposta

retornada é � = � e � = � = �n, onde = �n+n⊗1i=0 (⊗1)n⊗i�! ! i.

Dessa forma, se � = 3, temos que � = �3

⊗ 3�2+ 6� ⊗ 6 e � = �3. Portanto, ︁ 3exp(�) = (� 3exp(�)) =3⊗ 3�2+ 6� ⊗ 6 3 ︃ (�3exp(�))

= �3exp(�) ⊗ 3�2exp(�) + 6� exp(�) ⊗ 6 exp(�).

De fato,

(�3exp(�) ⊗ 3�2exp(�) + 6� exp(�) ⊗ 6 exp(�))=

(3�2

⊗ 6� + 6) exp(�) + (�3⊗ 3�2+ 6� ⊗ 6) exp(�) = �3exp(�).

Exemplo A.1.2 (extraído de [35], Cap. 22, ğ4). Seja � = 1/� ∈ Q(�). Temos que �/� = ⊗1/� e � = ⊗1, � = �, �(�) = res

x(�, ⊗ 1 ⊗ �) = ⊗(� + 1). Logo,

�= 0 e � = 1. Assim,

Ou seja, � = � = �, � = 1, � = grau(�) = grau(�) ⊗ 1 = 0 e grau(�) ⊗ � = 1 = Ó. Estamos no caso 2 do LemaA.1.1 e a equação acima não possui solução � ∈ Q[�]. Logo ∫(1/�) não é hiperexponencial. Afinal, equivale a log(�), e log(�)/log(�) =

1/(� log(�)) /∈ Q(�).

Exemplo A.1.3 (extraído de [35], Cap. 22, ğ4). Seja � =1/(�2+ 1)3

Q(�,√2+ 1). Temos

= ⊗

3�

2+ 1,

de modo que � = ⊗3�, � = �2+ 1, �(�) = res

x(�2+ 1, ⊗ 3� ⊗ �2�) = (2� + 3)3,

�= 0 e � = 1. Assim

(�2+ 1)�

⊗ 3�� = �2+ 1.

Ou seja, � = � = � = (�2+ 1), � = ⊗� = 3�, � = max¶grau(�) ⊗ 1, grau(�)♢ = 1

e nos encontramos no caso 2 do Lema A.1.1. Agora 1 = grau(�) ⊗ � ̸= Ó = 3, donde, pelo lema grau(�) = Ó = 3. Portanto,

= (2�2⊗ 3�2)�3+ (�1+ 3�3⊗ 3�1⊗ 1)�2+ (2�2⊗ 3�0)� + (�1⊗ 1) O sistema a resolver é ⊗�2 = 0 3�3⊗ 2�1⊗ 1 = 0 2�2⊗ 3�0 = 0 1⊗ 1 = 0.

A única solução é �3 = �1 = 1 e �2 = �0 = 0. Logo, � = �3+ �, � = � e � = 1.

Assim, ︁ 1 ︁ (�2+ 1)3 = (� 3+ �) 1 ︁ (�2+ 1)3 = (�2+ 1). De fato, ⎛ ︁ (�2+ 1) ︀ ︀ ′ = ︁ 1 (�2+ 1)2 ︁ (�2 + 1)3 = 1 ︁ (�2+ 1)3.

Exemplo A.1.4 (gerado com dados obtidos pelos códigos de A.2.1 e A.2.2). Considere a função = 3⊗ 3� + 2 5⊗ 4�3+ 4� Temos = (� + 2)(� ⊗ 1)2 ℎ= �5+ �4⊗ 5�3⊗ �2+ 8� ⊗ 4 = �3⊗ 2� = 5�2⊗ 2 = �6⊗ 5�4+ 2�3 + 6�2⊗ 4� = 2 Ó = 5 �= 5.

O sistema induzido pela equação (A.6) é

⊗2�0 = 0 ⊗4 = 0 2�2+ 5�0+ 6 = 0 4�3+ 4�1+ 2 = 0 6�4+ 3�2⊗ 5 = 0 8�5+ 2�3 = 0 4+ 1 = 0, (A.9) o qual, evidentemente, não possui solução. De fato, para esta função, a rotina

HorOstro, devolve parte logarítmica não nula. Mais precisamente,

= � ⊗ 2 4(�2⊗ 2)+

5� ⊗ 4

sendo �3

⊗ 2� livre de quadrados. Pela equação (A.7), o sistema induzido é ⊗2 = 0

2�1⊗ 3 = 0

4�2+ 2�0 = 0

1+ 1 = 0

o qual, evidentemente, também não possui solução.

Exemplo A.1.5 (gerado com dados obtidos pelos códigos de A.2.1 e A.2.2). Considere a função = 8� 4+ 4�2+ 4 Temos = � ℎ= �2 �= �2+ 2 �= 4� �= �3+ 2� = 1 Ó= 4 �= 4.

O sistema induzido pela equação (A.6) é

⊗2�1 = 0

⊗4�2+ 4�0+ 2 = 0

3�1⊗ 6�3 = 0

⊗8�4+ 2�2+ 1 = 0

cujo espaço de soluções é = ︁ 0 = 4Ú ⊗ 1,�1 = 0,�2 = 8Ú ⊗ 12 ,�3 = 0,�4 = Ú. Portanto, = Ú�4+8Ú ⊗ 1 2 2+ 4Ú ⊗ 1. escolhendo Ú = 0 temos, portanto, � = (⊗1/2)�2⊗ 1 e

= (⊗1/2)� 2⊗ 1 8� 4 + 4�2+ 4 = ⊗ 4 2+ 2

Pela equação (A.7), o sistema induzido é

⊗2�1 = 0

⊗4�2+ 2�0+ 1 = 0

1 = 0

(A.10) cujo espaço de soluções é

= ︁ 0 = 4Ú ⊗ 12 ,�1 = 0,�2 = Ú. Portanto, = Ú�2+4Ú ⊗ 1 2 .

escolhendo Ú = 0 temos, portanto, � = ⊗1/2 e �� = (⊗1/2)�2

⊗ 1.

Exemplo A.1.6 (gerado com dados obtidos pelos códigos de A.2.1 e A.2.2). Considere a função

= 6�10⊗ 13�8 + 16�6+ 8�4+ 10�2 ⊗ 3 3((�4+ 1)(�2+ 1))2 (�

2+ 1)⊗2/3exp(�2),

Q(�) e uma função exponencial, todas funções hiperexponenciais. Temos = 6�10⊗ 13�8+ 16�6+ 8�4+ 10�2⊗ 3 ℎ= 36�20 ⊗ 156�18+ 361�16 ⊗ 320�14+ 168�12 ⊗ 40�10 + 462�8+ 64�6 + 52�4 ⊗ 60�2+ 9 �= 3�6+ 3�4+ 3�2+ 3 = ⊗6�7+ 34�5+ 18�3+ 10� �= 18�16⊗ 21�14+ 27�12+ 51�10+ 63�8+ 93�6+ 45�4 + 21�2 ⊗ 9 = 7 Ó= ⊗6 �= 9.

O sistema induzido pela equação (A.6) é ⊗3�1⊗ 9 = 0 10�0⊗ 6�2 = 0 ⊗9�3 + 7�1+ 21 = 0 12�4 + 4�2+ 18�0 = 0 ⊗15�5+ �3+ 15�1+ 45 = 0 ⊗18�6⊗ 2�4+ 12�2+ 34�0 = 0 ⊗21�7⊗ 5�5+ 9�3+ 31�1+ 93 = 0 ⊗24�8⊗ 8�6+ 6�4+ 28�2⊗ 6�0 = 0 ⊗27�9⊗ 11�7+ 3�5+ 25�3⊗ 6�1+ 63 = 0 ⊗14�8+ 22�4⊗ 6�2 = 0 ⊗17�9⊗ 3�7+ 19�5⊗ 6�3+ 51 = 0 ⊗�8+ 16�6⊗ 6�4 = 0 ⊗9�9+ 13�7⊗ 6�5+ 27 = 0 10�8⊗ 6�6 = 0 7�9⊗ 6�7⊗ 21 = 0 ⊗6�8 = 0 18 ⊗ 6�9 = 0

cuja solução única é

1 = ⊗3, �9 = 3

e os demais coeficientes nulos. Portanto, � = 3�9

⊗ 3�, donde = 3�9⊗ 3� 6�10⊗ 13�8+ 16�6+ 8�4+ 10�2⊗ 3 = 3⊗ � (�2 + 1)(�4+ 1)(� 2+ 1)⊗2/3exp(�2).

Pela equação (A.7), o sistema induzido é ⊗3�1⊗ 3 = 0 4�0⊗ 6�2 = 0 ⊗9�3+ �1+ 10 = 0 ⊗2�2+ 6�0 = 0 ⊗5�3+ 3�1+ 8 = 0 16�0 = 0 ⊗3�3+ 13�1+ 16 = 0 10�2⊗ 6�0 = 0 7�3⊗ 6�1⊗ 13 = 0 ⊗6�2 = 0 6 ⊗ 6�3 = 0

cuja solução única é

1 = ⊗1, �3 = 1

e os demais coeficientes nulos. Portanto, � = �3

⊗ �, e �� = 3�9⊗ 3�.

A.2

Pseudocódigos e Códigos para o Algoritmo

de Almkvist-Zeilberger

Apresentamos agora pseudocódigos e códigos para implementação em Maxima para a integração de funções hiperexponenciais via algoritmo de Almkvist-Zeilberger. Os pseudocódigos foram extraídos de [35, Cap. 22, ğ4].

A.2.1

DenMult

Calcula um polinômio � tal que, caso a equação � = (�/�)�, com �= � possua

solução no par �,�, então � é um múltiplo de �.

1: função DenMult(�,�)

2: descrição: Dado um corpo K de característica 0 e �,� ∈ K[�] com grau(�) <

grau(�), � mônico e coprimo com �, retorna � ∈ K[�], tal que, para quais-

quer coprimos �,� ∈ K[�], a equação (A.2) implica que � divide � .

3: 4: � ⊂ resx(�,� ⊗ ��′) 5: � ⊂ max¶� ∈ N ♣ � = 0 ou �(�) = 0♢ 6: se � = 0 então 7: devolve 1 8: fim se 9: 0 ⊂ �, �0 ⊂ �

10: para � ⊂ 1 até � faça

11: �i ⊂ mdc(�i⊗1,�i⊗1⊗ �i⊗1), �i

�i⊗1⊗ �i⊗1 �i , �i�i⊗1 �i 12: fim para 13: devolve �122≤ ≤ ≤ �dd 14: fim função

Código:

DenMult(A,D,x):= block([expr,expr2,R,i,%Z,d,k,V,Hi,a,b,Ans], algebraic:true, expr:A-%Z*diff(D,x), d:0,k:1,V:1, R:SubRes(D,expr,x)[1], R:LFactor(R,%Z,false), if length(R)=1 then( Ans:1, algebraic:false, return(Ans) ), R:Solve(R,%Z,DomSolve),

while (k<=length(R) and lhs(R[k])#0) do( i:rhs(R[k]),

if integerp(i) and d<i then d:i, k:k+1 ), if d=0 then( Ans:V, algebraic:false, return(Ans) ), a:A, b:D,

for i:1 thru d do( expr2:a-diff(b,x),

Hi:GCD(b,a-diff(b,x),x,0,0), a:expr2/Hi, b:b/Hi, V:V*Hi^i ), Ans:V, algebraic:false, return(Ans) )$

A.2.2

IHF

Algoritmo de Almkvist-Zeilberger. Encontra a integral de uma função hiperexpo- nencial, desde que esta integral seja também uma função hiperexponencial.

Pseudocódigo:

1: função HyperIntegration(�,�)

2: descrição: Dado um corpo K de característica 0 e �,� ∈ K[�] com grau(�) <

grau(�), � mônico e coprimo com �, retorna �,� ∈ K[�], com � mônico,

satisfazendo (A.2) 3: 4: � ⊂DenMult(�,�) 5: ℎ ⊂ mdc(��,��⊗ �� ), � ⊂ �� , � ⊂ ��⊗ �� , � ⊂ �� 6: � ⊂ max¶grau(�) ⊗ 1, grau(�)♢ 7: Ó ⊂ coeficiente(�,�m)

8: se grau(�) ⊗ 1 < grau(�) ou Ó /∈ N então 9: � ⊂ grau(�) ⊗ � 10: senão 11: se grau(�) ⊗ � = Ó então 12: devolve ŞinsolúvelŤ 13: senão 14: � ⊂ max¶grau(�) ⊗ �,Ó♢ 15: fim se 16: fim se 17: se � < 0 então 18: devolve ŞinsolúvelŤ 19: fim se 20: � ⊂ e⊗grau(r)i=0 �i�i 21: � ⊂ � ⊗ ��+ (� ⊗ �)�

22: (�0, . . . ,�e⊗grau(r)) ⊂ solucionador(coeficiente(�,�k) = 0,0 ⊘ � ⊘ � ⊗ grau(�)) 23: se ∄(�0, . . . ,�e⊗grau(r)) ♣ � = 0 então 24: devolve ŞinsolúvelŤ 25: senão 26: devolve �� mdc(��,� ), mdc(��,� ) 27: fim se 28: fim função

Código:

IHF(f,x):= block([A,D,h,r,s,t,m,delta,sigma, e,U,V,H,eq,listu,u,sol,G,Ans], algebraic:true, eq:[], sigma:ratsimp(diff(f,x)/f), A:num(sigma),D:denom(sigma),

if (polynomialp(A,[x]) and polynomialp(D,[x]))=false then error("not a hyperexponential function."),

V:DenMult(A,D,x), h:GCD(D*V,D*diff(V,x)-A*V,x,0,0), r:Group(D*V/h,x), s:Group((D*diff(V,x)-A*V)/h,x), t:Group(r*V,x), m:max(hipow(r,x)-1,hipow(s,x)), delta:coeff(s,x,m),

if hipow(r,x)-1<hipow(s,x) or (integerp(delta) and delta>=0)=false then e:hipow(t,x)-m

else if hipow(t,x)-m=delta then( Ans:"unsolvable", algebraic:false, return(Ans) ) else e:max(hipow(t,x)-m,delta), if e<0 then( Ans:"unsolvable", algebraic:false, return(Ans) ), U:sum(u[i]*x^(i-1),i,1,e-hipow(r,x)+1), H:Group(V-r*diff(U,x)+(s-diff(r,x))*U,x), for k:0 thru hipow(H,x) do(

eq:endcons(coeff(H,x,k)=0,eq) ),

listu:makelist(u[i],i,1,e-hipow(r,x)+1), sol:linsolve(eq,listu),

U:sum(rhs(sol[i])*x^(i-1),i,1,length(sol)), if sol=[] then( Ans:"unsolvable", algebraic:false, return(Ans) ), G:ratsimp(r*U/V), Ans:fullratsimp(G*f), algebraic:false, return(Ans) )$

Documentos relacionados