eulerbooks/notebooks/problem0027.ipynb

155 lines
29 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "e4ea692f",
"metadata": {},
"source": [
"# [Quadratic Primes](https://projecteuler.net/problem=27)\n",
"\n",
"We can easily write a function to test how many consecutive primes $n^2 + an + b$ generates."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "a9751bc6",
"metadata": {},
"outputs": [],
"source": [
"from itertools import count\n",
"\n",
"def consecutive_primes(a, b):\n",
" f = lambda x: x^2 + a*x + b\n",
" for n in count(0):\n",
" if not is_prime(f(n)):\n",
" return n"
]
},
{
"cell_type": "markdown",
"id": "ce6a48ba",
"metadata": {},
"source": [
"Couple of observations to speed up iterating through values of $a$ and $b$:\n",
"1. $0^2 + 0a + b = b$ must be prime. Additionally, since $|b| \\leq 1000$, the largest possible value for $b$ is 997.\n",
"2. $1^2 + 1a + b = 1 + a + b$ must be prime. Therefore $a = p - b - 1$ for some prime $p$. Furthermore, since $|a| < 1000$, it follows that $-1000 < p - b - 1 < 1000 \\implies b - 999 < p < b + 1001$, so $p$ must be less than $997 + 1001 = 1998$ in the most extreme case.\n",
"\n",
"These facts allows us to iterate over just prime numbers instead of the larger range of integers."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "03a9f808",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(-61, 971)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"coeffs = dict()\n",
"primes = prime_range(2000)\n",
"for b in primes:\n",
" if b > 1000:\n",
" break\n",
" \n",
" for p in primes:\n",
" a = p - b - 1\n",
" if not (abs(a) < 1000):\n",
" break\n",
" \n",
" coeffs[(a, b)] = consecutive_primes(a, b)\n",
"\n",
"a, b = max(coeffs, key=coeffs.get)\n",
"a, b"
]
},
{
"cell_type": "markdown",
"id": "cbd83361",
"metadata": {},
"source": [
"Their product is -59231.\n",
"\n",
"If you iterate through $n=0,1,2,\\ldots$ for the resulting quadratic and the other formula given, $n^2 - 79n + 1601$, you'll see that these polynomials don't actually generate any new prime numbers compared to Euler's formula - they just repeat primes that Euler's formula already gives.\n",
"\n",
"Furthermore, both of these polynomials are actually just shifts of Euler's formula:\n",
"$$n^2 - 61n + 971 = (n-31)^2 + (n-31) + 41$$\n",
"$$n^2 - 79n + 1601 = (n-40)^2 + (n-40) + 41$$\n",
"\n",
"What's going on? Let $f(n) = n^2 + n + 41$. An interesting property of [prime-generating functions](https://mathworld.wolfram.com/Prime-GeneratingPolynomial.html) is if $p(n)$ generates primes for $0 \\leq n \\leq u$, then $p(u - n)$ also will. To understand why, try evaluating $p(u-n)$ at $n=0,1,2,\\ldots,u$; you get $p(u),p(u-1),p(u-2),\\ldots,p(0)$, which are the same values given by $p(n)$, just in reverse.\n",
"\n",
"However, that property alone doesn't explain why shifting $f$ right generates *more* (non-distinct) primes than $f(n)$. To understand that aspect, let's look at a plot of $f(n)$."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "93c85dea",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABGDUlEQVR4nO3deZzN1ePH8fc1MtYZpRiKaZJJ1yjFRKlI1lSitKhvlihRSLKkbMlYCsUlVFKytKqUwrcvLZYkW8oWMlkzMdc6GPf3x/mZ7GbMvffc+7mv5+Pxeci9zH03Y2bec87nnOPy+Xw+AQAAIOzlsR0AAAAA/kGxAwAAcAiKHQAAgENQ7AAAAByCYgcAAOAQFDsAAACHoNgBAAA4BMUOAADAISh2ABzP5/PJ6/WK/dgBOB3FDoDj7dmzR7GxsdqzZ4/tKAAQUBQ7AAAAh6DYAQAAOATFDgAAwCEodgAAAA5BsQMAAHAIih0AAIBDUOwAAACC6PPPpTp1pL17/f+2KXYAHMvj8cjtdis5Odl2FADIMmqU5PVKhQv7/227fGzFDsDhvF6vYmNjlZ6erpiYGNtxAESwP/6QrrxSGj9eatHC/2+fETsAAIAgGTNGuvBC6YEHAvP2KXYAAABBcPCg9PbbZqSuQIHAvAbFDgAAIAg+/FBKS5Patg3ca1DsAAAAgmD0aOn226XExMC9Rt7AvWkAAABI0rJl0vz50kcfBfZ1GLEDAAAIsNGjpVKlpLvvDuzrUOwAAAACyOuVJk6U2rSRLrggsK9FsQNg1eWXXy6Xy3XK1b59e0mSz+dTnz59VKpUKRUoUEA1a9bUypUrLacGgOybONGsiG3TJvCvRbEDYNWiRYu0devWrGvWrFmSpKZNm0qSBg8erKFDh2rkyJFatGiR4uLiVKdOHe3Zs8dmbADIFp/PnDRx993SpZcG/vUodgCsuuSSSxQXF5d1TZ8+XWXLllWNGjXk8/k0fPhw9ezZU02aNFFSUpImTJig/fv3a9KkSbajA8A5/fCDtHKl9OSTwXk9ih2AkHHo0CFNnDhRrVq1ksvl0oYNG7Rt2zbVrVs3689ER0erRo0amjdv3hnfTkZGhrxe7wkXANgwerQ5Quz224PzehQ7ACFj2rRp2r17t1r8/wGK27ZtkySVKFHihD9XokSJrOdOJyUlRbGxsVlX6dKlA5YZAM5kxw6zvUnbtlKeIDUuih2AkPHWW2+pQYMGKlWq1AmPu1yuE37v8/lOeex4PXr0UHp6etaVmpoakLwAcDZvv20K3f//rBoUbFAMICT8+eefmj17tj755JOsx+Li4iSZkbuSJUtmPb5jx45TRvGOFx0drejo6MCFBYBzyMw007APPigVKxa812XEDkBIGD9+vIoXL66GDRtmPZaQkKC4uLislbKSuQ9v7ty5uummm2zEBIBsmT5d2rRJeuqp4L4uI3YArDt69KjGjx+v5s2bK2/ef78suVwuderUSQMGDFC5cuVUrlw5DRgwQAULFlSzZs0sJgaAs/N4pKpVpSpVgvu6FDsA1s2ePVubNm1Sq1atTnmua9euOnDggNq1a6ddu3apatWqmjlzpooUKWIhKQCc2+rV0qxZ0rvvBv+1XT6fzxf8lwWA4PF6vYqNjVV6erpiYmJsxwHgcB07SpMnm6nY/PmD+9rcYwcAAOAne/dK77wjtW4d/FInUewAAAD8ZuJEU+7atrXz+hQ7AAAAP/D5zKKJu++WypSxk4FiBwAA4AfffSf9+qvUvr29DBQ7AAAAP/B4pKuuCt65sKdDsQMAAMilzZulTz4xo3VnOfEw4Ch2ABzL4/HI7XYrOTnZdhQADjd2rFSggNS8ud0c7GMHwPHYxw5AIB06JMXHS40bS6NG2c3CiB0AAEAufPKJtG2b3UUTx1DsAAAAcsHjkWrWlCpUsJ2Es2IBAADO27Jl0g8/SB99ZDuJwYgdAADAefJ4pEsvlRo1sp3EoNgBAACch127zBFibdtKeUNkDpRiBwAAcB7Gj5eOHJFat7ad5F8UOwAAgBzKzJRGjJAefFCKi7Od5l8hMnAIAAAQPqZPlzZulD74wHaSEzFiBwAAkEOvvSbdeKMUagfbMGIHAACQAytWSP/7nzRliu0kp2LEDgAAIAdGjJBKlZKaNLGd5FQUOwCO5fF45Ha7lRxqcyUAwlZamvTee1K7dtIFF9hOcyqXz+fz2Q4BAIHk9XoVGxur9PR0xcTE2I4DIIwNGiT17i2lpkqXXGI7zakYsQMAAMiGI0fMSRPNmoVmqZModgAAANkybZoZqevQwXaSM2MqFoDjMRULwB9uvVVyuaS5c20nOTO2OwEAADiHJUuk77+XPvrIdpKzYyoWAADgHF5/XSpTRmrUyHaSs6PYAQAAnMWOHdKkSVL79lLeEJ/rpNgBAACcxdixUlSU1Lq17STnRrEDAAA4g8OHpVGjpEcekS66yHaac6PYAQAAnMFHH0lbt4b2FifHo9gBAACcweuvS7VqSUlJtpNkT4jfAggAAGDHTz9JCxaYjYnDBSN2ABzL4/HI7XYrOTnZdhQAYej116WEBOnOO20nyT5OngDgeJw8ASCntmyRLr9cGjhQ6tzZdprsY8QOAADgJB6PFB0tPfaY7SQ5Q7EDAAA4zv790htvmH3rYmNtp8kZih0AAMBx3n1X2r07fLY4OR7FDgAA4P8dPSoNGyY1bmwWToQbtjsBAAD4fzNmSGvWSOPH205yfhixAwAA+H9Dh0o33CDdeKPtJOeHETsAAABJS5dK334rTZkiuVy205wfRuwAAAAkDR8ulSkj3Xuv7STnj2IHAAAi3tat0qRJ0tNPS3nDeD6TYgcAACLeqFFmQ+LWrW0nyR2KHQAAiGj790ujR0utWklFi9pOkzsUOwCO5fF45Ha7lZycbDsKgBD23nvSP/9IHTvaTpJ7Lp/P57MdAgACyev1KjY2Vunp6YqJibEdB0AIOXpUqlBBcruljz+2nSb3wvj2QAAAgNz5+mtp1Spp3DjbSfyDqVgAABCxhg2TkpOl6tVtJ/EPRuwAAEBEWr5cmj1bmjw5fDckPhkjdgAAICINGyZddll4b0h8MoodAACIONu2mQ2JO3SQLrjAdhr/odgBAICIM2qUKXRt2thO4l8UOwAAEFH27zfFzgkbEp+MYgfAus2bN+uRRx5RsWLFVLBgQVWqVEmLFy/Oer5FixZyuVwnXNWqVbOYGEA4Gz9e2rVLeuYZ20n8j1WxAKzatWuXqlevrttuu00zZsxQ8eLF9ccff6joST9G169fX+PHj8/6fb58+YKcFIATZGZKQ4dKTZtKCQm20/gfxQ6AVYMGDVLp0qVPKG2XX375KX8uOjpacXFxQUwGwIk++URav1764APbSQKDqVgAVn3++eeqUqWKmjZtquLFi+u6667TuNNsAT9nzhwVL15ciYmJatOmjXbs2GEhLYBw5vNJQ4ZIt90mVa5sO01gcFYsAKvy588vSercubOaNm2qn376SZ06ddKYMWP06KOPSpKmTp2qwoULKz4+Xhs2bNCLL76oI0eOaPHixYqOjj7lbWZkZCgjIyPr916vV6VLl+asWCDCzZ0r1awpffWV1KCB7TSBQbEDYFW+fPlUpUoVzZs3L+uxDh06aNGiRZo/f/5p/87WrVsVHx+vKVOmqEmTJqc836dPH/Xt2/eUxyl2QGS7807pzz/NiRNOOWniZEzFArCqZMmScrvdJzx29dVXa9OmTWf9O/Hx8Vq7du1pn+/Ro4fS09OzrtTUVL9mBhB+fvtN+vJLqUsX55Y6icUTACyrXr26Vq9efcJja9asUXx8/Bn/TlpamlJTU1WyZMnTPh8dHX3aKVoAkevVV6VSpaSHHrKdJLAYsQNg1TPPPKMFCxZowIABWrdunSZNmqSxY8eqffv2kqS9e/eqS5cumj9/vjZu3Kg5c+borrvu0sUXX6zGjRtbTg8gHGzdKk2cKHXsKDl9pySKHQCrkpOT9emnn2ry5MlKSkrSSy+9pOHDh+vhhx+WJEVFRWnFihVq1KiREhMT1bx5cyUmJmr+/PkqUqSI5fQAwsHrr0vR0dITT9hOEngsngDgeF6vV7GxsSyeACLQnj1S6dJS69bSK6/YThN4jNgBAADHevNNad8+Mw0bCSh2AADAkQ4floYNMwsmSpe2nSY4KHYAAMCRPvhASk01W5xECu6xA+B43GMHRB6fT7ruOqlECembb2ynCR72sQMAAI4ze7a0bJk0a5btJMHFiB0Ax2PEDog8depIaWnS4sXOPmniZIzYAQAAR/n5ZzNiN3VqZJU6icUTABzM4/HI7XYrOTnZdhQAQTRwoFS2rHTvvbaTBB9TsQAcj6lYIHKsXi1dfbX0xhvS44/bThN8jNgBAADHGDLErIR99FHbSeyg2AEAAEfYvFl6912pc2cpf37baeyg2AEAAEcYOlQqWFB64gnbSeyh2AEAgLD3zz/SmDFS+/ZSJN9KS7EDAABhz+ORMjOljh1tJ7GLYgcAAMLavn3Sa69Jjz0mFS9uO41dFDsAABDW3npL2r1bevZZ20nso9gBAICwdfiw9Mor0oMPSgkJttPYR7EDAABha/JkKTVV6tbNdpLQQLEDAABh6ehRadAg6c47pYoVbacJDXltBwAAADgf06dLv/0mjR1rO0noYMQOgGN5PB653W4lJyfbjgLAz3w+KSVFuvlmqXp122lCh8vn8/lshwCAQPJ6vYqNjVV6erpiInnnUsBB5s6VataUvvxSuuMO22lCB8UOgONR7ADnadDAnA27bJnkctlOEzq4xw4AAISVX36Rvv5aev99St3JuMcOAACElZdflq68Urr/fttJQg8jdgAAIGysXCl98on05ptSXlrMKRixAwAAYSMlRSpdWvrPf2wnCU10XQAAEBbWrTMnTbz+upQvn+00oYkROwAAEBYGDpQuuURq1cp2ktBFsQMAACFv0ybp3XelLl2kAgVspwldFDsAABDyhgyRihSR2ra1nSS0UewAAEBI27ZNGjdOeuYZqXBh22lCG8UOAACEtKFDpeho6amnbCcJfRQ7AI7l8XjkdruVnJxsOwqA85SWJo0aZUpd0aK204Q+zooF4HicFQuEr169pFdflTZuNCticXaM2AEAgJCUni6NGGEWTFDqsodiBwAAQtKoUdL+/dKzz9pOEj4odgAAIOTs3WumYB97TCpVynaa8EGxAwAAIWfUKMnrlbp3t50kvFDsAABASNm3z2xI3KqVVKaM7TThhWIHAABCyqhRZuFEjx62k4Qfih0AAAgZx0brWrSQ4uNtpwk/FDsAABAy3nhD2rVLev5520nCE8UOAACEhP37pcGDzWjd5ZfbThOeKHYAACAkvPGG9M8/jNblht+L3Z49UrNm0pw5/n7LAADAqY6N1j36qJSQYDtN+PJ7sStcWFq1SurdW+IUWgA2eTweud1uJScn244C4BzGjpV27pR69rSdJLy5fD7/168vvpDuvlv673+lWrX8/dYBIGe8Xq9iY2OVnp6umJgY23EAnOTAAemKK6T69aXx422nCW8BucfuzjulKlUYtQMAAOc2dqz099+M1vlDQIqdyyX16SP98IM0e3YgXgEAADjBwYPSoEHSI49IV15pO034C9iq2DvukG64gVE7AABwZuPGSdu3M1rnLwErdsdG7ebPl2bODNSrAACAcHXwoDRwoPTww1K5crbTOENAFk8c4/NJN95o/nv+fFP2ACDYWDwBhCaPR+rQQfr9dykx0XYaZwjoBsUul9Svn7RwofT114F8JQAAEE4yMqSUFOmhhyh1/hTwkyfq1JFuuknq1Yt77QAAgDFunLR1q/TCC7aTOEvAi53LJfXtK/38s/Tll4F+NQDhaPPmzXrkkUdUrFgxFSxYUJUqVdLixYuznvf5fOrTp49KlSqlAgUKqGbNmlq5cqXFxAByY/9+6eWXzUrY8uVtp3GWoJwVe/vt0s03m8UUjNoBON6uXbtUvXp1XXDBBZox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\n",
"text/plain": [
"Graphics object consisting of 1 graphics primitive"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f(n) = n^2 + n + 41\n",
"plot(f, (-5, 5))"
]
},
{
"cell_type": "markdown",
"id": "af51cf45",
"metadata": {},
"source": [
"This quadratic is symmetric across $x=-0.5$. Because of this, $f(-1) = f(0)$, $f(-2) = f(1)$, and so on; in general, $f(n) = f(-1-n)$. However, since the axis of symmetry is just to the left of the $y$-axis, when we iterate through $n=0,1,2,\\ldots$, we only output values on one side of the axis, so we don't output any duplicated values.\n",
"\n",
"But when we transform this function by shifting it $k$ units to the right, $f(n - k)$, we cause the part of the function that's left of the axis of symmetry to *also* be output when we iterate through $n=0,1,2,\\ldots$. Since these values are all equal to values we were already outputting, they'll also be prime, but they won't be *new* primes. Since $f$ outputs primes from $n=0$ to $39$ (40 distinct values), we can shift it up to 40 units to the right and have every value from $n=0$ to $79$ be prime.\n",
"\n",
"Because of the symmetry of $f$, the transformation $f(u-n)$ is actually the *same* as shifting $f$ to the right $u+1$ units (this can be shown algebraically); then, after outputting the primes in reverse, the vertex is reached and the function starts increasing again, repeating the primes that were already output.\n",
"\n",
"## Relevant sequences\n",
"* Primes generated by Euler's formula: [A005846](https://oeis.org/A005846)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "SageMath 9.5",
"language": "sage",
"name": "sagemath"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}