Estoy implementando un algoritmo en C que necesita hacer adiciones y restas de forma rápida en enteros sin signo y puede manejar condiciones de desbordamiento correctamente. Esto es lo que tengo ahora (que funciona):¿Sumas y restas modulares de desbordamiento seguro en C?
/* a and/or b may be greater than m */
uint32_t modadd_32(uint32_t a, uint32_t b, uint32_t m) {
uint32_t tmp;
if (b <= UINT32_MAX - a)
return (a + b) % m;
if (m <= (UINT32_MAX>>1))
return ((a % m) + (b % m)) % m;
tmp = a + b;
if (tmp > (uint32_t)(m * 2)) // m*2 must be truncated before compare
tmp -= m;
tmp -= m;
return tmp % m;
}
/* a and/or b may be greater than m */
uint32_t modsub_32(uint32_t a, uint32_t b, uint32_t m) {
uint32_t tmp;
if (a >= b)
return (a - b) % m;
tmp = (m - ((b - a) % m)); /* results in m when 0 is needed */
if (tmp == m)
return 0;
return tmp;
}
¿Alguien sabe de un mejor algoritmo? Las bibliotecas que he encontrado que hacen aritmética modular parecen ser para grandes números de precisión arbitraria que es demasiado exagerado.
Editar: Quiero que esto funcione bien en una máquina de 32 bits. Además, mis funciones existentes se convierten trivialmente para trabajar en otros tamaños de enteros sin signo, una propiedad que sería bueno retener.
Lamentablemente, no puedo suponer que ayb sean menores que m para esta aplicación en particular. – ryanc
@ryanc: puede agregar 'a% = m; b% = m;' al comienzo de cada función. Esto todavía da algoritmos más simples. ¿Son más rápidos o más lentos que los algoritmos en OP, depende del hardware y los valores de los parámetros? –