scribble-math/infix/planet-docs/manual/index.html
Jens Axel Søgaard 1ae55396e4 Inital commit
2012-06-20 17:20:30 +02:00

22 lines
29 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text-html; charset=utf-8" /><title>Infix Expressions for PLT Scheme</title><link rel="stylesheet" type="text/css" href="scribble.css" title="default" /><link rel="stylesheet" type="text/css" href="scheme.css" title="default" /><link rel="stylesheet" type="text/css" href="scribble-style.css" title="default" /><script type="text/javascript" src="scribble-common.js"></script></head><body id="scribble-plt-scheme-org"><div class="tocset"><div class="tocview"><div class="tocviewlist" style="margin-bottom: 1em;"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,&quot;tocview_0&quot;);">&#9658;</a></td><td></td><td><a href="/" class="tocviewselflink"><span style="font-weight: bold">Infix Expressions</span> for PLT Scheme</a></td></tr></table></div><div class="tocviewsublistonly" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1&nbsp;</td><td><a href="/#(part._.Getting_.Started)" class="tocviewlink">Getting Started</a></td></tr><tr><td align="right">2&nbsp;</td><td><a href="/#(part._.Examples)" class="tocviewlink">Examples</a></td></tr></table></div></div></div><div class="tocsub"><table class="tocsublist" cellspacing="0"><tr><td><span class="tocsublinknumber">1<tt>&nbsp;</tt></span><a href="#(part._.Getting_.Started)" class="tocsubseclink">Getting Started</a></td></tr><tr><td><span class="tocsublinknumber">1.1<tt>&nbsp;</tt></span><a href="#(part._.Arithmetical_.Operations)" class="tocsubseclink">Arithmetical Operations</a></td></tr><tr><td><span class="tocsublinknumber">1.2<tt>&nbsp;</tt></span><a href="#(part._.Identifiers)" class="tocsubseclink">Identifiers</a></td></tr><tr><td><span class="tocsublinknumber">1.3<tt>&nbsp;</tt></span><a href="#(part._.Application)" class="tocsubseclink">Application</a></td></tr><tr><td><span class="tocsublinknumber">1.4<tt>&nbsp;</tt></span><a href="#(part._.Lists)" class="tocsubseclink">Lists</a></td></tr><tr><td><span class="tocsublinknumber">1.5<tt>&nbsp;</tt></span><a href="#(part._.List_.Reference)" class="tocsubseclink">List Reference</a></td></tr><tr><td><span class="tocsublinknumber">1.6<tt>&nbsp;</tt></span><a href="#(part._.Anonymous_.Functions)" class="tocsubseclink">Anonymous Functions</a></td></tr><tr><td><span class="tocsublinknumber">1.7<tt>&nbsp;</tt></span><a href="#(part._.Square_.Roots)" class="tocsubseclink">Square Roots</a></td></tr><tr><td><span class="tocsublinknumber">1.8<tt>&nbsp;</tt></span><a href="#(part._.Comparisons)" class="tocsubseclink">Comparisons</a></td></tr><tr><td><span class="tocsublinknumber">1.9<tt>&nbsp;</tt></span><a href="#(part._.Logical_.Negation)" class="tocsubseclink">Logical Negation</a></td></tr><tr><td><span class="tocsublinknumber">1.10<tt>&nbsp;</tt></span><a href="#(part._.Assignment)" class="tocsubseclink">Assignment</a></td></tr><tr><td><span class="tocsublinknumber">1.11<tt>&nbsp;</tt></span><a href="#(part._.Sequencing)" class="tocsubseclink">Sequencing</a></td></tr><tr><td><span class="tocsublinknumber">2<tt>&nbsp;</tt></span><a href="#(part._.Examples)" class="tocsubseclink">Examples</a></td></tr><tr><td><span class="tocsublinknumber">2.1<tt>&nbsp;</tt></span><a href="#(part._.Example__.Fibonacci)" class="tocsubseclink">Example:<span class="mywbr"> </span> Fibonacci</a></td></tr><tr><td><span class="tocsublinknumber">2.2<tt>&nbsp;</tt></span><a href="#(part._.Example__.Difference_.Between_a_.Sum_of_.Squares_and_the_.Square_of_a_.Sum)" class="tocsubseclink">Example:<span class="mywbr"> </span> Difference Between a Sum of Squares and the Square of a Sum</a></td></tr><tr><td><span class="tocsublinknumber">2.3<tt>&nbsp;</tt></span><a href="#(part._.Example__.Pythagorean_.Triplets)" class="tocsubseclink">Example:<span class="mywbr"> </span> Pythagorean Triplets</a></td></tr><tr><td><span class="tocsublinknumber">2.4<tt>&nbsp;</tt></span><a href="#(part._.Example__.Miller_.Rabin_.Primality_.Test)" class="tocsubseclink">Example:<span class="mywbr"> </span> Miller Rabin Primality Test</a></td></tr></table></div></div><div class="maincolumn"><div class="main"><h2><a name="(part._top)"></a><span style="font-weight: bold">Infix Expressions</span> for PLT Scheme</h2><div class="SAuthorListBox"><span class="SAuthorList"><p class="author">Jens Axel S&#248;gaard &lt;jensaxel at soegaard dot net&gt;</p></span></div><p>This package provides infix notation for writing mathematical expressions.</p><h3>1<tt>&nbsp;</tt><a name="(part._.Getting_.Started)"></a>Getting Started</h3><p>A simple example, calculating 1+2*3.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(display (format "1+2*3 is ~a\n" @${1+2*3} )</span></span></p></td></tr></table></p><h4>1.1<tt>&nbsp;</tt><a name="(part._.Arithmetical_.Operations)"></a>Arithmetical Operations</h4><p>The arithmetical operations +, -, *, / and ^ is written with standard
mathematical notation. Normal parentheseses are used for grouping.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${2*(1+3^4)}<span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="stt">; evaluates to 164</span></span></p></td></tr></table></p><h4>1.2<tt>&nbsp;</tt><a name="(part._.Identifiers)"></a>Identifiers</h4><p>Identifiers refer to the current lexical scope:</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define x 41)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ x+1 }<span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="stt">; evaluates to 42</span></span></p></td></tr></table></p><h4>1.3<tt>&nbsp;</tt><a name="(part._.Application)"></a>Application</h4><p>Function application use square brackets (as does Mathematica).
Here <span class="ScmSym"><a href="/servlets/doc-search.ss?tag=KCgyKSAwICgpIDAgKCkgKCkgKGMgZGVmIGMgKGMgKGMgcXVvdGUgYyAjJWtlcm5lbCkgYyBz%0D%0AcXJ0KSkp%0D%0A" class="ScmValLink">sqrt</a></span> is bound to the square root function defined
in the language after at-exp, here the scheme language.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(display (format "The square root of 64 is ~a\n" @${sqrt[64]} ))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ list[1,2,3] }<span class="hspace">&nbsp;&nbsp;</span><span class="stt">evaluates to the list (1 2 3)</span></span></p></td></tr></table></p><h4>1.4<tt>&nbsp;</tt><a name="(part._.Lists)"></a>Lists</h4><p>Lists are written with curly brackets {}.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ {1,2,1+2} }<span class="hspace">&nbsp;&nbsp;</span><span class="stt">; evaluates to (1 2 3)</span></span></p></td></tr></table></p><h4>1.5<tt>&nbsp;</tt><a name="(part._.List_.Reference)"></a>List Reference</h4><p>List reference is written with double square brackets.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define xs '(a b c))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ xs[[1]] }<span class="hspace">&nbsp;&nbsp;</span><span class="stt">; evaluates to b</span></span></p></td></tr></table></p><p>Note: Since ]] denotes "closing double square brackets", one currently needs
to insert a space in nested function applications:</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define xs '(a b c))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">@${ exp[log[10] ] }</span></span></p></td></tr></table></p><h4>1.6<tt>&nbsp;</tt><a name="(part._.Anonymous_.Functions)"></a>Anonymous Functions</h4><p>The syntax (&#955; ids . expr) where ids are a space separated list
of identifiers evaluates to function in which the ids are bound in
body expressions.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt"></span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ (&#955;.1)[]}<span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">; evaluates to 1</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ (&#955;x.x+1)[2]}<span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">; evaluates to 3</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">@${ (&#955;x y.x+y+1)[1,2]} ; evaluates to 4</span></span></p></td></tr></table></p><h4>1.7<tt>&nbsp;</tt><a name="(part._.Square_.Roots)"></a>Square Roots</h4><p>Square roots can be written with a literal square root:</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${&#8730;4}<span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">; evaluates to 2</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">@${&#8730;(2+2)} ; evaluates to 2</span></span></p></td></tr></table></p><h4>1.8<tt>&nbsp;</tt><a name="(part._.Comparisons)"></a>Comparisons</h4><p>The comparison operators &lt;, =, &gt;, &lt;=, and &gt;= are available.
The syntaxes &#8804; and &#8805; for &lt;= and &gt;= respectively, works too.
Inequality is tested with &lt;&gt;.</p><h4>1.9<tt>&nbsp;</tt><a name="(part._.Logical_.Negation)"></a>Logical Negation</h4><p>Logical negations is written as &#172;.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ &#172;true }<span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">; evaluates to #f</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ &#172;(1&lt;2) }<span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="stt">; evaluates to #f</span></span></p></td></tr></table></p><h4>1.10<tt>&nbsp;</tt><a name="(part._.Assignment)"></a>Assignment</h4><p>Assignment is written with := .</p><h4>1.11<tt>&nbsp;</tt><a name="(part._.Sequencing)"></a>Sequencing</h4><p>A series of expresions can be evaluated by interspersing semi colons
between the expressions.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define x 0)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span>@${ (x:=1); (x+3) }<span class="hspace">&nbsp;&nbsp;</span><span class="stt">; evaluates to 4</span></span></p></td></tr></table></p><h3>2<tt>&nbsp;</tt><a name="(part._.Examples)"></a>Examples</h3><h4>2.1<tt>&nbsp;</tt><a name="(part._.Example__.Fibonacci)"></a>Example: Fibonacci</h4><p>This problem is from the Euler Project.</p><p>Each new term in the Fibonacci sequence is generated by adding the
previous two terms. By starting with 1 and 2, the first 10 terms will be:</p><p>1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...</p><p>Find the sum of all the even-valued terms in the sequence which do not
exceed four million.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(planet soegaard/infix)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(only-in (planet "while.scm" ("soegaard" "control.plt" 2 0))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">while))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt"></span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define-values (f g t) (values 1 2 0))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define sum f)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">@${</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">while[ g&lt; 4000000,</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">when[ even?[g], sum:=sum+g];</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">t := f + g;</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">f := g;</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">g := t];</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">sum</span></span></p></td></tr></table></p><h4>2.2<tt>&nbsp;</tt><a name="(part._.Example__.Difference_.Between_a_.Sum_of_.Squares_and_the_.Square_of_a_.Sum)"></a>Example: Difference Between a Sum of Squares and the Square of a Sum</h4><p>This problem is from the Euler Project.</p><p>The sum of the squares of the first ten natural numbers is,
1^2 + 2^2 + ... + 10^2 = 385
The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)^2 = 552 = 3025
Hence the difference between the sum of the squares of the first ten natural
numbers and the square of the sum is 3025 - 385 = 2640.</p><p>Find the difference between the sum of the squares of the first one hundred
natural numbers and the square of the sum.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet "while.scm" ("soegaard" "control.plt" 2 0))) ; while</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#|</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt"></span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define n 0)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define ns 0)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define squares 0)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define sum 0)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">@${</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">sum:=0;</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">while[ n&lt;100,</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">n := n+1;</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">ns := ns+n;</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">squares := squares + n^2];</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">ns^2-squares</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">}</span></span></p></td></tr></table></p><h4>2.3<tt>&nbsp;</tt><a name="(part._.Example__.Pythagorean_.Triplets)"></a>Example: Pythagorean Triplets</h4><p>This example is from the Euler Project.</p><p>A Pythagorean triplet is a set of three natural numbers, a,b,c for which,
a^2 + b^2 = c^2
For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2.</p><p>There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt"></span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(let-values ([(a b c) (values 0 0 0)])</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(let/cc return</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(for ([k (in-range 1 100)])</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(for ([m (in-range 2 1000)])</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(for ([n (in-range 1 m)])</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">@${ a := k* 2*m*n;</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">b := k* (m^2 - n^2);</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">c := k* (m^2 + n^2);</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">when[ a+b+c = 1000,</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">display[{{k,m,n}, {a,b,c}}];</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">newline[];</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">return[a*b*c] ]})))))</span></span></p></td></tr></table></p><h4>2.4<tt>&nbsp;</tt><a name="(part._.Example__.Miller_.Rabin_.Primality_.Test)"></a>Example: Miller Rabin Primality Test</h4><p>This example was inspired by Programming Praxis:</p><p>http://programmingpraxis.com/2009/05/01/primality-checking/</p><p><table cellspacing="0"><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">#lang at-exp scheme</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require (planet soegaard/infix))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(require srfi/27) ; random-integer</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt"></span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define (factor2 n)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">; return r and s, s.t n = 2^r * s where s odd</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">; invariant: n = 2^r * s</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(let loop ([r 0] [s n])</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(let-values ([(q r) (quotient/remainder s 2)])</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(if (zero? r)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(loop (+ r 1) q)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(values r s)))))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt"></span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define (miller-rabin n)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">; Input: n odd</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define (mod x) (modulo x n))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define (expt x m)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(cond [(zero? m) 1]</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">[(even? m) @${mod[sqr[x^(m/2)] ]}]</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>[(odd? m)<span class="hspace">&nbsp;&nbsp;</span><span class="stt">@${mod[x*x^(m-1)]}]))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define (check? a)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(let-values ([(r s) (factor2 (sub1 n))])</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">; is a^s congruent to 1 or -1 modulo n ?</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(and @${member[a^s,{1,mod[-1]}]} #t)))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(andmap check?</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">(build-list 50 (&#955; (_) (+ 2 (random-integer (- n 3)))))))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt"></span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(define (prime? n)</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(cond [(&lt; n 2) #f]</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">[(= n 2) #t]</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">[(even? n) #f]</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="stt">[else (miller-rabin n)]))</span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt"></span></span></p></td></tr><tr><td><p><span class="stt"><span class="hspace">&nbsp;&nbsp;</span><span class="stt">(prime? @${2^89-1})</span></span></p></td></tr></table></p></div></div></body></html>