4 "cell_type": "markdown",
7 "# [Quadratic formula](https://en.wikipedia.org/wiki/Quadratic_formula)"
16 "from notebook_preamble import J, V, define"
20 "cell_type": "markdown",
23 "Cf. [jp-quadratic.html](http://www.kevinalbrecht.com/code/joy-mirror/jp-quadratic.html)"
27 "cell_type": "markdown",
30 " -b +/- sqrt(b^2 - 4 * a * c)\n",
31 " -----------------------------\n",
36 "cell_type": "markdown",
39 "$\\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}$"
43 "cell_type": "markdown",
46 "# Write a straightforward program with variable names.\n",
47 " b neg b sqr 4 a c * * - sqrt [+] [-] cleave a 2 * [truediv] cons app2\n",
51 " b neg b sqr 4 a c * * - sqrt [+] [-] cleave a 2 * [truediv] cons app2\n",
52 " -b b sqr 4 a c * * - sqrt [+] [-] cleave a 2 * [truediv] cons app2\n",
53 " -b b^2 4 a c * * - sqrt [+] [-] cleave a 2 * [truediv] cons app2\n",
54 " -b b^2 4ac - sqrt [+] [-] cleave a 2 * [truediv] cons app2\n",
55 " -b b^2-4ac sqrt [+] [-] cleave a 2 * [truediv] cons app2\n",
56 " -b sqrt(b^2-4ac) [+] [-] cleave a 2 * [truediv] cons app2\n",
58 " -b -b+sqrt(b^2-4ac) -b-sqrt(b^2-4ac) a 2 * [truediv] cons app2\n",
59 " -b -b+sqrt(b^2-4ac) -b-sqrt(b^2-4ac) 2a [truediv] cons app2\n",
60 " -b -b+sqrt(b^2-4ac) -b-sqrt(b^2-4ac) [2a truediv] app2\n",
61 " -b -b+sqrt(b^2-4ac)/2a -b-sqrt(b^2-4ac)/2a\n",
63 " -b -b+sqrt(b^2-4ac)/2a -b-sqrt(b^2-4ac)/2a roll< pop\n",
64 " -b+sqrt(b^2-4ac)/2a -b-sqrt(b^2-4ac)/2a -b pop\n",
65 " -b+sqrt(b^2-4ac)/2a -b-sqrt(b^2-4ac)/2a"
69 "cell_type": "markdown",
72 "# Derive a definition.\n",
74 " b neg b sqr 4 a c * * - sqrt [+] [-] cleave a 2 * [truediv] cons app2 roll< pop\n",
75 " b [neg] dupdip sqr 4 a c * * - sqrt [+] [-] cleave a 2 * [truediv] cons app2 roll< pop\n",
76 " b a c [[neg] dupdip sqr 4] dipd * * - sqrt [+] [-] cleave a 2 * [truediv] cons app2 roll< pop\n",
77 " b a c a [[[neg] dupdip sqr 4] dipd * * - sqrt [+] [-] cleave] dip 2 * [truediv] cons app2 roll< pop\n",
78 " b a c over [[[neg] dupdip sqr 4] dipd * * - sqrt [+] [-] cleave] dip 2 * [truediv] cons app2 roll< pop"
87 "define('quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt [+] [-] cleave] dip 2 * [truediv] cons app2 roll< pop')"
97 "output_type": "stream",
99 "-0.3819660112501051 -2.618033988749895\n"
104 "J('3 1 1 quadratic')"
108 "cell_type": "markdown",
112 "We can define a `pm` plus-or-minus function:"
117 "execution_count": 4,
121 "define('pm == [+] [-] cleave popdd')"
125 "cell_type": "markdown",
128 "Then `quadratic` becomes:"
133 "execution_count": 5,
137 "define('quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [truediv] cons app2')"
142 "execution_count": 6,
147 "output_type": "stream",
149 "-0.3819660112501051 -2.618033988749895\n"
154 "J('3 1 1 quadratic')"
158 "cell_type": "markdown",
161 "### Define a \"native\" `pm` function.\n",
162 "The definition of `pm` above is pretty elegant, but the implementation takes a lot of steps relative to what it's accomplishing. Since we are likely to use `pm` more than once in the future, let's write a primitive in Python and add it to the dictionary."
167 "execution_count": 7,
171 "from joy.library import SimpleFunctionWrapper\n",
172 "from notebook_preamble import D\n",
175 "@SimpleFunctionWrapper\n",
177 " a, (b, stack) = stack\n",
178 " p, m, = b + a, b - a\n",
179 " return m, (p, stack)\n",
186 "cell_type": "markdown",
189 "The resulting trace is short enough to fit on a page."
194 "execution_count": 8,
199 "output_type": "stream",
201 " . 3 1 1 quadratic\n",
202 " 3 . 1 1 quadratic\n",
203 " 3 1 . 1 quadratic\n",
204 " 3 1 1 . quadratic\n",
205 " 3 1 1 . over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [truediv] cons app2\n",
206 " 3 1 1 1 . [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [truediv] cons app2\n",
207 " 3 1 1 1 [[[neg] dupdip sqr 4] dipd * * - sqrt pm] . dip 2 * [truediv] cons app2\n",
208 " 3 1 1 . [[neg] dupdip sqr 4] dipd * * - sqrt pm 1 2 * [truediv] cons app2\n",
209 " 3 1 1 [[neg] dupdip sqr 4] . dipd * * - sqrt pm 1 2 * [truediv] cons app2\n",
210 " 3 . [neg] dupdip sqr 4 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
211 " 3 [neg] . dupdip sqr 4 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
212 " 3 . neg 3 sqr 4 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
213 " -3 . 3 sqr 4 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
214 " -3 3 . sqr 4 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
215 " -3 3 . dup mul 4 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
216 " -3 3 3 . mul 4 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
217 " -3 9 . 4 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
218 " -3 9 4 . 1 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
219 " -3 9 4 1 . 1 * * - sqrt pm 1 2 * [truediv] cons app2\n",
220 " -3 9 4 1 1 . * * - sqrt pm 1 2 * [truediv] cons app2\n",
221 " -3 9 4 1 . * - sqrt pm 1 2 * [truediv] cons app2\n",
222 " -3 9 4 . - sqrt pm 1 2 * [truediv] cons app2\n",
223 " -3 5 . sqrt pm 1 2 * [truediv] cons app2\n",
224 " -3 2.23606797749979 . pm 1 2 * [truediv] cons app2\n",
225 " -0.7639320225002102 -5.23606797749979 . 1 2 * [truediv] cons app2\n",
226 " -0.7639320225002102 -5.23606797749979 1 . 2 * [truediv] cons app2\n",
227 " -0.7639320225002102 -5.23606797749979 1 2 . * [truediv] cons app2\n",
228 " -0.7639320225002102 -5.23606797749979 2 . [truediv] cons app2\n",
229 " -0.7639320225002102 -5.23606797749979 2 [truediv] . cons app2\n",
230 " -0.7639320225002102 -5.23606797749979 [2 truediv] . app2\n",
231 " [-0.7639320225002102] [2 truediv] . infra first [-5.23606797749979] [2 truediv] infra first\n",
232 " -0.7639320225002102 . 2 truediv [] swaack first [-5.23606797749979] [2 truediv] infra first\n",
233 " -0.7639320225002102 2 . truediv [] swaack first [-5.23606797749979] [2 truediv] infra first\n",
234 " -0.3819660112501051 . [] swaack first [-5.23606797749979] [2 truediv] infra first\n",
235 " -0.3819660112501051 [] . swaack first [-5.23606797749979] [2 truediv] infra first\n",
236 " [-0.3819660112501051] . first [-5.23606797749979] [2 truediv] infra first\n",
237 " -0.3819660112501051 . [-5.23606797749979] [2 truediv] infra first\n",
238 " -0.3819660112501051 [-5.23606797749979] . [2 truediv] infra first\n",
239 "-0.3819660112501051 [-5.23606797749979] [2 truediv] . infra first\n",
240 " -5.23606797749979 . 2 truediv [-0.3819660112501051] swaack first\n",
241 " -5.23606797749979 2 . truediv [-0.3819660112501051] swaack first\n",
242 " -2.618033988749895 . [-0.3819660112501051] swaack first\n",
243 " -2.618033988749895 [-0.3819660112501051] . swaack first\n",
244 " -0.3819660112501051 [-2.618033988749895] . first\n",
245 " -0.3819660112501051 -2.618033988749895 . \n"
250 "V('3 1 1 quadratic')"
256 "display_name": "Python 2",
257 "language": "python",
265 "file_extension": ".py",
266 "mimetype": "text/x-python",
268 "nbconvert_exporter": "python",
269 "pygments_lexer": "ipython2",