Hace que el operator<< entienda el flag 'hex' y saque la salida en hexa si está seteado.
Para imprimir la salida en hexa, ahora basta con hacer:
std::cout << std::hex << numero;
Como con cualquier tipo nativo.
Permite que el programa principal no imprima la salida en un archivo.
Este parche hace que se le pueda pasar al programa principal un nombre especial
de archivo de salida, '-', que indica que no se se imprima la salida en ningún
archivo. Particularmente útil para acelerar las mediciones en pruebas masivas
(en donde no importan los resultados).
Generaliza el constructor a partir de un string para que tome cualquier base.
Este parche generaliza el constructor a partir de un string agregando un
parmámetro opcional extra 'base'. Se implementa un además un parser específico
(y *MUY* rápido) para base 16 (hexa) de manera de poder hacer pruebas mucho más
rápido (la mayoría del tiempo se la pasaba parseando el string decimal).
También se agrega un parámetro opcional al programa principal para indicar en
qué base vienen los datos de entrada. Para usar entrada hexa, por ejemplo, se
puede invovar como:
./tdatp1 input output 16
Por omisión, sigue tomando la entrada en base 10 (decimal).
Minimiza el tamaño en chunks del number.
Este parche agrega el método number::minimize_size() que elimina los "ceros a
izquierda" para achicar el tamaño de un number en chunks al mínimo posible. Se
utiliza este método después de parsear un string y otros constructores, además
en la resta y algún otro método que pueda resultar en una reducción de la
cantidad de chunks.
El minimizar la cantidad de chunks en el constructor a partir de un string
(usado en el programa principal) disminuye considerablemente el tiempo de las
operaciones, ya que ahora el número tiene una cantidad de chunks más realista y
los N (como cantidad de chunks) obtenidos no se ven ligados a la cantidad de
dígitos decimales del string.
Agrega timer y método para obtener cantidad de chunks.
Este parche agrega la clase timer que sirve para medir tiempos. Además agrega el
método number::n() para obtener la cantidad de chunks (para obtener el N real).
También modifica el problema principal para imprimir por la salida estándar el
tiempo y N real de la(s) operación(es) e imprime por salida de error los nombres
y padrones (para que sea más simple la redirección de la salida estándar). Esto
último no me convence del todo pero es cómodo (se aceptan sugerencias para
mejorarlo).
Usa suma y resta 'inplace' en el programa principal.
Se reemplaza el operator + y - por operator += y -= en el programa principal
para evitar las copias (con el + y - se genera un 'number' temporal).
Saca definición de métodos fuera de la declaración de la clase.
Empieza la limpieza. Pasada 1: sólo saca la definición de los métodos de la
declaración de la clase (y pone algún que otro const obvio).
The ugliest patch in the history (versión 2, salida decimal ejecutando python).
Según parche increiblemente vergonzoso. Imprime salida decimal utilizando
python, a quien alimentamos con nuestra salida en hexa para que nos devuelva el
decimal.
Cambiar pot_dyc() por pot_dyc_n() y pot_dyc_k().
El enunciado nos pide que se construyan dos versiones del algoritmo de
potenciacion por division y conquista que hagamos: una para la multiplicacion
naif y otra para la multiplicacion por Karatsuba-Ofman.
Este patch toma la funcion pot_dyc() y arma con ella las dos pedidas. Ademas
actualiza main.cpp y number.cpp acorde.
Implementa programa principal.
Implementación del programa principal con Makefile incluido. Por omisión compila
optimizado (en modo 'release' digamos), para compilar con símbolos de debug (y
dándole bola al assert y eso) usar: make DEBUG=1
The ugliest patch ever.
Sí, es por lejos el parche más feo que hice en mi vida y no estoy nada
orgulloso, pero a esta altura no podemos ponernos en exquisitos =(
Implementa el constructor a partir de un string.
Lo hace a través de un parser que va construyendo el número grande evualuando un
polinomio de potencias de 10. El polinomio se evalua usando la Reglar de Horner).
Reescribe normalize_length().
Además de arreglar un bug, ahora normalize length también recorta los números si
tiene muchos ceros en la perte más significativa, de manera tal que no crezcan
exponencialmente (lo que acelera increíblemente las cosas).
Sigue dejando los números con tamaño potencia de 2, pero elimina todos los ceros
que puede en el camino.
Reimplementa operator< para que sea realmente const.
El operator< utilizaba la función normalize_length() que tomaba parámetros
variables. Ahora operator< es completamente const y no necesita normalizar los
argumentos.
Contempla suma de números de signo distinto.
Utiliza a la resta para manejar esos casos. En el test quedó un caso que rompe
tanto a la suma (como resta) como a la potencia (por un problema que, como
mínimo, baja hasta la multiplicación).
Potenciación con división y conquista.
Este parche agrega el algoritmo de potenciación por división y conquista. Además
agrega varios métodos y funciones complementarias:
dividido_dos(): devuelve el número dividido 2 O(n) (haciendo shift bit a bit)
es_impar(): indica si es impar O(1) (viendo el bit menos significativo)
operator==(): comparación O(n) (en el peor caso, que es cuando son iguales)
Bugfix en la suma.
Tenía un problema cuando el 2do operando era MAX - 1 y había carry, no se sumaba
nada y tampoco se detectaba que había carry (porque pega la vuelta
indefectiblemente, sin importar el valor del operando 1).
Agregar karatsuba() y pot_ko().
En este patch se reintroduce karatsuba() (todavia no probado porque falta la
resta, pero no deberia distar mucho de su implementacion final) y pot_ko(),
tampoco probada. Soy un loco barbaro.
Merge y limpieza.
Merge del parche que implementa K-O y limpieza de algunos \r y se ponen algunos
funciones como métodos. Si bien compila el test, puede explotar porque realmente
nunca está compilando la mayor parte de las cosas porque están parametrizadas y
no se usarn.
Estructura inicial y tipo básico.
Mini estructura de directorios con lo básico. Hay un tipo parametrizado
number< T > (diseñado para unsigned's, si anda con otra cosa es casualidad) que
ya tiene implementada la suma y una forma _muy_ precaria de imprimirse.
Lo básico como para empezar a trabajar.