Tengo el siguiente resumen:
$$F(k)=\sum\limits_{n=1}^k\sum\limits_{d|n}\gcd\left({d},{\frac{n}{d}}\right)$$
Esto es casi imposible de calcular (mediante codificación) para números grandes, debido al tiempo que llevaría.
Se ha sugerido que la suma anterior puede simplificarse a esto:
$$F(k)=\sum_{d=1}^{d^2\leqslant k}\ \sum_{n=1}^{nd\leqslant k}\gcd({d},{n})$$
He intentado probar la simplificación y no funciona. Por ejemplo, F(10) da una salida de 22 en lugar de 32.
¿Cómo simplifico la primera suma?
Las cosas aquí podrían ser relevantes, pero no estoy seguro: Wikipedia: Función Divisor.
EDIT: Algoritmo para la sugerencia de thefunkyjunky:
long k = 10;
for (long d = 1; d*d <= k; d++) {
for(long n = 1; n*d <= k; n++) {
if (d*d <= n) result = result.add(BigInteger.valueOf(GCD(d,n)));
}
}
0 votos
He actualizado mi respuesta para incluir mi algoritmo original y una explicación de la transformación de la suma original.
0 votos
@thefunkyjunky ¡Si esto funciona!
0 votos
Acabo de actualizar con una implementación correcta de su algoritmo.
2 votos
Básicamente, estás pidiendo las sumas parciales de OEIS A $055155$ .
1 votos
¿Tiene un enlace con el problema?
0 votos
@thefunkyjunky Enlace al problema: projecteuler.net/problem=530 Mi último código para resolver (que es ineficiente sólo debido a mi código para comprobar GCD) : codereview.stackexchange.com/questions/115026/
0 votos
@Lucian ¡Eso es precisamente! Estoy intentando que la fórmula funcione.
0 votos
Entonces, ¿has conseguido que tu código funcione rápido (después de optimizar la función gcd)?
0 votos
Si esto viene del Proyecto Euler, supongo que hay una manera de calcular esto sin computar mucho
gcd()
...