¿Se necesita la misma cantidad de recursos para que una máquina sume / multiplique dos números pequeños y dos grandes?

Depende de su definición de “grande” y “pequeño”.

Para la mayoría de las computadoras en estos días, la computadora no hará prácticamente nada diferente para calcular 7 + 16 o 47232 + 3213124. En la mayoría de los casos, el hardware de la computadora está configurado para agregar o multiplicar dos números menores que [math] 2 ^ {32} [/ math] o [math] 2 ^ {64} [/ math] usando una pieza de propósito general de hardware, independientemente del tamaño real de los números en ese rango.

La mayoría de las computadoras en estos días también tienen hardware especial para agregar y multiplicar “números de punto flotante”, que generalmente ocupan más espacio en la memoria y tienen una relación complicada con precisión y escala. Hay algunos números de coma flotante donde [math] a + 1 = a [/ math] es una declaración verdadera, y hay algunos números reales comunes que no se pueden expresar con precisión como un número de coma flotante. No estoy hablando de cosas como [math] pi [/ math] o [math] e [/ math], sino de cosas como 0.1 Pero en general, agregar dos números de coma flotante usa los mismos recursos independientemente de la escala de los números , y lo mismo ocurre con la multiplicación.

Pero cuando se trata de eso, [matemáticas] 2 ^ {64} [/ matemáticas] es un número relativamente pequeño. Y cuando te vuelves más alto que eso, las cosas se complican y comienzan a ser necesarios más recursos.

Por ejemplo, para determinar la primalidad de un número grande aleatorio en el rango de [math] 2 ^ {2048} [/ math], como sería necesario para generar un par de claves para el criptosistema de clave pública RSA, requiere multiplicar los números juntos en el rango de [math] 2 ^ {1024} [/ math], que es mucho mayor que [math] 2 ^ {64} [/ math].

Para hacer eso, los algoritmos necesitan más recursos, en tiempo y memoria, para hacer las multiplicaciones y adiciones. Se han escrito libros completos sobre cómo hacerlo de manera eficiente y las compensaciones de los diferentes métodos.

Entonces, si piensa en 3213124 como “grande”, entonces no, no requiere más recursos. Pero si piensa en [matemáticas] 2 ^ {1000} = 1.07 \ veces10 ^ {301} [/ matemáticas] como “grande”, entonces sí, requiere más recursos.

En realidad depende del problema. Las computadoras entienden las entradas en términos de dígitos binarios (bits). Entonces, cuanto mayor sea el número, mayor será la longitud de la cadena de bits. Por lo tanto, para representar un gran número a través de la computadora, necesita un almacenamiento más grande. Aunque el almacenamiento para una gran cantidad es muy inferior en términos de los dispositivos de almacenamiento actuales. Por ejemplo, para almacenar un número entero con signo (es decir, puede ser positivo o negativo) menos de 32k (precisamente, menos de 2 ^ 32) requiere menos de 10 bytes de almacenamiento. Pero un número con mayor magnitud puede requerir algunos bits más, pero aún así no alcanzará un tamaño de 1 kilobyte (1 KB).

También es cierto que tales tamaños realmente dependen de la arquitectura de la computadora y del lenguaje de programación utilizado para almacenarlos. Pero el tamaño varía comparativamente.

Ahora, una operación de suma produce un resultado de la misma longitud de sus dos entradas. Pero una multiplicación produce un resultado de dos veces la longitud en comparación con sus dos entradas. Por lo tanto, a veces la longitud también aumenta dúo a las operaciones realizadas en las entradas.

Aquí hay muchas buenas respuestas, pero en su mayoría suponen que el único recurso consumido es el tiempo. El otro recurso a considerar es el poder. Es posible que la suma de números pequeños consuma menos energía que la suma de números grandes, incluso dentro de los límites de un operando fijo o un tamaño de registro.

