46 votos

¿Cuál es la complejidad temporal de calcular sin(x) con t bits de precisión?

Versión corta de la pregunta: Presumiblemente, es poli $(t)$ . Pero, ¿qué polinomio, y podría proporcionar una referencia?

Versión larga de la pregunta: Me sorprende preguntar esto, porque es una pregunta que suena muy básica. He aquí algunas variantes de la misma:

  1. ¿Cuánto tiempo se tarda en calcular $\pi$ a $t$ ¿puntos de precisión?
  2. ¿Cuánto tiempo se tarda en calcular $\sin(x)$ a $t$ ¿puntos de precisión?
  3. ¿Cuánto tiempo se tarda en calcular $e^x$ a $t$ ¿puntos de precisión?
  4. ¿Cuánto tiempo se tarda en calcular $\mathrm{erf}(x)$ a $t$ ¿puntos de precisión?
  5. Cuánto tiempo y cuántos bits aleatorios se necesitan para generar una variable aleatoria (discreta) $X$ de manera que haya un acoplamiento de $X$ con una gaussiana estándar $Z \sim N(0,1)$ para lo cual $|X - Z| < \delta$ excepto con una probabilidad máxima de $\epsilon$ ?

En mi área de la teoría de la ciencia de la computación, nadie parece prestar mucha atención a estas cuestiones; la descripción de un algoritmo podría decir típicamente

"Generar dos variables aleatorias gaussianas $Z$ y $Z'$ y comprobar si $\sin(Z \cdot Z') > 1/\pi$ "

o algo así. Pero técnicamente, uno debería preocuparse por la complejidad del tiempo aquí.

Un colega que es más experto en estas cosas me aseguró que todas esas "funciones de calculadora" llevan como mucho un tiempo poli $(t)$ . Creo que esto es cierto. Pero de nuevo, ¿qué polinomio (por curiosidad, al menos), y cuál es la referencia?

Supuse que las respuestas estarían en todos los libros de texto de análisis numérico, pero no pude encontrarlas. Parece (quizás razonablemente) que el análisis numérico se preocupa principalmente de obtener las respuestas con una precisión fija como 32 o 64 bits o lo que sea. Pero es de suponer que alguien ha pensado en obtener los resultados con una precisión arbitraria, ya que se puede escribir

Digits := 5000; erf(1.0);

en Maple y te dará una respuesta de inmediato. Pero parecía difícil de encontrar. Después de mucho buscar, di con la frase clave "algoritmo no restringido" que me llevó al artículo "An unrestricted algorithm for the exponential function", Clenshaw-Olver-1980. Es bastante difícil de leer, ya que analiza la complejidad temporal para $e^x$ en términos de ocho (??!) parámetros, pero su ecuación (4.55) parece dar algunas respuestas: quizás $\tilde{O}(t^2)$ suponiendo que $|x|$ es constante?

Y realmente, todo ese trabajo para el pequeño $e^x$ ? En cuanto a erf $(x)$ En el año 2009 encontré el artículo "The functions erf and erfc computed with arbitrary precision" de Chevillard. Era más fácil de leer, pero todavía me llevaría algún tiempo extraer la respuesta; mi primera impresión fue $\tilde{O}(t^{3/2})$ . Pero, de nuevo, seguro que esta cuestión no se investigó por primera vez en 2009, ¿verdad?

