Que se calcula más rápido,

10

Que se calcula más rápido, o log a c o b ablogac ? un,bycson números reales positivos conb>1.cbabcb>1

¿Qué tipo de algoritmos usarás en la comparación? ¿Cuáles son sus complejidades?

Por ejemplo, cuando o c a bcabcab

Esta pregunta se inspiró en los comentarios sobre la pregunta de intercambio de pila de Matemáticas ¿Cuál es el propósito de la aproximación de Stirling a un factorial? . Especialmente, esos comentarios dejados por mjqxxxx , Thomas Andrews y yo.

Tim
fuente
Los moderadores también pueden, aparentemente, aprobar ediciones. Estoy de acuerdo con la sugerencia de @ MarkBooth y la he incorporado a la pregunta como él sugirió.
Aron Ahmadia
Siéntase libre de ordenar (eliminar) los comentarios ahora que han cumplido su propósito. * 8 ')
Mark Booth

Respuestas:

8

Vea mi respuesta a esta pregunta para algunos problemas relacionados.

En general, las computadoras solo pueden sumar, restar, multiplicar, dividir y desplazar bits. Por el bien del argumento, vamos a suponer que usted está no calculando en el caso especial de que una es una potencia de 2 y b es un número natural, porque ese caso se reduce a un desplazamiento de bits, y es por lo tanto fácil.abab

Si es un número natural y desea calcular a b , puede usar la exponenciación de la cadena de suma . Cualquier otro caso en su pregunta es difícil (en general).bab

Algunos algoritmos rápidos utilizados para aproximar estas funciones a alta precisión requieren magia negra. Para ver a qué me refiero con "magia negra", eche un vistazo a esta publicación de blog de Martin Ankerl y un artículo asociado al que se vincula en Neural Computation . Vea también el algoritmo CORDIC .

Se explican tipos similares de trucos de cambio de bits en Hacker's Delight (el enlace está en el sitio web complementario del libro).

Otras formas de calcular buenas aproximaciones utilizan el análisis numérico (vea el artículo de Wikipedia sobre la teoría de la aproximación ). Una mala manera de hacerlo es armar una ecuación diferencial apropiada e integrarla usando un método numérico como el método de Euler (como dije, una mala aproximación, pero puedes hacerlo). Una mejor manera de hacerlo es usar aproximaciones en serie. La serie de Taylor converge demasiado lentamente, por lo que se podría utilizar en su lugar una aproximación de Padé o algún otro tipo de aproximación de serie de convergencia rápida (otros aproximantes racionales, series de Chebyshev, etc.).

El algoritmo que use para aproximar las funciones anteriores dependerá de su arquitectura, requisitos de velocidad y requisitos de precisión.

El problema al hablar de complejidades es que cualquier algoritmo solo va a calcular una aproximación de coma flotante de las funciones que menciona, por lo que el tiempo de ejecución dependerá de la precisión que exija de su aproximación. Incluso teniendo esto en cuenta, no creo que la complejidad computacional sea una buena primera aproximación del rendimiento; el tamaño de sus entradas va a ser medida en bits (es decir, el número de bits que toma para representar , b , y cabc), que dependerán de la precisión, en lugar de depender de las magnitudes de las entradas numéricas mismas. Para fines prácticos, la precisión de la representación numérica de los números no va a variar mucho (precisión simple, precisión doble, precisión cuádruple), y generalmente no decide usar esa precisión en función de las estimaciones de complejidad computacional de las funciones escalares . La métrica más relevante es el tiempo del reloj de pared, y a menos que esté utilizando una arquitectura especial (sistemas integrados) o su aplicación realmente exija un exponencial rápido (vea el enlace de la publicación del blog y el enlace de Computación Neural arriba), las bibliotecas intrínsecas en su el idioma de elección probablemente esté bien.

Geoff Oxberry
fuente
4