Las consideraciones de poder a menudo surgen en la informática móvil y en la criptografía, donde el análisis de poder es una técnica sólida para derrotar a las primitivas criptográficas mal implementadas. Por lo general, funciona a nivel de diferentes etapas del algoritmo. El trabajo de computación móvil a menudo estima la potencia por instrucción y busca optimizar la combinación de instrucciones para lograr baja potencia.

Pero, el consumo de energía también se puede modelar a nivel de compuertas individuales y subcomponentes. Por ejemplo, este documento examina el consumo de energía de diferentes tipos de sumadores: http://citeseerx.ist.psu.edu/vie … “Estimación teórica del consumo de energía en sumadores binarios” (1998) por Robert A. Freking y Keshab K Parhi. Un punto clave hecho allí es que las diferentes transiciones de estado dentro del sumador tienen diferentes características de potencia.

Si bien no tengo los conocimientos de ingeniería eléctrica adecuados para darle una respuesta técnica, en un nivel básico se necesita energía para cambiar una puerta lógica de un estado a otro. (De hecho, Feynmann demostró un modelo teórico en el que el consumo de energía puede ser tan bajo como se desee, si está dispuesto a esperar arbitrariamente una respuesta). Eso significa que las adiciones que provocan el cambio de más puertas consumirán más energía que las adiciones donde pocas interruptor de puertas

El enfoque de menor potencia, entonces, es agregar los mismos dos números una y otra vez. 🙂 Pero, si tiene un sumador de 64 bits, agregar muchos números aleatorios de 4 bits dejará la mayoría de las puertas en el mismo estado, en comparación con la adición de muchos números aleatorios de 64 bits, lo que provocaría que más puertas cambien de estado. Sin embargo, esta afirmación depende de muchos detalles técnicos de la implementación de la CPU, por ejemplo, si el sumador se usa para otros fines (como aumentar el contador de instrucciones) o si se borra o se quita potencia entre las operaciones.

Tenemos que tener un poco de cuidado aquí … algunos otros que respondieron a esta pregunta no están claros.

Si escribo (en un lenguaje fuertemente tipado como C ++) algo como:

int a = b * c;

int d = e + f;

… entonces el tiempo que lleva evaluar esas declaraciones no depende de los valores de b, c, e o f. El hardware aritmético los tratará a todos como (probablemente) números de 32 bits, independientemente de sus valores.

Pero si me pidiera que escribiera un programa para multiplicar dos números que * sabía * que solo tenían 16 bits de longitud, entonces podría ahorrar tiempo (al menos en algunos tipos de CPU) declarando que las variables son “short int” en lugar de que “int”. Ese sería típicamente el caso en las CPU de 8 y 16 bits que no implementan aritmética de 32 bits en el hardware.

Dicho esto, hay algunos lenguajes, como JavaScript, que almacenan variables de una manera más ad-hoc … un número puede almacenarse como un entero, un flotante o incluso como una cadena. Entonces, incluso la aritmética de aspecto más simple se complica por el hecho de que el intérprete de JavaScript tiene que verificar la representación * real * de cada uno de los números cada vez que se realiza la operación. Bien podría ser que la implementación subyacente probaría de alguna manera para ver si un número encajaría en menos bits y elegiría un método de multiplicación más eficiente.

No seré un caso atípico y diré que “depende”.

En un número entero de bits “moderno x86” de longitud fija (8,16,32,64), agregue 1 tic de procesador, multiplicaciones de longitud fija – alrededor de 3. Y eso no importa qué números esté agregando o multiplicando.

La longitud fija de punto flotante agrega / multiplica nuevamente toma ~ 4 ticks por operación.
Por supuesto, no estamos contando los ticks necesarios para cargar / almacenar datos.
ver http://www.agner.org/optimize/in

Pero si está utilizando una biblioteca científica especializada con precisión arbitraria (matlab, octava, R), multiplicar / sumar números pequeños definitivamente sería más rápido que multiplicar / sumar números grandes. Solo porque tiene que realizar más operaciones en un conjunto de datos más grande.