(Por cierto, la pregunta #5 es la que realmente quiero saber la respuesta, pero probablemente pueda resolverla a partir de la respuesta a la pregunta #4).

20voto

THEMike Puntos 515

Para conocer los algoritmos aritméticos más avanzados, recomiendo este libro (un trabajo en curso), disponible en línea, de Brent y Zimmermann: http://www.loria.fr/~zimmerma/mca/pub226.html Véase el capítulo 4.

Como señala Steve, las funciones log, exp y trig son $O(M(n) \log n)$ (de hecho, todos se calculan a partir del registro), donde $M(n)$ es el coste de la multiplicación (teóricamente $O(n\log n 2^{\log^*n})$ por el algoritmo de Furer) y $n$ es el número de bits de precisión. Pi también entra en esta complejidad. Sin embargo, esto es sólo en teoría; para menos de mil millones de dígitos otros algoritmos con peor asintótica son más rápidos.

Erf es aparentemente más difícil, el libro da algunos algoritmos basados en series de potencia y fracciones continuas, pero evita dar un coste computacional explícito ya que hay diferentes velocidades de convergencia en diferentes regiones.

19voto

Rakesh Juyal Puntos 203

$\pi$ se puede calcular con el serie BBP hexadecimal aunque aparentemente hay formas más rápidas conocidas de computar todos los bits hasta cierto nivel.

Knuth atribuye a Brent JACM 23, 242 (1976) el resultado que $\log$ , $\exp$ y $\arctan$ se puede calcular para $n$ bits significativos en $O(M(n)\log n)$ donde $M(n)$ es la complejidad de la multiplicación para $n$ -números de bits. Para información más reciente las citas de este son probablemente una buena apuesta.

12voto

x-way Puntos 196

Dejaré que otros respondan con los resultados teóricos.

Sin embargo, en la práctica, los sistemas de producción (como Maple, Mathematica, GMP, etc.) utilizan polialgoritmos (a veces llamado híbrido algoritmos) que son una colección de métodos. Tomando erf como ejemplo, para entradas reales, se utilizan series asintóticas para entradas grandes (en valor absoluto), y una aproximación de Chebyshev-Pade para valores pequeños. Para entradas complejas, el espacio se divide de forma similar en regiones, y se pueden utilizar diversos métodos: series de Laurent, series de Puiseux, aproximaciones de Chebyshev-Pade, fracciones continuas, etc. Las técnicas de reducción de rangos y de reflexión también son bastante comunes. Así que la respuesta a "¿Cuál es la complejidad temporal de XXX?" es realmente "depende". En otras palabras, en la práctica, los sistemas de producción pueden calcular con frecuencia respuestas que parecen desafiar los resultados teóricos porque éstos se basan en algoritmos uniformes mientras que las implementaciones prácticas se basan en algoritmos adaptativos.

Pero parece que algunos trabajos muy recientes sobre cálculos numéricos para funciones D-finitas pueden dar la vuelta a todo esto. Véase NumGfun: un paquete para el cálculo numérico y analítico con funciones D-finitas por Marc Mezzarobba [el código completo está disponible como parte del gfun biblioteca].

4voto

Andrea Puntos 138

Echa un vistazo al libro de Ker-I Ko o a su encuesta. Ahora mismo no tengo el libro conmigo. En el libro de Weirauch puedes encontrar lo siguiente:

"En subespacios compactos de sus dominios las funciones reales exp, sin, cos, tan, y su inversa pueden ser calculadas en tiempo $t_m(k)\log(k)$ ."

Donde $t_m(k)$ es el tiempo necesario para calcular los primeros k dígitos de la multiplicación (de dos números reales) que es $O(k^2)$ . Esto es de la página 229. En la introducción menciona que la multiplicación, $\sin$ , $\exp$ y $\log$ se puede calcular en tiempo $O(k^2)$ .

--

Ker-I Ko, "Polynomial-time computability in analysis", en "Handbook of Recursive Mathematics", volumen 2, Recursive Algebra, Analysis and Combinatorics, Yu. L. Ershov y otros, Eds., 1998, pp. 1271-1317. http://www.cs.sunysb.edu/~keriko/encuesta3.ps

Ker-I Ko, "Computational Complexity of Real Functions", Birkhauser, 1991

Klaus Weihrauch, "Análisis computable: An Introduction", (Texts in Theoretical Computer Science. An EATCS Series), Springer, 2000

2voto

TomvB Puntos 131

Pruebe el capítulo 5 de Funciones elementales, algoritmos y aplicación por Jean-Michel Muller.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X