<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dan&#039;s Thoughts &#187; lisp</title>
	<atom:link href="http://danboykis.com/category/lisp/feed/" rel="self" type="application/rss+xml" />
	<link>http://danboykis.com</link>
	<description>Thinking somewhat carefully</description>
	<lastBuildDate>Tue, 18 Jan 2011 00:46:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>sin(n) = -1 where n is an integer in radians</title>
		<link>http://danboykis.com/2010/05/sinn-1-where-n-is-an-integer-in-radians/</link>
		<comments>http://danboykis.com/2010/05/sinn-1-where-n-is-an-integer-in-radians/#comments</comments>
		<pubDate>Wed, 19 May 2010 21:55:38 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[math]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=2034</guid>
		<description><![CDATA[I saw a fun math problem on reddit the other day. find a number n, so that sin(n)=-1, where n is an integer in radians; so sin(270 degrees) doesn't count. Obviously it will never be exactly -1 but close enough for the difference to be lost in rounding. I need the argument of sin function [...]]]></description>
			<content:encoded><![CDATA[<p>I saw a fun math problem on <a href="http://www.reddit.com/r/math/comments/byooz/how_would_you_approach_this_problem_sinx1_where_x/">reddit</a> the other day.</p>
<p>find a number n, so that sin(n)=-1, where n is an integer in radians; so sin(270 degrees) doesn't count. Obviously it will never be exactly -1 but close enough for the difference to be lost in rounding.</p>
<p><img src='http://danboykis.com/wp-content/latex/7b6/7b618be876d252f14bdfac5e4b67c83b-ffffff-000000-0.png' alt='\sin(\frac{3\pi}{2} + 2\pi \cdot n) = -1' title='\sin(\frac{3\pi}{2} + 2\pi \cdot n) = -1' class='latex' /><br />
I need the argument of sin function to be as close to an integer as possible. Call this integer m.<br />
<img src='http://danboykis.com/wp-content/latex/891/8911834676e17a6e559694e90b53b051-ffffff-000000-0.png' alt='\frac{3\pi}{2}+2\pi \cdot n \approx m' title='\frac{3\pi}{2}+2\pi \cdot n \approx m' class='latex' /><br />
Solving for <img src='http://danboykis.com/wp-content/latex/4f0/4f08e3dba63dc6d40b22952c7a9dac6d-ffffff-000000-0.png' alt='\pi' title='\pi' class='latex' /> leads to:<br />
<img src='http://danboykis.com/wp-content/latex/cd9/cd909869b3ad0358b6f611510c96926b-ffffff-000000-0.png' alt='\pi \approx \frac{p}{q} \approx \frac{2m}{4n+3} ' title='\pi \approx \frac{p}{q} \approx \frac{2m}{4n+3} ' class='latex' /></p>
<p>If I have a rational approximation to <img src='http://danboykis.com/wp-content/latex/4f0/4f08e3dba63dc6d40b22952c7a9dac6d-ffffff-000000-0.png' alt='\pi' title='\pi' class='latex' /> with an even numerator I can divide it by two get my m. I also have to make sure that the denominator is in the form of 4n+3.<br />
It's possible to use continued fractions to approximate real numbers. Here's a continued fraction sequence for pi: http://www.research.att.com/~njas/sequences/A001203</p>
<p>The first rational approximation I learned in elementary school is 22/7 which is perfect.</p>
<p>> (sin 11)<br />
-.9999902065507035</p>
<p>For the others I'll have to evaluate the continued fraction to get my approximation of a simple fraction.</p>
<p>> (eval-terms (list 3 7 15 1 292 1))<br />
104348/33215</p>
<p>> (sin (/ 104348 2))<br />
-.9999999999848337</p>
<p>> (eval-terms (list 3 7 15 1 292 1 1 1 2 1 3 1 14 2 1))<br />
245850922/78256779</p>
<p>> (sin (/ 245850922 2))<br />
-.99999999999999999532<br />
Looks like a good candidate was found.</p>
<p>This is the code to evaluate a continued fraction coefficients. It's very convenient that scheme has a native rational data type.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>eval-terms ts<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">length</span> ts<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> ts<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>else
          <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> ts<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span>eval-terms <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> ts<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>eval-terms-iter ts<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>rev-ts <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">reverse</span> ts<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>ev-terms ts frac<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? ts<span style="color: #66cc66;">&#41;</span>
        frac
        <span style="color: #66cc66;">&#40;</span>ev-terms <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> ts<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> ts<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">1</span> frac<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>ev-terms rev-ts <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> rev-ts<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2010/05/sinn-1-where-n-is-an-integer-in-radians/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QMISMF: Chapter 2</title>
		<link>http://danboykis.com/2009/10/qmismf-chapter-2/</link>
		<comments>http://danboykis.com/2009/10/qmismf-chapter-2/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 00:13:02 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[physics]]></category>
		<category><![CDATA[qmismf]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1929</guid>
		<description><![CDATA[2-1: > (+ 3-i 2+4i) 5+3i > (+ 1+3i 2) 3+3i > (- -5+2i 2+2i) -7 > (+ -2+i 2+2i) +3i > (* 3-i 2+4i) 10+10i > (* 1+3i 2) 2+6i > (* 0+i 1+3i) -3+i > (* -5+2i 2+3i) -16-11i > (* 2+3i -2+3i) -13 > (* 2+3i 3+2i) +13i 2-2: 2-3: 2-4: 2-5: [...]]]></description>
			<content:encoded><![CDATA[<p><strong>2-1:</strong></p>
<p>> (+ 3-i 2+4i)<br />
5+3i<br />
> (+ 1+3i 2)<br />
3+3i<br />
> (- -5+2i 2+2i)<br />
-7<br />
> (+ -2+i 2+2i)<br />
+3i<br />
> (* 3-i 2+4i)<br />
10+10i<br />
> (* 1+3i 2)<br />
2+6i<br />
> (* 0+i 1+3i)<br />
-3+i<br />
> (* -5+2i 2+3i)<br />
-16-11i<br />
> (* 2+3i -2+3i)<br />
-13<br />
> (* 2+3i 3+2i)<br />
+13i</p>
<p><strong>2-2:</strong></p>
<p><img src='http://danboykis.com/wp-content/latex/a4b/a4b0c04031d1d0a567c63e2df9536f64-ffffff-000000-0.png' alt='z^{-1}=\frac{1}{x^2+y^2}(x+iy)' title='z^{-1}=\frac{1}{x^2+y^2}(x+iy)' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/e20/e2084b4ee8eba672db2f35448135b468-ffffff-000000-0.png' alt='\left(\frac{1}{i}\right)^{-1} \rightarrow 0-i=\frac{1}{1}(i)=i' title='\left(\frac{1}{i}\right)^{-1} \rightarrow 0-i=\frac{1}{1}(i)=i' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/eea/eea746f412d730af841f87a1f376551a-ffffff-000000-0.png' alt='i \cdot \frac{1}{i}= 1' title='i \cdot \frac{1}{i}= 1' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/8f3/8f3289c0287c77560f357c0bebe99044-ffffff-000000-0.png' alt='\left(\frac{1}{-i}\right)^{-1} \rightarrow \frac{-i}{-1} = i = \frac{1}{1}(-i)=-i' title='\left(\frac{1}{-i}\right)^{-1} \rightarrow \frac{-i}{-1} = i = \frac{1}{1}(-i)=-i' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/eb9/eb92ed123099619700271fe2cf739a21-ffffff-000000-0.png' alt=' -i \cdot \frac{1}{-i}= 1' title=' -i \cdot \frac{1}{-i}= 1' class='latex' /></p>
<p><strong>2-3:</strong></p>
<p><img src='http://danboykis.com/wp-content/latex/2af/2af086c86286b078c8b28e16d066b5ad-ffffff-000000-0.png' alt='i^*i = -i \cdot i = 1' title='i^*i = -i \cdot i = 1' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/b51/b51c7f75513ddf8495d488804ec09b56-ffffff-000000-0.png' alt='(-i)^*(-i)= i \cdot -i = 1' title='(-i)^*(-i)= i \cdot -i = 1' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/78c/78c901ef73c3ea3641e076e7e070fdaf-ffffff-000000-0.png' alt='|i|^2=(i^*i)=1' title='|i|^2=(i^*i)=1' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/a3b/a3bc5c8dc465140e8a736eeb570bc494-ffffff-000000-0.png' alt='|-i|^2=\left( (-i)^*(-i) \right)=1' title='|-i|^2=\left( (-i)^*(-i) \right)=1' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/5f8/5f84cfa4f5f03e1932f1600d3e01c189-ffffff-000000-0.png' alt='|i| = \sqrt{i^*i} = \sqrt{-i \cdot i} = 1' title='|i| = \sqrt{i^*i} = \sqrt{-i \cdot i} = 1' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/2b1/2b1df09dfa356bbe8eae51c84ae0f791-ffffff-000000-0.png' alt='|-i| = \sqrt{(-i)^*(-i)}= \sqrt{i \cdot -i} = 1' title='|-i| = \sqrt{(-i)^*(-i)}= \sqrt{i \cdot -i} = 1' class='latex' /></p>
<p><strong>2-4:</strong></p>
<p><img src='http://danboykis.com/wp-content/latex/747/74715efb63ca3ba12e9f79d00ced448f-ffffff-000000-0.png' alt='z=3+4i' title='z=3+4i' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/ef7/ef7bfb7e58627c20069a5898614fce6c-ffffff-000000-0.png' alt='z^* = 3-4i' title='z^* = 3-4i' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/93c/93c13e1d04b2b32b6c516da8ba754f8f-ffffff-000000-0.png' alt='z^*z = (3-4i)(3+4i) = 25' title='z^*z = (3-4i)(3+4i) = 25' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/f11/f11a5ae573a34b533dac51313cf81cf3-ffffff-000000-0.png' alt='|z| = \sqrt{z^*z} = \sqrt{25} = 5' title='|z| = \sqrt{z^*z} = \sqrt{25} = 5' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/bd1/bd10c7d4bf892505ddf6ef7891cf8367-ffffff-000000-0.png' alt='z^2 = z \cdot z = (3+4i)(3+4i) = -7+24i' title='z^2 = z \cdot z = (3+4i)(3+4i) = -7+24i' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/1c8/1c8860b6f12d600e17168da54ac0c3ba-ffffff-000000-0.png' alt='\frac{1}{z} = \frac{1}{z} \cdot \frac{z^*}{z^*} = \frac{z^*}{zz^*} = \frac{3-4i}{25}' title='\frac{1}{z} = \frac{1}{z} \cdot \frac{z^*}{z^*} = \frac{z^*}{zz^*} = \frac{3-4i}{25}' class='latex' /></p>
<p><strong>2-5:</strong></p>
<p><img src='http://danboykis.com/wp-content/latex/79f/79f42bc0e9979a2984d5d86c51d658d2-ffffff-000000-0.png' alt='|w+z| &lt; |w| + |z|' title='|w+z| &lt; |w| + |z|' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/a36/a363827a0be940ce55b764a89a0b97c9-ffffff-000000-0.png' alt='|3+4i| &lt; |3| + |4i|' title='|3+4i| &lt; |3| + |4i|' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/d3b/d3b7b26827272d3491ec0629f3dc3599-ffffff-000000-0.png' alt='5 &lt; 7' title='5 &lt; 7' class='latex' /></p>
<p><strong>2-6:</strong></p>
<p><img src='http://danboykis.com/wp-content/latex/e58/e58b38fc09ffc2004aa5150a2c192777-ffffff-000000-0.png' alt='\sqrt{z} = \sqrt{\frac{\sqrt{x^2+y^2}}{2}} \cdot \left( \sqrt{1 + \frac{x}{\sqrt{x^2+y^2}}} + i\sqrt{1 - \frac{x}{\sqrt{x^2+y^2}}} \right)' title='\sqrt{z} = \sqrt{\frac{\sqrt{x^2+y^2}}{2}} \cdot \left( \sqrt{1 + \frac{x}{\sqrt{x^2+y^2}}} + i\sqrt{1 - \frac{x}{\sqrt{x^2+y^2}}} \right)' class='latex' /><br />
for <img src='http://danboykis.com/wp-content/latex/d8d/d8d908bbbf4187f45036660078366a0f-ffffff-000000-0.png' alt='y \ge 0' title='y \ge 0' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/cbd/cbdfda81dc6ecab559f85544780bca94-ffffff-000000-0.png' alt='\sqrt{z} = \sqrt{\frac{\sqrt{x^2+y^2}}{2}} \cdot \left( -\sqrt{1 + \frac{x}{\sqrt{x^2+y^2}}} + i\sqrt{1 - \frac{x}{\sqrt{x^2+y^2}}} \right)' title='\sqrt{z} = \sqrt{\frac{\sqrt{x^2+y^2}}{2}} \cdot \left( -\sqrt{1 + \frac{x}{\sqrt{x^2+y^2}}} + i\sqrt{1 - \frac{x}{\sqrt{x^2+y^2}}} \right)' class='latex' /><br />
for <img src='http://danboykis.com/wp-content/latex/1cc/1cc38adee46fab836f54737b1df4317b-ffffff-000000-0.png' alt='y \le 0' title='y \le 0' class='latex' /></p>
<p><img src='http://danboykis.com/wp-content/latex/c1b/c1ba6570c9511072da3201bf2c171630-ffffff-000000-0.png' alt='\sqrt{i} = \sqrt{0+1i} = \sqrt{\frac{\sqrt{0^2+1^2}}{2}} \cdot \left( \sqrt{1 + \frac{0}{\sqrt{0^2+1^2}}} + i\sqrt{1 - \frac{0}{\sqrt{0^2+1^2}}} \right)' title='\sqrt{i} = \sqrt{0+1i} = \sqrt{\frac{\sqrt{0^2+1^2}}{2}} \cdot \left( \sqrt{1 + \frac{0}{\sqrt{0^2+1^2}}} + i\sqrt{1 - \frac{0}{\sqrt{0^2+1^2}}} \right)' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/b9c/b9c9166a041144bf6bc79954dba64009-ffffff-000000-0.png' alt='\sqrt{i} = \sqrt{0+1i} = \sqrt{\frac{1}{2}} \cdot (1+i) = \sqrt{\frac{1}{2}}+i\sqrt{\frac{1}{2}}' title='\sqrt{i} = \sqrt{0+1i} = \sqrt{\frac{1}{2}} \cdot (1+i) = \sqrt{\frac{1}{2}}+i\sqrt{\frac{1}{2}}' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/40f/40f7c07674450d856d94ca9df2188ac2-ffffff-000000-0.png' alt='\left(\sqrt{\frac{1}{2}}+i\sqrt{\frac{1}{2}}\right)^2 = \frac{1}{2} + i - \frac{1}{2} = i' title='\left(\sqrt{\frac{1}{2}}+i\sqrt{\frac{1}{2}}\right)^2 = \frac{1}{2} + i - \frac{1}{2} = i' class='latex' /></p>
<p><img src='http://danboykis.com/wp-content/latex/588/588e2c3fd0609c9dc703635c44c2ea3d-ffffff-000000-0.png' alt='\sqrt{-i} = \sqrt{0-1i} = \sqrt{\frac{\sqrt{0^2+(-1)^2}}{2}} \cdot \left( -\sqrt{1 + \frac{0}{\sqrt{0^2+(-1)^2}}} + i\sqrt{1 - \frac{0}{\sqrt{0^2+(-1)^2}}} \right)' title='\sqrt{-i} = \sqrt{0-1i} = \sqrt{\frac{\sqrt{0^2+(-1)^2}}{2}} \cdot \left( -\sqrt{1 + \frac{0}{\sqrt{0^2+(-1)^2}}} + i\sqrt{1 - \frac{0}{\sqrt{0^2+(-1)^2}}} \right)' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/c2d/c2d1923defaf1d524bc7f3858c905a5c-ffffff-000000-0.png' alt='\sqrt{-i} = \sqrt{0-1i} = \sqrt{\frac{1}{2}} \cdot (-1+i) = -\sqrt{\frac{1}{2}}+i\sqrt{\frac{1}{2}}' title='\sqrt{-i} = \sqrt{0-1i} = \sqrt{\frac{1}{2}} \cdot (-1+i) = -\sqrt{\frac{1}{2}}+i\sqrt{\frac{1}{2}}' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/83b/83bb3cedff24015bd5647f48da35cd8e-ffffff-000000-0.png' alt='\left(- \sqrt{\frac{1}{2}}+i \sqrt{\frac{1}{2}}\right) \cdot \left(- \sqrt{\frac{1}{2}}+i \sqrt{\frac{1}{2}}\right)=\frac{1}{2}-i-\frac{1}{2}=-i' title='\left(- \sqrt{\frac{1}{2}}+i \sqrt{\frac{1}{2}}\right) \cdot \left(- \sqrt{\frac{1}{2}}+i \sqrt{\frac{1}{2}}\right)=\frac{1}{2}-i-\frac{1}{2}=-i' class='latex' /></p>
<p><strong>2-7:</strong></p>
<p><img src='http://danboykis.com/wp-content/latex/403/403cad4d81b4cb3d689ff9f756a3ae73-ffffff-000000-0.png' alt='z=-\frac{b}{2a} \pm \sqrt{\left(\frac{b}{2a}\right)^2 - \frac{c}{a}}' title='z=-\frac{b}{2a} \pm \sqrt{\left(\frac{b}{2a}\right)^2 - \frac{c}{a}}' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/6aa/6aa55159762cc5ffff0ccf60b32366cf-ffffff-000000-0.png' alt='z=-\frac{b}{2a} \pm \sqrt{\frac{b^2-4ac}{2^2a^2}}' title='z=-\frac{b}{2a} \pm \sqrt{\frac{b^2-4ac}{2^2a^2}}' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/dff/dff356ef18de2e0fb1ea01ca8a31973f-ffffff-000000-0.png' alt='z=-\frac{b}{2a} \pm \frac{1}{2a}\sqrt{b^2-4ac}' title='z=-\frac{b}{2a} \pm \frac{1}{2a}\sqrt{b^2-4ac}' class='latex' /><br />
<img src='http://danboykis.com/wp-content/latex/c19/c19dd66a23dd9750b81f631b1393fb60-ffffff-000000-0.png' alt='z=\frac{-b \pm \sqrt{b^2-4ac}}{2a}' title='z=\frac{-b \pm \sqrt{b^2-4ac}}{2a}' class='latex' /> since the above is now in the usual form of the <a href="http://en.wikipedia.org/wiki/Quadratic_equation">quadratic formula</a> it is clear z is a solution.</p>
]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/10/qmismf-chapter-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercise 2.42 of SICP</title>
		<link>http://danboykis.com/2009/08/exercise-2-42-of-sicp/</link>
		<comments>http://danboykis.com/2009/08/exercise-2-42-of-sicp/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 00:09:42 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[SICP]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1888</guid>
		<description><![CDATA[Exercise 2.42: The "eight-queens puzzle'' asks how to place eight queens on a chessboard so that no queen is in check from any other (i.e., no two queens are in the same row, column, or diagonal). One possible solution is shown in figure 2.8. One way to solve the puzzle is to work across the [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Exercise 2.42:</strong></p>
<div class="wp-caption alignnone" style="width: 292px"><img alt="A solution to the eight-queens puzzle." src="http://mitpress.mit.edu/sicp/full-text/book/ch2-Z-G-23.gif" title="8 Queens" width="282" height="282" /><p class="wp-caption-text">A solution to the eight-queens puzzle.</p></div>
<p>The "eight-queens puzzle'' asks how to place eight queens on a chessboard so that no queen is in check from any other (i.e., no two queens are in the same row, column, or diagonal). One possible solution is shown in figure 2.8. One way to solve the puzzle is to work across the board, placing a queen in each column. Once we have placed k - 1 queens, we must place the k<sup>th</sup> queen in a position where it does not check any of the queens already on the board. We can formulate this approach recursively: Assume that we have already generated the sequence of all possible ways to place k - 1 queens in the first k - 1 columns of the board. For each of these ways, generate an extended set of positions by placing a queen in each row of the k<sup>th</sup> column. Now filter these, keeping only the positions for which the queen in the k<sup>th</sup> column is safe with respect to the other queens. This produces the sequence of all ways to place k queens in the first k columns. By continuing this process, we will produce not only one solution, but all solutions to the puzzle.</p>
<p>We implement this solution as a procedure queens, which returns a sequence of all solutions to the problem of placing n queens on an n×n chessboard. Queens has an internal procedure <em>queen-cols</em> that returns the sequence of all ways to place queens in the first k columns of the board.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>queens board-size<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>queen-cols k<span style="color: #66cc66;">&#41;</span>  
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> k <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> empty-board<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>filter
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>positions<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>safe? k positions<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>flatmap
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>rest-of-queens<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>new-row<span style="color: #66cc66;">&#41;</span>
                   <span style="color: #66cc66;">&#40;</span>adjoin-position new-row k rest-of-queens<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>enumerate-interval <span style="color: #cc66cc;">1</span> board-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>queen-cols <span style="color: #66cc66;">&#40;</span>- k <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>queen-cols board-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>In this procedure <em>rest-of-queens</em> is a way to place k - 1 queens in the first k - 1 columns, and <em>new-row</em> is a proposed row in which to place the queen for the k<sup>th</sup> column. Complete the program by implementing the representation for sets of board positions, including the procedure <em>adjoin-position</em>, which adjoins a new row-column position to a set of positions, and <em>empty-board</em>, which represents an empty set of positions. You must also write the procedure <em>safe?</em>, which determines for a set of positions, whether the queen in the k<sup>th</sup> column is safe with respect to the others. (Note that we need only check whether the new queen is safe -- the other queens are already guaranteed safe with respect to each other.)</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>filter pred? seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? seq<span style="color: #66cc66;">&#41;</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pred? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> seq<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>filter pred? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>else
          <span style="color: #66cc66;">&#40;</span>filter pred? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>flatmap pred seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>accumulate <span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>map pred seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>accumulate op init seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? seq<span style="color: #66cc66;">&#41;</span>
    init
    <span style="color: #66cc66;">&#40;</span>op <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> seq<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>accumulate op init <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>enumerate-interval low high<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&gt;</span> low high<span style="color: #66cc66;">&#41;</span>
    '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> low <span style="color: #66cc66;">&#40;</span>enumerate-interval <span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">1</span> low<span style="color: #66cc66;">&#41;</span> high<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>queens board-size<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>queen-cols k<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> k <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> empty-board<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>filter 
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>positions<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>safe? k positions<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>flatmap
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>rest-of-queens<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>new-row<span style="color: #66cc66;">&#41;</span>
                   <span style="color: #66cc66;">&#40;</span>adjoin-position new-row k rest-of-queens<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>enumerate-interval <span style="color: #cc66cc;">1</span> board-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>queen-cols <span style="color: #66cc66;">&#40;</span>- k <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>queen-cols board-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define empty-board '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>adjoin-position new-row k rest-of-queens<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> rest-of-queens <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> new-row<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>safe? k positions<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>new-q-row <span style="color: #66cc66;">&#40;</span>list-ref positions <span style="color: #66cc66;">&#40;</span>- k <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>safe-queen? new-q-row k positions <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>safe-queen? new-q-row new-q-col positions col<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? positions<span style="color: #66cc66;">&#41;</span> #t<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> new-q-col col<span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> new-q-row <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> positions<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> #t<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;check for last col</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> new-q-row <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> positions<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> #f<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;rook moves</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> 
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">abs</span> <span style="color: #66cc66;">&#40;</span>- new-q-row <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> positions<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;bishop moves</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">abs</span> <span style="color: #66cc66;">&#40;</span>- new-q-col col<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> #f<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>else
          <span style="color: #66cc66;">&#40;</span>safe-queen? new-q-row new-q-col <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> positions<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>+ col <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>> (length (queens 8))<br />
<em>92</em><br />
> (length (queens 11))<br />
<em>2680</em><br />
> (length (queens 10))<br />
<em>724</em><br />
> (queens 4)<br />
<em>((2 4 1 3) (3 1 4 2))</em></p>
]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/08/exercise-2-42-of-sicp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercise 2.40 of SICP</title>
		<link>http://danboykis.com/2009/08/exercise-2-40-of-sicp/</link>
		<comments>http://danboykis.com/2009/08/exercise-2-40-of-sicp/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 11:27:59 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[SICP]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1870</guid>
		<description><![CDATA[Exercise 2.40: Define a procedure unique-pairs that, given an integer n, generates the sequence of pairs with . Use unique-pairs to simplify the definition of prime-sum-pairs given above. Using Miller-Rabin primality test as well as taking advantage of some lexical scoping here is the solution: &#40;define &#40;prime? n times&#41; &#40;define &#40;miller-rabin-test n&#41; &#40;define &#40;random n&#41; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Exercise 2.40:</strong>  Define a procedure unique-pairs that, given an integer n, generates the sequence of pairs <img src='http://danboykis.com/wp-content/latex/527/5270ae675fac24f97e172dcd9b18fa92-ffffff-000000-0.png' alt='(i,j)' title='(i,j)' class='latex' /> with <img src='http://danboykis.com/wp-content/latex/004/004fe354c0ed68121684597fc00c144e-ffffff-000000-0.png' alt='1\le j&lt; i\le n' title='1\le j&lt; i\le n' class='latex' />. Use <strong>unique-pairs</strong> to simplify the definition of <strong>prime-sum-pairs</strong> given above. </p>
<p>Using Miller-Rabin primality test as well as taking advantage of some lexical scoping here is the solution:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>prime? n times<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>miller-rabin-test n<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">random</span> n<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>random-<span style="color: #b1b100;">integer</span> n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>expmod base <span style="color: #b1b100;">exp</span> m<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>square-mod x<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>remainder <span style="color: #66cc66;">&#40;</span>* x x<span style="color: #66cc66;">&#41;</span> m<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>square-signal-root x<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> 
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">or</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> x<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> x <span style="color: #66cc66;">&#40;</span>- m <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span>square-mod x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #cc66cc;">0</span>
          <span style="color: #66cc66;">&#40;</span>square-mod x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #b1b100;">exp</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>even? <span style="color: #b1b100;">exp</span><span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span>square-signal-root <span style="color: #66cc66;">&#40;</span>expmod base <span style="color: #66cc66;">&#40;</span>/ <span style="color: #b1b100;">exp</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> m<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>else
              <span style="color: #66cc66;">&#40;</span>remainder <span style="color: #66cc66;">&#40;</span>* base <span style="color: #66cc66;">&#40;</span>expmod base <span style="color: #66cc66;">&#40;</span>- <span style="color: #b1b100;">exp</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> m<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                         m<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  
    <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>try-it a<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>expmod a <span style="color: #66cc66;">&#40;</span>- n <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> n<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>try-it <span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">random</span> <span style="color: #66cc66;">&#40;</span>- n <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> times <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> #t<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>miller-rabin-test n<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>fast-prime? n <span style="color: #66cc66;">&#40;</span>- times <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>else #f<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>filter pred seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? seq<span style="color: #66cc66;">&#41;</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pred <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> 
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> seq<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>filter pred <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>else
          <span style="color: #66cc66;">&#40;</span>filter pred <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>range start end<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>iter end seq<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&gt;</span> start end<span style="color: #66cc66;">&#41;</span>
      seq
      <span style="color: #66cc66;">&#40;</span>iter <span style="color: #66cc66;">&#40;</span>- end <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> end seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>iter end '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>flatmap proc seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> sequence<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? sequence<span style="color: #66cc66;">&#41;</span>
      init-<span style="color: #b1b100;">value</span>
      <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> sequence<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> sequence<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>accumulate <span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>map proc seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>unique-pairs n<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>flatmap 
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>j<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> i j<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span>- i <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">1</span> n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>prime-sum-pairs n<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>make-pair-sum pair<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> pair<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> pair<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> pair<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> pair<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>prime-sum? pair<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>prime? <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> pair<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> pair<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>map make-pair-sum
       <span style="color: #66cc66;">&#40;</span>filter prime-sum?
               <span style="color: #66cc66;">&#40;</span>unique-pairs n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>> (prime-sum-pairs 1)<br />
<em>()</em><br />
> (prime-sum-pairs 2)<br />
<em>((2 1 3))</em><br />
> (prime-sum-pairs 3)<br />
<em>((2 1 3) (3 2 5))</em><br />
> (prime-sum-pairs 4)<br />
<em>((2 1 3) (3 2 5) (4 1 5) (4 3 7))</em><br />
> (prime-sum-pairs 5)<br />
<em>((2 1 3) (3 2 5) (4 1 5) (4 3 7) (5 2 7))</em></p>
]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/08/exercise-2-40-of-sicp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercise 2.39 of SICP</title>
		<link>http://danboykis.com/2009/08/exercise-2-39-of-sicp/</link>
		<comments>http://danboykis.com/2009/08/exercise-2-39-of-sicp/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 10:50:09 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[SICP]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1842</guid>
		<description><![CDATA[Exercise 2.39: Complete the following definitions of reverse (exercise 2.18) in terms of fold-right and fold-left from exercise 2.38: &#40;define &#40;reverse sequence&#41; &#40;fold-right &#40;lambda &#40;x y&#41; &#60;??&#62;&#41; nil sequence&#41;&#41; &#40;define &#40;reverse sequence&#41; &#40;fold-left &#40;lambda &#40;x y&#41; &#60;??&#62;&#41; nil sequence&#41;&#41; &#40;define &#40;fold-right fn init-value items&#41; &#40;if &#40;null? items&#41; init-value &#40;fn &#40;car items&#41; &#40;fold-right fn init-value &#40;cdr [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Exercise 2.39:</strong>   Complete the following definitions of reverse (exercise 2.18) in terms of <em>fold-right</em> and <em>fold-left</em> from exercise 2.38:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">reverse</span> sequence<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>fold-right <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>x y<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span>??<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span> sequence<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">reverse</span> sequence<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>fold-left <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>x y<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span>??<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span> sequence<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>fold-right fn init-<span style="color: #b1b100;">value</span> items<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? items<span style="color: #66cc66;">&#41;</span>
    init-<span style="color: #b1b100;">value</span>
    <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> items<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>fold-right fn init-<span style="color: #b1b100;">value</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> items<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>fold-left op initial sequence<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>iter result rest<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? rest<span style="color: #66cc66;">&#41;</span>
        result
        <span style="color: #66cc66;">&#40;</span>iter <span style="color: #66cc66;">&#40;</span>op result <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> rest<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> rest<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>iter initial sequence<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>reverse-right sequence<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>fold-right <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>x y<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> y <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> sequence<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>reverse-left sequence<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>fold-left <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>x y<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> y x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> sequence<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>> (reverse-right (list 1 2 3))<br />
<em>(3 2 1)</em><br />
> (reverse-left (list 1 2 3))<br />
<em>(3 2 1)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/08/exercise-2-39-of-sicp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercise 2.38 of SICP</title>
		<link>http://danboykis.com/2009/08/exercise-2-38-of-sicp/</link>
		<comments>http://danboykis.com/2009/08/exercise-2-38-of-sicp/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 20:49:47 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[SICP]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1839</guid>
		<description><![CDATA[Exercise 2.38: The accumulate procedure is also known as fold-right, because it combines the first element of the sequence with the result of combining all the elements to the right. There is also a fold-left, which is similar to fold-right, except that it combines elements working in the opposite direction: &#40;define &#40;fold-left op initial sequence&#41; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Exercise 2.38:</strong>  The accumulate procedure is also known as fold-right, because it combines the first element of the sequence with the result of combining all the elements to the right. There is also a fold-left, which is similar to fold-right, except that it combines elements working in the opposite direction:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>fold-left op initial sequence<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>iter result rest<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? rest<span style="color: #66cc66;">&#41;</span>
        result
        <span style="color: #66cc66;">&#40;</span>iter <span style="color: #66cc66;">&#40;</span>op result <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> rest<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> rest<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>iter initial sequence<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>What are the values of</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>fold-right<span style="color: #66cc66;"> / </span><span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p><em>3/2</em></p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>fold-left<span style="color: #66cc66;"> / </span><span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p><em>1/6</em></p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>fold-right <span style="color: #b1b100;">list</span> <span style="color: #b1b100;">nil</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p><em>(1 (2 (3 ())))</em></p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>fold-left <span style="color: #b1b100;">list</span> <span style="color: #b1b100;">nil</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p><em>(((() 1) 2) 3)</em><br />
Give a property that op should satisfy to guarantee that <em>fold-right</em> and <em>fold-left</em> will produce the same values for any sequence.<br />
(fold-right op i (list a<sub>1</sub> a<sub>2</sub> a<sub>3</sub>))<br />
<img src='http://danboykis.com/wp-content/latex/c3c/c3c196b582958e0545af8052bd8d95e9-ffffff-000000-0.png' alt='(a_1 \cdot (a_2 \cdot ( a_3 \cdot i)))' title='(a_1 \cdot (a_2 \cdot ( a_3 \cdot i)))' class='latex' /><br />
(fold-left op i (list a<sub>1</sub> a<sub>2</sub> a<sub>3</sub>))<br />
<img src='http://danboykis.com/wp-content/latex/8bb/8bb357c4b5947a718acd763f7fe3c919-ffffff-000000-0.png' alt='(((i \cdot a_1) \cdot a_2) \cdot a_3)' title='(((i \cdot a_1) \cdot a_2) \cdot a_3)' class='latex' /></p>
<p>Any binary associative operation will be invariant under fold-right and fold-left.</p>
<p>Since 2.37 involved matrix multiplication which is associative, I will use that as an example.<br />
> (define i (list (list 1 0 0) (list 0 1 0) (list 0 0 1)))<br />
> (define a1 (list (list 8 3 2) (list 1 0 9) (list 3 4 5)))<br />
> (define a2 (list (list 5 6 7) (list 1 2 8) (list 6 7 7)))<br />
> (define a3 (list (list 6 7 9) (list 4 3 1) (list 3 4 5)))<br />
> (fold-left matrix-*-matrix i (list a1 a2 a3))<br />
<em>((884 965 1033) (840 900 950) (802 878 942))</em><br />
> (fold-right matrix-*-matrix i (list a1 a2 a3))<br />
<em>((884 965 1033) (840 900 950) (802 878 942))</em></p>
<p>Notice that <strong>i</strong> is the identity matrix because if it wasn't, I would also be testing commutativity of matrix product. Matrix product doesn't commute. If <strong>i</strong> is changed to another matrix <em>fold-left</em> and <em>fold-right</em> will return differing results.</p>
]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/08/exercise-2-38-of-sicp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercise 2.37 of SICP</title>
		<link>http://danboykis.com/2009/08/exercise-2-37-of-sicp/</link>
		<comments>http://danboykis.com/2009/08/exercise-2-37-of-sicp/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 16:45:13 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[SICP]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1785</guid>
		<description><![CDATA[Exercise 2.37: Suppose we represent vectors as sequences of numbers, and matrices as sequences of vectors (the rows of the matrix). For example, the matrix is represented as the sequence ((1 2 3 4) (4 5 6 6) (6 7 8 9)). With this representation, we can use sequence operations to concisely express the basic [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Exercise 2.37:</strong>  Suppose we represent vectors <img src='http://danboykis.com/wp-content/latex/5c1/5c1b934f789b537871cb1649baa1d7a3-ffffff-000000-0.png' alt='v=(v_i)' title='v=(v_i)' class='latex' /> as sequences of numbers, and matrices <img src='http://danboykis.com/wp-content/latex/7aa/7aaba41df01c4bf7c97eca837c8f9df6-ffffff-000000-0.png' alt='m = (m_{ij})' title='m = (m_{ij})' class='latex' /> as sequences of vectors (the rows of the matrix). For example, the matrix</p>
<img src='http://danboykis.com/wp-content/latex/ddc/ddc461a03c0f686e7a35af339e43e6c9-ffffff-000000-0.png' alt='M = \begin{bmatrix} 1&amp;2&amp;3&amp;4\\ 4&amp;5&amp;6&amp;6\\ 6&amp;7&amp;8&amp;9 \end{bmatrix}' title='M = \begin{bmatrix} 1&amp;2&amp;3&amp;4\\ 4&amp;5&amp;6&amp;6\\ 6&amp;7&amp;8&amp;9 \end{bmatrix}' class='latex' />
<p>is represented as the sequence ((1 2 3 4) (4 5 6 6) (6 7 8 9)). With this representation, we can use sequence operations to concisely express the basic matrix and vector operations. These operations (which are described in any book on matrix algebra) are the following:</p>
<table border="0">
<tr>
<td>
<pre>(dot-product v w)</td>
<td>returns the sum <img src='http://danboykis.com/wp-content/latex/889/8899dc20716102d6a8dca91ce99d0ed4-ffffff-000000-0.png' alt='\sum_{i} v_iw_i' title='\sum_{i} v_iw_i' class='latex' /></pre>
</td>
</tr>
<tr>
<td>
<pre>(matrix-*-vector m v)</td>
<td>returns the vector t, where <img src='http://danboykis.com/wp-content/latex/381/3811763a377a3e94b0fa75e611439d80-ffffff-000000-0.png' alt='t_i = \sum_{j} m_{ij}v_j' title='t_i = \sum_{j} m_{ij}v_j' class='latex' /></pre>
</td>
</tr>
<tr>
<td>
<pre>(matrix-*-matrix m n)</td>
<td>returns the matrix p where, <img src='http://danboykis.com/wp-content/latex/ef2/ef29899938aeb60d8fbd99b3c2b9244b-ffffff-000000-0.png' alt='p_{ij} = \sum_{k} m_{ik}n_{kj}' title='p_{ij} = \sum_{k} m_{ik}n_{kj}' class='latex' /></pre>
</td>
</tr>
<tr>
<td>
<pre>(transpose m)</td>
<td>returns the matrix n where, <img src='http://danboykis.com/wp-content/latex/637/637efa6809637002ec5c7d7fd16512f2-ffffff-000000-0.png' alt='n_{ij} = m_{ji}' title='n_{ij} = m_{ji}' class='latex' /></pre>
</td>
</tr>
</table>
<p>We can define the dot product as:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>dot-product v w<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>accumulate<span style="color: #66cc66;"> + </span><span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#40;</span>map<span style="color: #66cc66;"> * </span>v w<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Fill in the missing expressions in the following procedures for computing the other matrix operations. (The procedure accumulate-n is defined in exercise 2.36.)</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>matrix-*-vector m v<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&lt;</span>??<span style="color: #66cc66;">&gt;</span> m<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>transpose mat<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>accumulate-n <span style="color: #66cc66;">&lt;</span>??<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&lt;</span>??<span style="color: #66cc66;">&gt;</span> mat<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>matrix-*-matrix m n<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>cols <span style="color: #66cc66;">&#40;</span>transpose n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&lt;</span>??<span style="color: #66cc66;">&gt;</span> m<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p><strong>Solutions:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> items<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? items<span style="color: #66cc66;">&#41;</span>
    init-<span style="color: #b1b100;">value</span>
    <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> items<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> items<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>accumulate-n op init seqs<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> seqs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #66cc66;">&#40;</span>accumulate op init <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> seqs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>accumulate-n op init <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> seqs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>matrix-*-vector m v<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>row<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>dot-product row v<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> m<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>transpose mat<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>accumulate-n <span style="color: #b1b100;">cons</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> mat<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>matrix-*-matrix m n<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>cols <span style="color: #66cc66;">&#40;</span>transpose n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>row<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>matrix-*-vector cols row<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         m<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>> (define n (list (list 1 2) (list 3 4)))<br />
> (matrix-*-vector n (list 10 20))<br />
<em>(50 110)</em><br />
> (transpose n)<br />
<em>((1 3) (2 4))</em><br />
> (define m (list (list 1 2 3) (list 4 5 6) (list 7 8 9)))<br />
> (matrix-*-matrix m m)<br />
<em>((30 36 42) (66 81 96) (102 126 150))</em><br />
> (define q (list (list 9 1) (list 3 4) (list 6 7) (list 1 8)))<br />
> (matrix-*-matrix (list (list 1 2 3 4) (list 5 6 7 8)) q)<br />
<em>((37 62) (113 142))</em></p>
]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/08/exercise-2-37-of-sicp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercise 2.36 of SICP</title>
		<link>http://danboykis.com/2009/08/exercise-2-36-of-sicp/</link>
		<comments>http://danboykis.com/2009/08/exercise-2-36-of-sicp/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 10:32:06 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[SICP]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1772</guid>
		<description><![CDATA[Exercise 2.36: The procedure accumulate-n is similar to accumulate except that it takes as its third argument a sequence of sequences, which are all assumed to have the same number of elements. It applies the designated accumulation procedure to combine all the first elements of the sequences, all the second elements of the sequences, and [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Exercise 2.36:</strong>  The procedure <em>accumulate-n</em> is similar to <em>accumulate </em>except that it takes as its third argument a sequence of sequences, which are all assumed to have the same number of elements. It applies the designated accumulation procedure to combine all the first elements of the sequences, all the second elements of the sequences, and so on, and returns a sequence of the results. For instance, if s is a sequence containing four sequences, ((1 2 3) (4 5 6) (7 8 9) (10 11 12)), then the value of <em>(accumulate-n + 0 s)</em> should be the sequence (22 26 30). Fill in the missing expressions in the following definition of <em>accumulate-n</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> items<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? items<span style="color: #66cc66;">&#41;</span>
    init-<span style="color: #b1b100;">value</span>
    <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> items<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> items<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>accumulate-n op init seqs<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> seqs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #66cc66;">&#40;</span>accumulate op init <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> seqs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>accumulate-n op init <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> seqs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>> (define s (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12)))<br />
> (accumulate-n + 0 s)<br />
<em>(22 26 30)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/08/exercise-2-36-of-sicp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercise 2.35 of SICP</title>
		<link>http://danboykis.com/2009/08/exercise-2-35-of-sicp/</link>
		<comments>http://danboykis.com/2009/08/exercise-2-35-of-sicp/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 00:46:44 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[SICP]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1762</guid>
		<description><![CDATA[Exercise 2.35: Redefine count-leaves from section 2.2.2 as an accumulation: (define (count-leaves t) (accumulate &#60;??&#62; &#60;??&#62; (map &#60;??> &#60;??&#62;))) &#40;define &#40;count-leaves x&#41; &#40;cond &#40;&#40;null? x&#41; 0&#41; &#40;&#40;not &#40;pair? x&#41;&#41; 1&#41; &#40;else &#40;+ &#40;count-leaves &#40;car x&#41;&#41; &#40;count-leaves &#40;cdr x&#41;&#41;&#41;&#41;&#41;&#41; The goal here is for map to create something that accumulate can consume to count the number [...]]]></description>
			<content:encoded><![CDATA[<p>Exercise 2.35:  Redefine <em>count-leaves</em> from section 2.2.2 as an accumulation:</p>
<pre>
(define (count-leaves t)
  (accumulate &lt;??&gt; &lt;??&gt; (map &lt;??> &lt;??&gt;)))
</pre>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>count-leaves x<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? x<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>  
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>pair? x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>else <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span>count-leaves <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>count-leaves <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>The goal here is for map to create something that <em>accumulate </em>can consume to count the number of leaves. The initial value must be 0 just like in count-leaves. The hard part is to come up with <em>fn</em> that will add up the leaves. If the tree is flatted a simple length function will compute the number of trees.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> items<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? items<span style="color: #66cc66;">&#41;</span>
    init-<span style="color: #b1b100;">value</span>
    <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> items<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> items<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>enumerate-tree x<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? x<span style="color: #66cc66;">&#41;</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>pair? x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>else
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> <span style="color: #66cc66;">&#40;</span>enumerate-tree <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>enumerate-tree <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>count-leaves t<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>accumulate <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>x y<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">1</span> y<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> 
              <span style="color: #cc66cc;">0</span>
              <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>x<span style="color: #66cc66;">&#41;</span> x<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>enumerate-tree t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>I am not sure why map is needed in this example. It just serves to confuse. The lambda argument is really a throw away.<br />
I am aware that it is possible to solve this problem using map in a way that recursively calls <em>count-leaves</em>. I feel like instead of making the computational process clearer as in <em>square-tree</em> and <em>even-fibs </em> it becomes more convoluted and mysterious. Nevertheless I include it bellow for completeness.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>count-leaves t<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>accumulate
    +
    <span style="color: #cc66cc;">0</span> 
    <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>elem<span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>pair? elem<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
             <span style="color: #cc66cc;">1</span>
             <span style="color: #66cc66;">&#40;</span>count-leaves elem<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>The example I like is:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>deep-<span style="color: #b1b100;">reverse</span> seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>e<span style="color: #66cc66;">&#41;</span> 
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>pair? e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           e
           <span style="color: #66cc66;">&#40;</span>deep-<span style="color: #b1b100;">reverse</span> e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">reverse</span> seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/08/exercise-2-35-of-sicp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercise 2.34 of SICP</title>
		<link>http://danboykis.com/2009/08/exercise-2-34-of-sicp/</link>
		<comments>http://danboykis.com/2009/08/exercise-2-34-of-sicp/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 22:30:38 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[lisp]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[SICP]]></category>

		<guid isPermaLink="false">http://danboykis.com/?p=1745</guid>
		<description><![CDATA[Exercise 2.34: Evaluating a polynomial in x at a given value of x can be formulated as an accumulation. We evaluate the polynomial using a well-known algorithm called Horner's rule, which structures the computation as In other words, we start with an, multiply by x, add an-1, multiply by x, and so on, until we [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Exercise 2.34:</strong>  Evaluating a polynomial in x at a given value of x can be formulated as an accumulation. We evaluate the polynomial<br />
<img src='http://danboykis.com/wp-content/latex/1ab/1ab5a4e22d415d69d35556d297c64fff-ffffff-000000-0.png' alt='p(x) = a_n x^n + a_{n-1}x^{n-1} + \cdots + a_1 x+ a_0' title='p(x) = a_n x^n + a_{n-1}x^{n-1} + \cdots + a_1 x+ a_0' class='latex' /><br />
using a well-known algorithm called Horner's rule, which structures the computation as<br />
<img src='http://danboykis.com/wp-content/latex/453/453e0b935700dceefb8dd0ca862ae4d6-ffffff-000000-0.png' alt='(\cdots (a_n x + a_{n-1})x + \cdots + a_1)x + a_0' title='(\cdots (a_n x + a_{n-1})x + \cdots + a_1)x + a_0' class='latex' /><br />
In other words, we start with an, multiply by x, add a<sub>n-1</sub>, multiply by x, and so on, until we reach a<sub>0</sub>. Fill in the following template to produce a procedure that evaluates a polynomial using Horner's rule. Assume that the coefficients of the polynomial are arranged in a sequence, from a<sub>0</sub> through a<sub>n</sub>.</p>
<pre>
(define (horner-eval x coefficient-sequence)
  (accumulate (lambda (this-coeff higher-terms) &lt;??&gt;)
              0
              coefficient-sequence))
</pre>
<p>For example, to compute <img src='http://danboykis.com/wp-content/latex/3fb/3fb024561dafbde469da88d0c11b1ede-ffffff-000000-0.png' alt='1 + 3x + 5x^3 + x^5' title='1 + 3x + 5x^3 + x^5' class='latex' /> at <img src='http://danboykis.com/wp-content/latex/a12/a124de930ea74cbb3991c742ba7504d4-ffffff-000000-0.png' alt='x = 2' title='x = 2' class='latex' /> you would evaluate</p>
<pre>(horner-eval 2 (list 1 3 0 5 0 1))</pre>
<p>I included a non-abstracted version of Horner's method for clarity.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> items<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? items<span style="color: #66cc66;">&#41;</span>
    init-<span style="color: #b1b100;">value</span>
    <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> items<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>accumulate fn init-<span style="color: #b1b100;">value</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> items<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>he x coeff-seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span>? coeff-seq<span style="color: #66cc66;">&#41;</span>
    <span style="color: #cc66cc;">0</span>
    <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> coeff-seq<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>* x <span style="color: #66cc66;">&#40;</span>he x <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> coeff-seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define <span style="color: #66cc66;">&#40;</span>horner-<span style="color: #b1b100;">eval</span> x coeff-seq<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>accumulate <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>this-coeff higher-terms<span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#40;</span>+ this-coeff <span style="color: #66cc66;">&#40;</span>* x higher-terms<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #cc66cc;">0</span>
              coeff-seq<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>> (horner-eval 2 (list 1 3 0 5 0 1))<br />
<em>79</em><br />
> (horner-eval 2 (list 1))<br />
<em>1</em><br />
> (horner-eval 2 (list ))<br />
<em>0</em><br />
> (horner-eval 2 (list 1 1))<br />
<em>3</em></p>
]]></content:encoded>
			<wfw:commentRss>http://danboykis.com/2009/08/exercise-2-34-of-sicp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

