Hay una biblioteca GPL'd C, ANANT - Algorithms in Analytic Number Theory de Linas Vepstas, que incluye la implementación de multiprecisión del polilogaritmo, basado en GMP .
Desde su archivo README:
Este proyecto contiene implementaciones ad-hoc de diversas funciones analíticas de interés en la teoría de números, incluida la función gamma, la función zeta de Riemann, el polilogaritmo y la función de signo de interrogación de Minkowski. La implementación utiliza la biblioteca Gnu Multi-Precision (GMP) para realizar todas las operaciones de bajo nivel. El código en este documento tiene licencia bajo los términos de la licencia Gnu GPLv3.
La GSL (GNU Scientific Library) aparentemente solo tiene la función de dilogaritmo . Sin embargo, siguiendo una pista de @JM, se encuentra la función Debye que proporciona la integral ulterior (hasta un múltiplo escalar) implementada con doble precisión (consulte GSL 7.10 Órdenes de funciones Debye 1 a 6):
renorte( x ) = nXnorte∫X0 0tnorteretmit- 1
El software de integración simbólica como Mathematica o Maxima proporciona:
∫X0 0t3retmit- 1= 6 Li4 4( eX) - 6 x Li3( eX) + 3 x2Li2( eX) + x3Iniciar sesión( 1 - eX) - x4 44 4- π4 415
El lado izquierdo es obviamente un valor puramente real si , pero los polilogaritmos mostrados tendrán un valor complejo (porque , por lo que la igualdad depende de la cancelación total de partes imaginarias). Podemos evitar la necesidad de aritmética compleja en este caso sustituyendo la expresión:x > 0miX> 1
∫X0 0t3retmit- 1= - 6 Li4 4( e- x) - 6 x Li3( e- x) - 3 x2Li2( e- x) - x3Li1( e- x) + π4 415
Esto es una mejora porque con los argumentos de pollogaritmo en , los resultados son valores puramente reales. Tenga en cuenta el resultado adecuado cuando es cero, y esto se logra mediante la cancelación entre el término inicial y la constante. Por lo tanto, el error relativo podría ser un problema para pequeños valores positivos de .[ 0 , 1 ]x = 0X
Tenga en cuenta que nuestra misteriosa constante es el límite superior limitante en estas integrales (monótonas):π4 4/ 15
∫∞0 0t3retmit- 1= Γ ( 4 ) ζ( 4 ) = 6 ⋅ π4 490
Ahora podemos volver a la pregunta del título, ¿Cómo usar la función de polilogaritmo en c ++? Vale la pena señalar que no existe una implementación estándar de funciones de polilogaritmo para C o incluso C ++ . Si el objetivo es evitar cualquier biblioteca adicional para su implementación, lo bastante bien lo lleva a desarrollar sus propias rutinas, tal vez en la línea sugerida por el documento de David C. Wood al que enlaza la Respuesta de GertVdE.
Además de las rutinas de multiprecisión sugeridas en la primera parte de mi Respuesta, hay una biblioteca matemática de doble precisión madura (gratuita) en Cephes por Stephen L. Moshier que implementa versiones reales ( polylog
) y complejas ( cpolylog
) de las funciones especiales del polilogaritmo. Aunque su precisión depende en parte de las funciones matemáticas estándar subyacentes de C, la documentación fuente de Cephes informa sobre las pruebas y los errores teóricos máximos para las órdenes 1 a 4 en aproximadamente los límites de la doble precisión.
Alternativamente, es posible que desee utilizar otro software para verificar directamente (sin hacer referencia a los policlogaritmos) las rutinas de cuadratura que escribió para su integral. Como esbozo en esta pregunta de Math.SE , la serie de potencia centrada en el origen de la integral tiene una convergencia limitada, pero esto se puede mitigar mediante el uso de una expansión de fracción continua en su lugar.
Para una satisfacción inmediata, recomiendo las rutinas QUADPACK de cuadratura numérica (gratis) incluidas en Maxima , específicamente quad_qag
. Por ejemplo, encuentre la integral sobre [0,5] con este comando Maxima:
(%i1) quad_qag(x^3/(%e^x - 1), x, 0, 5, 2);
(%o1) [4.899892158330582,5.4399730923588665*10^-14,21,0]
De los argumentos de entrada, solo el último lleva una explicación. El quinto argumento para quad_qag
especificar qué regla aplicar en la cuadratura adaptativa. Los valores posibles son de 1 a 6 y ofrecen una sofisticación / precisión cada vez mayor. La línea de salida proporciona primero la cuadratura numérica, seguida de una estimación de su error absoluto, el número de subintervalos / pasos utilizados y un código de retorno (aquí cero significa que no se encontraron errores o condiciones especiales).