Cantidad de divisores / suma de divisores
En este artículo discutimos cómo calcular la cantidad de divisores y la suma de divisores de un número dado .
Cantidad de divisores
Debería ser obvio que la factorización prima de un divisor tiene que ser un subconjunto de la factorización prima de ; p. ej. es un divisor de . Así que solo hay que hallar todos los subconjuntos distintos de la factorización prima de .
Usualmente la cantidad de subconjuntos es para un conjunto con elementos. Sin embargo esto ya no es cierto si hay elementos repetidos en el conjunto. En nuestro caso algunos factores primos pueden aparecer varias veces en la factorización prima de .
Si un factor primo aparece veces en la factorización prima de , entonces podemos usar el factor hasta veces en el subconjunto. Lo que significa que tenemos elecciones.
Por lo tanto, si la factorización prima de es , donde los son números primos distintos, entonces la cantidad de divisores es:
Una forma de pensarlo es la siguiente:
-
Si hay un solo divisor primo distinto , entonces obviamente hay divisores ().
-
Si hay dos divisores primos distintos , entonces se pueden disponer todos los divisores en forma de tabla.
Así, la cantidad de divisores es trivialmente .
- Se puede hacer un argumento similar si hay más de dos factores primos distintos.
long long numberOfDivisors(long long num) {
long long total = 1;
for (int i = 2; (long long)i * i <= num; i++) {
if (num % i == 0) {
int e = 0;
do {
e++;
num /= i;
} while (num % i == 0);
total *= e + 1;
}
}
if (num > 1) {
total *= 2;
}
return total;
}Suma de divisores
Podemos usar el mismo argumento de la sección anterior.
- Si hay un solo divisor primo distinto , entonces la suma es:
- Si hay dos divisores primos distintos , entonces podemos hacer la misma tabla que antes. La única diferencia es que ahora queremos calcular la suma en lugar de contar los elementos. Es fácil ver que la suma de cada combinación se puede expresar como:
- En general, para obtenemos la fórmula:
long long SumOfDivisors(long long num) {
long long total = 1;
for (int i = 2; (long long)i * i <= num; i++) {
if (num % i == 0) {
int e = 0;
do {
e++;
num /= i;
} while (num % i == 0);
long long sum = 0, pow = 1;
do {
sum += pow;
pow *= i;
} while (e-- > 0);
total *= sum;
}
}
if (num > 1) {
total *= (1 + num);
}
return total;
}Funciones multiplicativas
Una función multiplicativa es una función que satisface
si y son coprimos.
Tanto como son funciones multiplicativas.
Las funciones multiplicativas tienen una enorme variedad de propiedades interesantes, que pueden ser muy útiles en problemas de teoría de números. Por ejemplo, la convolución de Dirichlet de dos funciones multiplicativas también es multiplicativa.