diff --git a/notebooks/problem0021.ipynb b/notebooks/problem0021.ipynb index d0469c9..210dd39 100644 --- a/notebooks/problem0021.ipynb +++ b/notebooks/problem0021.ipynb @@ -132,6 +132,22 @@ "metadata": {}, "outputs": [], "source": [ + "def update_multiples(dsum, p, limit):\n", + " q = p\n", + " while True:\n", + " # sigma(a*b) = sigma(a) * sigma(b) if gcd(a, b) = 1\n", + " for k in range(2 * q, limit, q):\n", + " if k % (p*q) != 0:\n", + " dsum[k] *= dsum[q]\n", + "\n", + " if p * q >= limit:\n", + " break\n", + "\n", + " # sigma(p^k) = p^k + sigma(p^(k-1))\n", + " dsum[p*q] = p * q + dsum[q]\n", + " q *= p\n", + " \n", + "\n", "def sum_of_divisors_range(limit): \n", " dsum = [1 for n in range(0, limit)]\n", " dsum[0] = 0\n", @@ -144,21 +160,7 @@ "\n", " # n is prime\n", " dsum[n] = n + 1\n", - "\n", - " m = n\n", - " while True:\n", - " # sigma(a*b) = sigma(a) * sigma(b) if gcd(a, b) = 1\n", - " for k in range(2 * m, limit, m):\n", - " if k % (m*n) != 0:\n", - " dsum[k] *= dsum[m]\n", - "\n", - " if m * n >= limit:\n", - " break\n", - " \n", - " # sigma(p^k) = p^k + sigma(p^(k-1))\n", - " dsum[m*n] = m*n + dsum[m]\n", - " m *= n\n", - " \n", + " update_multiples(dsum, n, limit)\n", " yield dsum[n]" ] },