Existe uma biblioteca C da GPL, ANANT - Algorithms in Analytic Number Theory, de Linas Vepstas, que inclui a implementação multiprecisão do polilogaritmo, com base no GMP .
Do seu arquivo LEIA-ME:
Este projeto contém implementações ad-hoc de diversas funções analíticas de interesse na teoria dos números, incluindo a função gama, a função Riemann zeta, o polilogaritmo e a função de ponto de interrogação de Minkowski. A implementação usa a biblioteca Gnu Multi-Precision (GMP) para executar todas as operações de baixo nível. O código aqui é licenciado sob os termos da licença Gnu GPLv3.
Aparentemente, a GSL (GNU Scientific Library) possui apenas a função de dilogaritmo . No entanto, seguindo uma dica do @JM, encontra-se a função Debye, que fornece a integral ulterior (até um múltiplo escalar) implementada em dupla precisão (consulte GSL 7.10 Debye Functions, pedidos de 1 a 6):
Dn( x ) = nxn∫x0 0tndtet- 1
Software de integração simbólica, como Mathematica ou Maxima, fornece:
∫x0 0t3dtet- 1= 6 Li4( ex) - 6 x Li3( ex) + 3 x2Li2( ex) + x3registro( 1 - ex) - x44- π415
O lado esquerdo é obviamente um valor puramente real se , mas os polilogaritmos mostrados serão de valor complexo (porque e, portanto, a igualdade depende do cancelamento total de partes imaginárias). Podemos evitar a necessidade de aritmética complexa neste caso, substituindo a expressão:x > 0ex> 1
∫x0 0t3dtet- 1= - 6 Li4( e- x) - 6 x Li3( e- x) - 3 x2Li2( e- x) - x3Li1( e- x) + π415
Isso é uma melhoria porque, com argumentos de polilogaritmo em , os resultados são valores puramente reais. Observe o resultado apropriado quando é zero, e isso é obtido pelo cancelamento entre o termo inicial e a constante. Assim, o erro relativo pode ser um problema para pequenos valores positivos de .[ 0 , 1 ]x = 0x
Observe que nossa constante misteriosa é o limite superior limitador dessas integrais (aumento monótono):π4/ 15
∫∞0 0t3dtet- 1= Γ ( 4 ) ζ( 4 ) = 6 ⋅ ¸490
Agora podemos revisitar a pergunta do título: Como usar a função polilogaritmo em c ++? Vale ressaltar que não há implementação padrão de funções de polilogaritmo para C ou mesmo C ++ . Se o objetivo é evitar qualquer biblioteca adicional para sua implementação, é muito bom que você role suas próprias rotinas, talvez seguindo as linhas sugeridas pelo artigo de David C. Wood ao qual a resposta de GertVdE está vinculada.
Além das rotinas de multiprecisão sugeridas na primeira parte da minha resposta, existe uma biblioteca matemática de precisão dupla (livre) madura em Cephes, de Stephen L. Moshier, que implementa as versões real ( polylog
) e complexa ( cpolylog
) das funções especiais do polilogaritmo. Embora sua precisão dependa em parte das funções matemáticas padrão subjacentes de C, a documentação da fonte Cephes relata testes e erros teóricos de pico para pedidos de 1 a 4, aproximadamente nos limites da precisão dupla.
Como alternativa, você pode usar outro software para verificar diretamente (sem referenciar polilogaritmos) as rotinas de quadratura que você escreveu para sua integral. Como esboço nesta pergunta Math.SE , a série de potências centrada na origem da integral tem convergência limitada, mas isso pode ser atenuado usando uma expansão de fração contínua.
Para gratificação imediata, recomendo as rotinas QUADPACK de quadratura numérica (gratuita) incluídas no Maxima , especificamente quad_qag
. Por exemplo, encontre a integral acima de [0,5] com este comando Maxima:
(%i1) quad_qag(x^3/(%e^x - 1), x, 0, 5, 2);
(%o1) [4.899892158330582,5.4399730923588665*10^-14,21,0]
Dos argumentos de entrada, apenas o último tem uma explicação. O quinto argumento quad_qag
especifica qual regra aplicar em quadratura adaptativa. Os valores possíveis são de 1 a 6 e oferecem sofisticação / precisão crescentes. A linha de saída fornece primeiro a quadratura numérica, seguida por uma estimativa de seu erro absoluto, o número de subintervalos / etapas usados e um código de retorno (aqui zero significa que não há erro ou condições especiais encontradas).