Para el caso j=0, se puede definir algunas auxiliar sumatorias para formular un algoritmo que se ejecuta en $O(n^{\frac{3}{4}})$ tiempo:
F(N) = cardinalidad{ a,b : 0 < a < b <= N }
R(N) = cardinalidad{ a,b : 0 < a < b <= N, mcd(a,b) = 1 }
Se puede ver que estamos buscando R(N) + 1.
También, F(N) es $\dfrac{N(N-1)}{2}$.
Ahora veo algo bonito:
R$\left( \Big\lfloor\dfrac{N}{m}\Big\rfloor \right)$ = cardinalidad{ a,b : 0 < a < b <= N, mcd(a,b) = m }
Por qué? Esto es porque usted puede multiplicar cada coprime par de (a,b) por m.
Este hecho le permite escribir F en términos de R:
F(N) = $\displaystyle\sum_{m=1}^N{ R\left(\Big\lfloor\dfrac{N}{m}\Big\rfloor\right) } $
Ya que estamos mirando por R(N), podemos resolver para el primer término de la derecha de la sumación.
R(N) = F(N) - $\displaystyle\sum_{m=2}^N{ R\left(\Big\lfloor\dfrac{N}{m}\Big\rfloor\right) } $
Nota: esta propiedad interesante de la función floor aquí:
$\Big\lfloor\dfrac{N}{m}\Big\rfloor$ permanecerá constante para un rango de m.
Esto nos permite calcular la suma en trozos.
ejemplo:
$\Big\lfloor\dfrac{1000}{m}\Big\rfloor$ es constante para m en el rango de [501,1000].
He aquí un programa que yo he escrito en C++ que se almacena en caché R a de comercio O(log n) de la memoria de un gran speedup