{
  "aliases": null,
  "backlinks": null,
  "body": "\n## Statement\n\nLet $p$ be a [[monic polynomial|0BDX4MBKT4]] of degree $n \\ge 2$ with [[complex|09FTAET5Z4]] coefficients and $p(0) \\ne 0$.\nGiven complex shifts $s_0, s_1, \\dots$ with $p(s_\\lambda) \\ne 0$, define polynomials $H^{(\\lambda)}$ of degree at most $n - 1$ by $H^{(0)} = p'$ and\n$$H^{(\\lambda + 1)}(z) = \\frac{1}{z - s_\\lambda} \\left( H^{(\\lambda)}(z) - \\frac{H^{(\\lambda)}(s_\\lambda)}{p(s_\\lambda)} \\, p(z) \\right).$$\nWrite $\\bar H^{(\\lambda)}$ for $H^{(\\lambda)}$ divided by its leading coefficient, when this is defined.\nThe *Jenkins–Traub algorithm* runs three stages:\n\n1. no shift: $s_\\lambda = 0$ for $0 \\le \\lambda \u003c M$;\n2. fixed shift: $s_\\lambda = s$ for $M \\le \\lambda \u003c L$, where $s$ is a fixed complex number;\n3. variable shift: $s_L = s - p(s) / \\bar H^{(L)}(s)$ and $s_{\\lambda + 1} = s_\\lambda - p(s_\\lambda) / \\bar H^{(\\lambda + 1)}(s_\\lambda)$ for $\\lambda \\ge L$.\n\nSuppose $p$ has a [[root|019MA1VTR2]] $\\alpha_1$ with $\\abs{s - \\alpha_1} \u003c \\abs{s - \\alpha}$ for every other root $\\alpha$ of $p$.\nThen $\\bar H^{(L)}(z) \\to p(z)/(z - \\alpha_1)$ as $L \\to \\infty$, coefficient by coefficient, and for $L$ large enough the variable shifts $s_\\lambda$ of stage 3 converge to $\\alpha_1$.\n\n## Remarks\n\nWrite $p(z) = \\prod_j (z - \\alpha_j)$ over the roots, so that $H^{(0)} = p' = \\sum_j p(z)/(z - \\alpha_j)$.\nOne checks by induction that $H^{(\\lambda)}$ stays a combination of the polynomials $p(z)/(z - \\alpha_j)$, and that each shift multiplies the coefficient of the $j$-th one by $1/(\\alpha_j - s_\\lambda)$.\nWith a fixed shift $s$, the term of the root nearest to $s$ grows fastest, so the normalized $\\bar H^{(\\lambda)}$ tends to $p(z)/(z - \\alpha_1)$.\nThen $p(z)/\\bar H^{(\\lambda)}(z)$ is close to $z - \\alpha_1$, and the stage 3 step behaves like [[Newton's method|07EXVNF9VP]] with an ever better model; its convergence is very fast.\nIn practice $s$ is taken at a random angle on a circle whose radius is a lower bound for the moduli of the roots.\nStage 2 is ended by a test on the shifts.\nAfter a root is found, it is divided out and the algorithm runs again on the quotient.\nA variant for real polynomials works with quadratic factors and real arithmetic.\n\n## Explanations\n\n### L1 human\n\nThe Jenkins–Traub algorithm finds the roots of a polynomial one after the other, roughly in order of increasing size.\nIt builds a sequence of auxiliary polynomials that slowly forget all roots except the one nearest to a chosen point.\nOnce that root dominates, a fast Newton-like phase homes in on it.\n\n### L2 human\n\nIt was for a long time the standard black-box polynomial root finder in numerical libraries, under the name CPOLY for the complex version.\nThe stages give a global convergence guarantee that Newton's method alone lacks.\nFinding the small roots first makes the deflation steps numerically stable.\n",
  "commit": "ff8a40749dc16545e3d2fc637f6b0196e81d0bfa",
  "front": {
    "about": [
      "019MA1VTR2"
    ],
    "kind": "statement",
    "msc": [
      "65H04"
    ],
    "name": "Jenkins–Traub algorithm",
    "role": "theorem",
    "same_as": {
      "wikidata": "Q6177639",
      "wikipedia": "Jenkins–Traub algorithm"
    },
    "sources": [
      {
        "url": "https://en.wikipedia.org/wiki/Jenkins–Traub_algorithm"
      }
    ],
    "tag": "HTWCTA2MTJ",
    "uses": [
      "019MA1VTR2",
      "0BDX4MBKT4",
      "07EXVNF9VP",
      "09FTAET5Z4"
    ]
  },
  "kind": "statement",
  "link": "https://tamnd.github.io/math2/node/HTWCTA2MTJ/",
  "links": [
    {
      "field": "about",
      "target": "019MA1VTR2"
    },
    {
      "field": "uses",
      "target": "019MA1VTR2"
    },
    {
      "field": "uses",
      "target": "0BDX4MBKT4"
    },
    {
      "field": "uses",
      "target": "07EXVNF9VP"
    },
    {
      "field": "uses",
      "target": "09FTAET5Z4"
    }
  ],
  "markdown": "https://tamnd.github.io/math2/node/HTWCTA2MTJ.md",
  "msc": [
    "65H04"
  ],
  "name": "Jenkins–Traub algorithm",
  "prov": null,
  "role": "theorem",
  "source": "https://github.com/tamnd/math2/blob/main/nodes/HTW/HTWCTA2MTJ.md",
  "status": null,
  "tag": "HTWCTA2MTJ",
  "uri": "m2://HTWCTA2MTJ",
  "url": "https://tamnd.github.io/math2/wiki/jenkins-traub-algorithm/",
  "writing": {
    "tag": "HTWCTA2MTJ",
    "kind": "statement",
    "level": "W0",
    "next": [
      {
        "what": "an inventory row",
        "note": "the row of the inventory that the node accounts for",
        "have": 0,
        "want": 1
      },
      {
        "what": "a source with a locator",
        "have": 0,
        "want": 1
      }
    ]
  }
}
