¿Se acaban de descifrar usando un enfoque de fuerza bruta o hay un algoritmo para hacerlo?¿Cómo se programan los logaritmos?
Respuesta
La implementación de una función como el logaritmo natural en cualquier biblioteca matemática decente mantendrá el error debajo de un ulp (unidad de menor precisión). El objetivo del implementador de una función de biblioteca matemática es encontrar una aproximación óptima, una que logre la precisión deseada con el menor número de cálculos posible. Las series de Taylor son generalmente una opción pobre porque se necesitan demasiados términos para lograr la precisión deseada.
Las armas típicas de elección son reducir el rango de todos los números reales representables a una región muy pequeña, y luego usar una aproximación óptima que produzca una aproximación precisa de la función deseada en este estrecho rango. Las armas típicas de elección para esta aproximación óptima son un polinomio o un polinomio racional (relación de dos polinomios). La implementación solo contiene los coeficientes polinomiales. Esos coeficientes se construyen mediante alguna técnica de optimización, como el algoritmo Remes Exchange.
En el caso del logaritmo natural, hay una manera fácil de reducir el rango. Los números reales son casi universalmente representados en términos de una mantisa y un exponente: x = m * 2 p, donde p es un entero y m es entre 1 y 2. Por lo tanto log (x ) = registro ( m) + p * log (2). El último término, p * log (2), es solo una multiplicación por una constante conocida. El problema se reduce a encontrar el logaritmo de un número entre 1 y 2 (o entre 1/2 y 1). Se puede hacer una reducción de rango adicional usando el hecho de que √2 es logarítmicamente en el medio de [1,2). Por lo tanto, todo lo que se necesita es una forma de calcular el logaritmo de un número entre 1 y √2. Esto se hace típicamente con un polinomio racional. La relación de un polinomio polinómico de segundo orden a un tercer orden funciona muy bien para esto.
.5 ULP es un objetivo ambicioso; es lo mismo que redondeado correctamente, lo que significa que debe devolverse el número representable más cercano al resultado matemáticamente exacto. El proyecto CRlibm (http://lipforge.ens-lyon.fr/www/crlibm/) intenta hacer esto, pero está incompleto (p. Ej., No se proporcionan funciones hiperbólicas inversas). El redondeo fiel (menos de 1 ULP) es un objetivo más alcanzable, y las bibliotecas típicas permiten errores de varios ULP. Se evitan funciones racionales ya que la división es lenta en procesadores comunes. Por ejemplo, una tangente podría usar una función racional, pero el seno y el logaritmo usarán polinomios simples. –
Buen comentario. 0.5 ULP es demasiado ambicioso.Con respecto a los polinomios racionales versus los simples: los racionales pueden ser mejores si la reducción en el grado más que compensa el mayor costo de una división frente a una multiplicación. Encontré varias implementaciones de 'log' que usan un polinomio racional. Log es una función muy buena en cuanto a la aproximación. Los peores errores de caso ocurren con números cerca de la unidad, e incluso aquí el error puede mantenerse dentro de un ULP. –
Reducir el rango a [1.0, 2.0) produce errores grandes cerca del registro (0.999 ...), como comentó David Hammen. Las implementaciones que conozco evitan este problema al reducir a un rango que tiene 1.0 en el interior, como [2/3, 4/3) o [sqrt (0.5), sqrt (2.0)]. En términos de programación, es solo un par de instrucciones adicionales para hacer esto: if (m> constante) {p + = 1; m * = 0.5;} –
Existen varias formas de calcular logaritmos. Ver this.
-1. No son "calculados principalmente por las aproximaciones de la serie Taylor". –
He actualizado la respuesta para no decir eso más. – Oleksi
Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/18788146) – Syfer
- 1. sockets que programan gfortran
- 2. base de logaritmos en algoritmos de complejidad de tiempo
- 3. Valores propios de precisión cuádruple, vectores propios y logaritmos de matriz
- 4. ¿Cómo se calculan los exponentes?
- 5. cómo se agrupan los subformularios
- 6. ¿Cómo se consigue que los contactos se agreguen correctamente cuando se los agrega programáticamente?
- 7. ¿Los ActionFilterAttributes se reutilizan en los subprocesos? ¿Cómo funciona?
- 8. ¿Cómo se manejan los subproyectos con autotools?
- 9. ¿Cómo se organizan los módulos de Python?
- 10. ¿Cómo se organizan los módulos de NInject?
- 11. ¿Cómo se "refactorizan" los archivos ant build.xml?
- 12. javascript internals: cómo se implementan los eventos?
- 13. ¿Cómo se analizan los atributos en Boost.PropertyTree?
- 14. ¿Cómo se asignan los subprocesos IIS7?
- 15. ¿cómo se comunican los hilos entre sí?
- 16. ¿Cómo se importan los archivos non-node.js?
- 17. phpMailer - Cómo se eliminan los destinatarios
- 18. ¿Cómo se compilan los métodos de extensión?
- 19. ¿Cómo se ven los símbolos de depuración?
- 20. ¿Cómo se enumeran los identificadores del proceso?
- 21. ¿Cómo se comunican los programas entre sí?
- 22. HDFS: ¿Cómo se enumeran los archivos recursivamente?
- 23. Cómo se asignan los eventos en .NET
- 24. Cómo se firman los archivos .apk
- 25. ¿Cómo se especifican los tamaños de PDF?
- 26. ¿Cómo se imprimen los archivos XPS?
- 27. ¿Cómo se promedian los intervalos de tiempo?
- 28. ¿Cómo se usan los marcos de CSS?
- 29. ¿Cómo se analizan los archivos XML?
- 30. Moq ¿cómo se prueban los métodos internos?
'fuerza bruta' y 'algoritmo' no son mutuamente excluyentes, su pregunta presenta una dicotomía falsa. Y la respuesta es, SÍ, hay un algoritmo para hacerlo. –
Ah, me siento tonto de haber olvidado que la fuerza bruta en realidad era un algoritmo. Gracias. – Taffer
"fuerza bruta" es una propiedad de los algoritmos, donde se aplica más poder de cómputo para salirse con menos pensamiento (que podría haber usado para encontrar un algoritmo menos bruto). – starblue