Esta es una buena pregunta porque comprender los algoritmos numéricos y el rendimiento es un requisito previo importante para ser un científico computacional efectivo. Al mismo tiempo, es una pregunta pobre porque las restricciones que se presentan no lo califican lo suficiente como para dar una respuesta significativa.

abcdn

M2

dn=2|M|+1

Por ejemplo, el número -8 se puede representar con 4 dígitos binarios. Para el rendimiento y la eficiencia espacial, las unidades lógicas aritméticas (ALU), responsables de los cálculos numéricos de los enteros en las unidades de procesamiento modernas, están diseñadas para manejar las matemáticas en los enteros de hasta un tamaño fijo, el más común en estos días es d = 32 y d = 64) No solo los procesadores x86 como en su computadora tienen ALU, sino que son un componente fundamental de la arquitectura de la computadora ubicua en la sociedad electrónica actual. Si está familiarizado con las consolas de videojuegos, es posible que recuerde la Nintendo 64, un sistema de videojuegos que lleva el nombre del tamaño (en bits), las unidades lógicas aritméticas en el procesador de la consola fueron diseñadas para manejar.

xx

nbb=2b=10sex entonces se representa aproximadamente como:

x=sbe

13dn.

Se ha invertido una gran cantidad de esfuerzo intelectual en los últimos 50 años para mejorar la capacidad del procesador para calcular las operaciones aritméticas de punto flotante de manera eficiente. En los procesadores modernos, estos cálculos son manejados por una o más unidades de punto flotante (FPU), una versión más sofisticada de la unidad de lógica aritmética diseñada para realizar operaciones aritméticas en números de punto flotante y generalmente diseñada para manejar ambos 32 especificados por IEEE 754 números de coma flotante de bits (a menudo denominados 'flotantes') y números de coma flotante de 64 bits (a menudo denominados 'dobles') de manera eficiente. Al igual que las unidades lógicas aritméticas, las unidades de coma flotante a menudo pueden calcular la suma, la resta y la multiplicación en solo unos pocos ciclos, mientras que la división generalmente requiere un poco más.

abc

  1. ab
  2. ac
  3. c1b

1 La exponenciación general a menudo se implementa con la siguiente identidad:

ab=βalogβb

β2eβ=2abt=alog2b2t

FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 ciclos

2 Esto se puede transformar en dos logaritmos y una división por el cambio de identidad de base y no necesita reescalar para obtener un resultado preciso.

2 * FYL2X + FDIV = 2 * 80 + (7 a 27) = 167 a 187 ciclos

[3] Esto es equivalente a una división seguida de una exponenciación, entonces [1] más FDIV, ~ 175 ciclos.

Aron Ahmadia
fuente
0

Déjame ver si puedo parafrasear la pregunta:

abloga(c)a

Respuesta : realmente depende de si c tiene o no dependencia de a, y de cómo a se compara con b (mayor que, menor que o igual).

cba

cloga(c)=ln(c)/ln(a)loga(c)abaab=ω(loga(c))

c=abloga(ab)=bbabloga(c)ab=ω(loga(c))

cababc=Θ(ab)

loga(c)c1/b

abc

cc1/bbc1/b=o(loga(c))

c=abloga(c)=ac1/b=aloga(c)=Θ(c1/b)

cababc

c1/bab

cc1/babc1/b=o(ab)

c=abc1/b=ab>1abc1/b

abc

Paul
fuente
Dividiré mis comentarios en dos partes: estilística y contenido. Estilísticamente, aprecio que hayas incluido ecuaciones en tu publicación. Vuelva a formatearlos para usar MathJax para que se reproduzcan bien (como, por ejemplo, en la pregunta publicada). Para aprovechar MathJax, use la notación LaTeX cuando escriba sus ecuaciones. Para obtener una introducción a la escritura de matemáticas en LaTeX, consulte esta guía en Wikilibros , o esta breve guía de la American Mathematical Society .
Geoff Oxberry
ablogca