daveg@csvax.cs.caltech.edu (David Gillespie) (10/15/90)
Posting-number: Volume 15, Issue 41 Submitted-by: daveg@csvax.cs.caltech.edu (David Gillespie) Archive-name: calc-1.05/part14 #!/bin/sh # this is part 14 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file calc.patch continued # CurArch=14 if test ! -r s2_seq_.tmp then echo "Please unpack part 1 first!" exit 1; fi ( read Scheck if test "$Scheck" != $CurArch then echo "Please unpack part $Scheck next!" exit 1; else exit 0; fi ) < s2_seq_.tmp || exit 1 sed 's/^X//' << 'SHAR_EOF' >> calc.patch X+ X+ @node Answers to Exercises, , Programming Tutorial, Tutorial X+ @section Answers to Exercises X+ X+ This section includes answers to all the exercises in the Calc tutorial. X+ X+ @menu X+ * RPN Answer 1:: 1 RET 2 RET 3 RET 4 + * - X+ * RPN Answer 2:: 2*4 + 7*9.5 + 5/4 X+ * RPN Answer 3:: Operating on levels 2 and 3 X+ * RPN Answer 4:: Joe's complex problems X+ * Algebraic Answer 1:: Simulating Q command X+ * Algebraic Answer 2:: Joe's algebraic woes X+ * Algebraic Answer 3:: 1 / 0 X+ * Modes Answer 1:: Hexadecimal floating point X+ * Modes Answer 2:: Joe's rounding bug X+ * Modes Answer 3:: Why floating point? X+ * Arithmetic Answer 1:: Why the \ command? X+ * Arithmetic Answer 2:: Tripping up the B command X+ * Vector Answer 1:: Normalizing a vector X+ * Vector Answer 2:: Average position X+ * Matrix Answer 1:: Row and column sums X+ * Matrix Answer 2:: Symbolic system of equations X+ * Matrix Answer 3:: Over-determined system X+ * List Answer 1:: Powers of two X+ * List Answer 2:: Least-squares fit with matrices X+ * List Answer 3:: Geometric mean X+ * List Answer 4:: Divisor function X+ * List Answer 5:: Duplicate factors X+ * List Answer 6:: Triangular list X+ * List Answer 7:: Another triangular list X+ * List Answer 8:: Maximum of Bessel function X+ * List Answer 9:: Integers the hard way X+ * List Answer 10:: All elements equal X+ * Types Answer 1:: Square root of pi times rational X+ * Types Answer 2:: Abbey Road X+ * Types Answer 3:: Erroneous donut X+ * Types Answer 4:: Dividing intervals X+ * Types Answer 5:: Squaring intervals X+ * Types Answer 6:: Fermat's primality test X+ * Types Answer 7:: pi * 10^7 seconds X+ * Types Answer 8:: Abbey Road on CD X+ * Types Answer 9:: Not quite pi * 10^7 seconds X+ * Types Answer 10:: Supercomputers and c X+ * Types Answer 11:: Sam the Slug X+ * Algebra Answer 1:: Squares and square roots X+ * Algebra Answer 2:: Solving a quartic equation X+ * Algebra Answer 3:: Integral of x sin(pi x) X+ * Algebra Answer 4:: Simpson's rule X+ * Programming Answer 1:: Negate third stack element X+ * Programming Answer 2:: Compute sin(x) / x X+ * Programming Answer 3:: Average value of a list X+ * Programming Answer 4:: Continued fraction phi X+ * Programming Answer 5:: Matrix Fibonacci numbers X+ * Programming Answer 6:: Harmonic number greater than 4 X+ * Programming Answer 7:: Newton's method X+ * Programming Answer 8:: Digamma function X+ * Programming Answer 9:: Unpacking a polynomial X+ * Programming Answer 10:: Recursive Stirling numbers X+ @end menu X+ X+ @node RPN Answer 1, RPN Answer 2, Answers to Exercises, Answers to Exercises X+ @subsection RPN Tutorial Exercise 1 X+ X+ @kbd{1 @key{RET} 2 @key{RET} 3 @key{RET} 4 + * -} X+ X+ The result is @samp{1 - (2 * (3 + 4)) = -13}. X+ X+ @node RPN Answer 2, RPN Answer 3, RPN Answer 1, Answers to Exercises X+ @subsection RPN Tutorial Exercise 2 X+ X+ @samp{2*4 + 7*9.5 + 5/4 = 75.75} X+ X+ After computing the intermediate term @samp{2*4 = 8}, you can leave X+ that result on the stack while you compute the second term. With X+ both of these results waiting on the stack you can then compute the X+ final term, then press @kbd{+ +} to add everything up. X+ X+ @group X+ @example X+ 2: 2 1: 8 3: 8 2: 8 X+ 1: 4 . 2: 7 1: 66.5 X+ . 1: 9.5 . X+ . X+ X+ 2 RET 4 * 7 RET 9.5 * X+ @end example X+ @end group X+ X+ @group X+ @example X+ 4: 8 3: 8 2: 8 1: 75.75 X+ 3: 66.5 2: 66.5 1: 67.75 . X+ 2: 5 1: 1.25 . X+ 1: 4 . X+ . X+ X+ 5 RET 4 / + + X+ @end example X+ @end group X+ X+ Alternatively, you could add the first two terms before going on X+ with the third term. X+ X+ @group X+ @example X+ 2: 8 1: 74.5 3: 74.5 2: 74.5 1: 75.75 X+ 1: 66.5 . 2: 5 1: 1.25 . X+ . 1: 4 . X+ . X+ X+ ... + 5 RET 4 / + X+ @end example X+ @end group X+ X+ On an old-style RPN calculator this second method would have the X+ advantage of using only three stack levels. But since Calc's stack X+ can grow arbitrarily large this isn't really an issue. Which method X+ you choose is purely a matter of taste. X+ X+ @node RPN Answer 3, RPN Answer 4, RPN Answer 2, Answers to Exercises X+ @subsection RPN Tutorial Exercise 3 X+ X+ The @key{TAB} key provides a way to operate on the number in level 2. X+ X+ @group X+ @example X+ 3: 10 3: 10 4: 10 3: 10 3: 10 X+ 2: 20 2: 30 3: 30 2: 30 2: 21 X+ 1: 30 1: 20 2: 20 1: 21 1: 30 X+ . . 1: 1 . . X+ . X+ X+ TAB 1 + TAB X+ @end example X+ @end group X+ X+ Similarly, @key{M-TAB} gives you access to the number in level 3. X+ X+ @group X+ @example X+ 3: 10 3: 21 3: 21 3: 30 3: 11 X+ 2: 21 2: 30 2: 30 2: 11 2: 21 X+ 1: 30 1: 10 1: 11 1: 21 1: 30 X+ . . . . . X+ X+ M-TAB 1 + M-TAB M-TAB X+ @end example X+ @end group X+ X+ @node RPN Answer 4, Algebraic Answer 1, RPN Answer 3, Answers to Exercises X+ @subsection RPN Tutorial Exercise 4 X+ X+ Either @kbd{( 2 , 3 )} or @kbd{( 2 @key{SPC} 3 )} would have worked, X+ but using both the comma and the space at once yields: X+ X+ @group X+ @example X+ 1: ( ... 2: ( ... 1: (2, ... 2: (2, ... 2: (2, ... X+ . 1: 2 . 1: (2, ... 1: (2, 3) X+ . . . X+ X+ ( 2 , SPC 3 ) X+ @end example X+ @end group X+ X+ Joe probably tried to type @kbd{@key{TAB} @key{DEL}} to swap the X+ extra incomplete object to the top of the stack and delete it. X+ But a feature of Calc is that @key{DEL} on an incomplete object X+ deletes just one component out of that object, so he had to press X+ @key{DEL} twice to finish the job. X+ X+ @group X+ @example X+ 2: (2, ... 2: (2, 3) 2: (2, 3) 1: (2, 3) X+ 1: (2, 3) 1: (2, ... 1: ( ... . X+ . . . X+ X+ TAB DEL DEL X+ @end example X+ @end group X+ X+ @node Algebraic Answer 1, Algebraic Answer 2, RPN Answer 4, Answers to Exercises X+ @subsection Algebraic Entry Tutorial Exercise 1 X+ X+ Type @kbd{' sqrt($) @key{RET}}. X+ X+ If the @kbd{Q} key is broken, you could use @kbd{' $^0.5 @key{RET}}. X+ Or, RPN style, @kbd{0.5 ^}. X+ X+ @node Algebraic Answer 2, Algebraic Answer 3, Algebraic Answer 1, Answers to Exercises X+ @subsection Algebraic Entry Tutorial Exercise 2 X+ X+ In the formula @samp{2 x (1+y)}, @samp{x} was interpreted as a function X+ name with @samp{1+y} as its argument. Assigning a value to a variable X+ has no relation to a function by the same name. Joe needed to use an X+ explicit @samp{*} symbol here: @samp{2 x*(1+y)}. X+ X+ @node Algebraic Answer 3, Modes Answer 1, Algebraic Answer 2, Answers to Exercises X+ @subsection Algebraic Entry Tutorial Exercise 3 X+ X+ The result from @kbd{1 @key{RET} 0 /} will be the formula @samp{1 / 0}. X+ You can think of this as ``infinity,'' but Calc doesn't really understand X+ the calculus of infinities. When you type @kbd{0 *}, the result will X+ be zero because Calc ``knows'' that anything times zero is zero. The X+ proper mathematical answer is to say that the result is ``indeterminate,'' X+ but Calc has no such concept. X+ X+ @node Modes Answer 1, Modes Answer 2, Algebraic Answer 3, Answers to Exercises X+ @subsection Modes Tutorial Exercise 1 X+ X+ The decimal number @samp{123.456} is just another way of writing X+ @samp{123456 * 10^-3}. Similarly, @samp{16#3A.7F} is the same as X+ @samp{16#3A7F * 16^-2}. Entering this we get the equivalent decimal X+ number 58.49609375 on the stack. We can then press @kbd{Q} to take the X+ square root, 7.64827390658. Now we reverse the process to convert X+ this number back to hexadecimal form: We want four digits after X+ the point, i.e., we want a number which is a hexadecimal integer X+ multiplied by @samp{16^-4}. So, divide by @samp{16^-4}, convert X+ to an integer with @kbd{F} or @kbd{R}, then use @kbd{d r 16} to X+ view the result in hexadecimal: @samp{16#7A5F5}. Thus our X+ floating-point hexadecimal square root is @samp{16#7.A5F5}. X+ X+ @node Modes Answer 2, Modes Answer 3, Modes Answer 1, Answers to Exercises X+ @subsection Modes Tutorial Exercise 2 X+ X+ The answer he got was @samp{0.5000000000006399}. X+ X+ The problem is not that the square operation is inexact, but that the X+ sine of 45 that was already on the stack was accurate to only 12 places. X+ Arbitrary-precision calculations still only give answers as good as X+ their inputs. X+ X+ The real problem is that there is no 12-digit number which, when X+ squared, comes out to 0.5 exactly. The @kbd{f [} and @kbd{f ]} X+ commands decrease or increase a number by one unit in the last X+ place (according to the current precision). They are useful for X+ determining facts like this. X+ X+ @group X+ @example X+ 1: 0.707106781187 1: 0.500000000001 X+ . . X+ X+ 45 S 2 ^ X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: 0.707106781187 1: 0.707106781186 1: 0.499999999999 X+ . . . X+ X+ U f [ 2 ^ X+ @end example X+ @end group X+ X+ A high-precision calculation must be carried out in high precision X+ all the way. The only number in the original problem which was known X+ exactly was the quantity 45 degrees, so the precision must be raised X+ before anything is done after the number 45 has been entered in order X+ for the higher precision to be meaningful. X+ X+ @node Modes Answer 3, Arithmetic Answer 1, Modes Answer 2, Answers to Exercises X+ @subsection Modes Tutorial Exercise 3 X+ X+ Many calculations involve real-world quantities, like the width and X+ height of a piece of wood or the volume of a jar. Such quantities X+ can't be measured exactly anyway, and if the data that is input to X+ a calculation is inexact, doing exact arithmetic on it is a waste X+ of time. X+ X+ Fractions become unwieldy after too many calculations have been X+ done with them. For example, the sum of the reciprocals of the X+ integers from 1 to 10 is 7381:2520. The sum from 1 to 30 is X+ 9304682830147:2329089562800. After a point it will take a long X+ time to add even one more term to this sum, but a floating-point X+ calculation of the sum will not have this problem. X+ X+ Also, rational numbers cannot express the results of all calculations. X+ There is no fractional form for the square root of two, so if you type X+ @kbd{2 Q}, Calc has no choice but to give you a floating-point answer. X+ X+ @node Arithmetic Answer 1, Arithmetic Answer 2, Modes Answer 3, Answers to Exercises X+ @subsection Arithmetic Tutorial Exercise 1 X+ X+ Dividing two integers that are larger than the current precision may X+ give a floating-point result that is inaccurate even when rounded X+ down to an integer. Consider @samp{123456789 / 2} when the current X+ precision is 6 digits. The true answer is @samp{61728394.5}, but X+ with a precision of 6 this will be rounded to @samp{61728300.}. X+ The result, when converted to an integer, will be off by 94. X+ X+ Here are two solutions: Raise the precision enough that the X+ floating-point round-off error is strictly to the right of the X+ decimal point. Or, convert to fraction mode so that @samp{123456789 / 2} X+ produces the exact fraction @samp{123456789:2}, which can be rounded X+ down by the @kbd{F} command without ever switching to floating-point X+ format. X+ X+ @node Arithmetic Answer 2, Vector Answer 1, Arithmetic Answer 1, Answers to Exercises X+ @subsection Arithmetic Tutorial Exercise 2 X+ X+ @kbd{27 @key{RET} 9 B} could give the exact result @samp{3:2}, but it X+ does a floating-point calculation instead and produces @samp{1.5}. X+ X+ Calc will find an exact result for a logarithm if the result is an integer X+ or the reciprocal of an integer. But there is no efficient way to search X+ the space of all possible rational numbers for an exact answer, so Calc X+ doesn't try. X+ X+ @node Vector Answer 1, Vector Answer 2, Arithmetic Answer 2, Answers to Exercises X+ @subsection Vector Tutorial Exercise 1 X+ X+ Duplicate the vector, compute its length, then divide the vector X+ by its length: @kbd{@key{RET} A /}. X+ X+ @node Vector Answer 2, Matrix Answer 1, Vector Answer 1, Answers to Exercises X+ @subsection Vector Tutorial Exercise 2 X+ X+ The average position is equal to the sum of the products of the X+ positions times their corresponding probabilities. This is the X+ definition of the dot product operation. So all you need to do X+ is to put the two vectors on the stack and press @kbd{*}. X+ X+ @node Matrix Answer 1, Matrix Answer 2, Vector Answer 2, Answers to Exercises X+ @subsection Matrix Tutorial Exercise 1 X+ X+ The trick is to multiply by a vector of ones. Use @kbd{r 4 [1 1 1] *} to X+ get the row sum. Similarly, use @kbd{[1 1] r 4 *} to get the column sum. X+ X+ @node Matrix Answer 2, Matrix Answer 3, Matrix Answer 1, Answers to Exercises X+ @subsection Matrix Tutorial Exercise 2 X+ X+ @group X+ @example X+ x + a y = 6 X+ x + b y = 10 X+ @end example X+ @end group X+ X+ Just enter the righthand side vector, then divide by the lefthand side X+ matrix as usual. X+ X+ @group X+ @example X+ 1: [6, 10] 2: [6, 10] 1: [6 - 4 a / (b - a), 4 / (b - a) ] X+ . 1: [ [ 1, a ], . X+ [ 1, b ] ] X+ . X+ X+ ' [6 10] RET ' [1 a; 1 b] RET / X+ @end example X+ @end group X+ X+ This can be made more readable using @kbd{d B} to enable ``big'' display X+ mode: X+ X+ @group X+ @example X+ 4 a 4 X+ 1: [6 - -----, -----] X+ b - a b - a X+ @end example X+ @end group X+ X+ Type @kbd{d N} to return to ``normal'' display mode afterwards. X+ X+ @node Matrix Answer 3, List Answer 1, Matrix Answer 2, Answers to Exercises X+ @subsection Matrix Tutorial Exercise 3 X+ X+ To solve @samp{trn(A) * A * X = trn(A) * B}, first we compute X+ @samp{A' = trn(A) * A} and @samp{B' = trn(A) * B}; now, we have a X+ system @samp{A' * X = B'} which we can solve using Calc's @samp{/} X+ command. X+ X+ @group X+ @example X+ a + 2b + 3c = 6 X+ 4a + 5b + 6c = 2 X+ 7a + 6b = 3 X+ 2a + 4b + 6c = 11 X+ @end example X+ @end group X+ X+ The first step is to enter the coefficient matrix. We'll store it in X+ quick variable number 7 for later reference. Next, we compute the X+ @samp{B'} vector. X+ X+ @group X+ @example X+ 1: [ [ 1, 2, 3 ], 2: [ [ 1, 4, 7, 2 ], 1: [57, 84, 96] X+ [ 4, 5, 6 ], [ 2, 5, 6, 4 ], . X+ [ 7, 6, 0 ], [ 3, 6, 0, 6 ] ] X+ [ 2, 4, 6 ] ] 1: [6, 2, 3, 11] X+ . . X+ X+ ' [1 2 3; 4 5 6; 7 6 0; 2 4 6] RET s 7 v t [6 2 3 11] * X+ @end example X+ @end group X+ X+ Now we compute the matrix @samp{A'} and divide. X+ X+ @group X+ @example X+ 2: [57, 84, 96] 1: [-11.64, 14.08, -3.64] X+ 1: [ [ 70, 72, 39 ], . X+ [ 72, 81, 60 ], X+ [ 39, 60, 81 ] ] X+ . X+ X+ r 7 v t r 7 * / X+ @end example X+ @end group X+ X+ (The actual computed answer will be slightly inexact due to X+ round-off error.) X+ X+ Notice that the answers are similar to those for the 3x3 system X+ solved in the text. That's because the fourth equation that was X+ added to the system is almost identical to the first one multiplied X+ by two. (If it were identical, we would have gotten the exact same X+ answer since the 4x3 system would be equivalent to the original 3x3 X+ system.) X+ X+ Since the first and fourth equations aren't quite equivalent, they X+ can't both be satisfied at once. Let's plug our answers back into X+ the original system of equations to see how well they match. X+ X+ @group X+ @example X+ 2: [-11.64, 14.08, -3.64] 1: [5.6, 2., 3., 11.2] X+ 1: [ [ 1, 2, 3 ], . X+ [ 4, 5, 6 ], X+ [ 7, 6, 0 ], X+ [ 2, 4, 6 ] ] X+ . X+ X+ r 7 TAB * X+ @end example X+ @end group X+ X+ This is reasonably close to our original @samp{B} vector, X+ @samp{[6, 2, 3, 11]}. X+ X+ @node List Answer 1, List Answer 2, Matrix Answer 3, Answers to Exercises X+ @subsection List Tutorial Exercise 1 X+ X+ We can use @kbd{v x} to build a vector of integers. This needs to be X+ adjusted to get the range of integers we desire. Mapping @samp{-} X+ across the vector will accomplish this, although it turns out the X+ plain @samp{-} key will work just as well. X+ X+ @group X+ @example X+ 2: 2 2: 2 X+ 1: [1, 2, 3, 4, 5, 6, 7, 8, 9] 1: [-4, -3, -2, -1, 0, 1, 2, 3, 4] X+ . . X+ X+ 2 v x 9 RET 5 V M - or 5 - X+ @end example X+ @end group X+ X+ Now we use @kbd{V M ^} to map the exponentiation operator across the X+ vector. X+ X+ @group X+ @example X+ 1: [0.0625, 0.125, 0.25, 0.5, 1, 2, 4, 8, 16] X+ . X+ X+ V M ^ X+ @end example X+ @end group X+ X+ @node List Answer 2, List Answer 3, List Answer 1, Answers to Exercises X+ @subsection List Tutorial Exercise 2 X+ X+ Given @var{x} and @var{y} vectors in quick variables 1 and 2 as before, X+ the first job is to form the matrix that describes the problem. X+ X+ @example X+ m*x + b*1 = y X+ @end example X+ X+ Thus we want a 19x2 matrix with our @var{x} vector as one column and X+ ones as the other column. So, first we build the column of ones, then X+ we combine the two columns to form our @samp{A} matrix. X+ X+ @group X+ @example X+ 2: [1.34, 1.41, 1.49, ... ] 1: [ [ 1.34, 1 ], X+ 1: [1, 1, 1, ...] [ 1.41, 1 ], X+ . @dots{} X+ X+ r 1 1 v b 19 RET M-2 v p v t s 3 X+ @end example X+ @end group X+ X+ Now we compute @samp{trn(A) * y} and @samp{trn(A) * A} and divide. X+ X+ @group X+ @example X+ 1: [33.36554, 13.613] 2: [33.36554, 13.613] X+ . 1: [ [ 98.0003, 41.63 ], X+ [ 41.63, 19 ] ] X+ . X+ X+ v t r 2 * r 2 v t r 2 * X+ @end example X+ @end group X+ X+ (Hey, those numbers look familiar!) X+ X+ @group X+ @example X+ 1: [0.52141679, -0.425978] X+ . X+ X+ / X+ @end example X+ @end group X+ X+ Since we were solving equations of the form @samp{m*x + b*1 = y}, these X+ numbers should be @var{m} and @var{b}, respectively. Sure enough, they X+ agree exactly with the result computed using @kbd{V M} and @kbd{V R}! X+ X+ The moral of this story: @kbd{V M} and @kbd{V R} will probably solve X+ your problem, but there is often an easier way using the higher-level X+ arithmetic functions! X+ X+ @node List Answer 3, List Answer 4, List Answer 2, Answers to Exercises X+ @subsection List Tutorial Exercise 3 X+ X+ Move to one end of the list and press @kbd{C-@@} (or @kbd{C-SPC} or X+ whatever) to set the mark, then move to the other end of the list X+ and type @kbd{C-u M-x calc-grab-region}. X+ X+ @group X+ @example X+ 1: [2.3, 6, 22, 15.1, 7, 15, 14, 7.5, 2.5] X+ . X+ @end example X+ @end group X+ X+ To make things interesting, let's assume we don't know at a glance X+ how many numbers are in this list. Then we could type: X+ X+ @group X+ @example X+ 2: [2.3, 6, 22, ... ] 2: [2.3, 6, 22, ... ] X+ 1: [2.3, 6, 22, ... ] 1: 126356422.5 X+ . . X+ X+ RET V R * X+ @end example X+ @end group X+ X+ @group X+ @example X+ 2: 126356422.5 2: 126356422.5 1: 7.94652913734 X+ 1: [2.3, 6, 22, ... ] 1: 9 . X+ . . X+ X+ TAB v l I ^ X+ @end example X+ @end group X+ X+ (The @kbd{I ^} command computes the @var{n}th root of a number. X+ You could also type @samp{& ^} to take the reciprocal of 9 and X+ then raise the number to that power.) X+ X+ @node List Answer 4, List Answer 5, List Answer 3, Answers to Exercises X+ @subsection List Tutorial Exercise 4 X+ X+ A number @var{j} is a divisor of @var{n} if @samp{n % j = 0}. The first X+ step is to get a vector that identifies the divisors. X+ X+ @group X+ @example X+ 2: 30 2: [0, 0, 0, 2, ...] 1: [1, 1, 1, 0, ...] X+ 1: [1, 2, 3, 4, ...] 1: 0 . X+ . . X+ X+ 30 RET v x 30 RET s 1 V M % 0 V M a = s 2 X+ @end example X+ @end group X+ X+ The zeroth divisor function is just the total number of divisors. X+ The first divisor function is the sum of the divisors. X+ X+ @group X+ @example X+ 1: 8 3: 8 2: 8 2: 8 X+ 2: [1, 2, 3, 4, ...] 1: [1, 2, 3, 0, ...] 1: 72 X+ 1: [1, 1, 1, 0, ...] . . X+ . X+ X+ V R + r 1 r 2 V M * V R + X+ @end example X+ @end group X+ X+ Once again, the last two steps just compute a dot product for which X+ a simple @kbd{*} would have worked equally well. X+ X+ @node List Answer 5, List Answer 6, List Answer 4, Answers to Exercises X+ @subsection List Tutorial Exercise 5 X+ X+ The obvious first step is to obtain the list of factors with @kbd{k f}. X+ This list will always be in sorted order, so if there are duplicates X+ they will be right next to each other. A suitable method is to compare X+ the list with a copy of itself shifted over by one. X+ X+ @group X+ @example X+ 1: [3, 7, 7, 7, 19] 2: [3, 7, 7, 7, 19] 2: [3, 7, 7, 7, 19, 0] X+ . 1: [3, 7, 7, 7, 19, 0] 1: [0, 3, 7, 7, 7, 19] X+ . . X+ X+ 19551 k f RET 0 | TAB 0 TAB | X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [0, 0, 1, 1, 0, 0] 1: 2 1: 0 X+ . . . X+ X+ V M a = V R + 0 a = X+ @end example X+ @end group X+ X+ Note that we have to arrange for both vectors to have the same length X+ so that the mapping operation works; no prime factor will ever be X+ zero, so adding zeros on the left and right is safe. From then on X+ the job is pretty straightforward. X+ X+ Incidentally, Calc provides the @dfn{Moebius mu} function which is X+ zero if and only if its argument is square-free. It would be a much X+ more convenient way to do the above test in practice. X+ X+ @node List Answer 6, List Answer 7, List Answer 5, Answers to Exercises X+ @subsection List Tutorial Exercise 6 X+ X+ First use @kbd{v x 6 RET} to get a list of integers, then @kbd{V M v x} X+ to get a list of lists of integers! X+ X+ @node List Answer 7, List Answer 8, List Answer 6, Answers to Exercises X+ @subsection List Tutorial Exercise 7 X+ X+ Here's one solution. First, compute the triangular list from the previous X+ exercise and type @kbd{1 -} to subtract one from all the elements. X+ X+ @group X+ @example X+ 1: [ [0], X+ [0, 1], X+ [0, 1, 2], X+ @dots{} X+ X+ 1 - X+ @end example X+ @end group X+ X+ The numbers down the lefthand edge of the list we desire are called X+ the ``triangular numbers'' (now you know why!). The @var{n}th X+ triangular number is the sum of the integers from 1 to @var{n}, and X+ can be computed directly by the formula @samp{n * (n+1) / 2}. X+ X+ @group X+ @example X+ 2: [ [0], [0, 1], ... ] 2: [ [0], [0, 1], ... ] X+ 1: [0, 1, 2, 3, 4, 5] 1: [0, 1, 3, 6, 10, 15] X+ . . X+ X+ v x 6 RET 1 - V M ' n*(n+1)/2 RET RET X+ @end example X+ @end group X+ X+ Adding this list to the above list of lists produces the desired X+ result: X+ X+ @group X+ @example X+ 1: [ [0], X+ [1, 2], X+ [3, 4, 5], X+ [6, 7, 8, 9], X+ [10, 11, 12, 13, 14], X+ [15, 16, 17, 18, 19, 20] ] X+ . X+ X+ V M + X+ @end example X+ @end group X+ X+ If we did not know the formula for triangular numbers, we could have X+ computed them using an @kbd{H V R +} command. We could also have X+ gotten them the hard way by mapping a reduction across the original X+ triangular list. X+ X+ @group X+ @example X+ 2: [ [0], [0, 1], ... ] 2: [ [0], [0, 1], ... ] X+ 1: [ [0], [0, 1], ... ] 1: [0, 1, 3, 6, 10, 15] X+ . . X+ X+ RET V M ' reduce(add,x) RET C-a C-k (x) RET X+ @end example X+ @end group X+ X+ The @kbd{C-a C-k (x)} represents changing the default argument list, X+ @samp{(add x)}, to our desired argument list, @samp{(x)}. Calc did not X+ understand that the @code{add} was a function name and not a variable X+ in the @code{reduce} expression. X+ X+ Incidentally, the algebraic notation for mappings and reductions was X+ not covered in the Tutorial; you could discover it for yourself like X+ this: X+ X+ @group X+ @example X+ 1: a 1: reduce(mul, a) X+ . . X+ X+ ' a RET V R * X+ @end example X+ @end group X+ X+ As usual, since @samp{a} is not an acceptable type of argument for X+ a @kbd{V R} command, the operation is left in symbolic form on the X+ stack. X+ X+ @node List Answer 8, List Answer 9, List Answer 7, Answers to Exercises X+ @subsection List Tutorial Exercise 8 X+ X+ The first step is to build a list of values of @samp{x}. X+ X+ @group X+ @example X+ 1: [1, 2, 3, ..., 21] 1: [0, 1, 2, ..., 20] 1: [0, 0.25, 0.5, ..., 5] X+ . . . X+ X+ v x 21 RET 1 - 4 / s 1 X+ @end example X+ @end group X+ X+ Next, we compute the Bessel function values. X+ X+ @group X+ @example X+ 1: [0., 0.124, 0.242, ..., -0.328] X+ . X+ X+ V M ' besJ(1,x) RET RET X+ @end example X+ @end group X+ X+ A way to isolate the maximum value is to compute the maximum using X+ @kbd{V R X}, then compare all the Bessel values with that maximum. X+ X+ @group X+ @example X+ 2: [0., 0.124, 0.242, ... ] 1: [0, 0, 0, ... ] 2: [0, 0, 0, ... ] X+ 1: 0.5801562 . 1: 1 X+ . . X+ X+ V R X V M a = RET V R + DEL X+ @end example X+ @end group X+ X+ It's a good idea to verify, as in the last step above, that only X+ one value is equal to the maximum. (After all, a plot of @samp{sin(x)} X+ might have many points all equal to the maximum value, 1.) X+ X+ The vector we have now has a single 1 in the position that indicates X+ the maximum value of @samp{x}. Now it is a simple matter to convert X+ this back into the corresponding value itself. X+ X+ @group X+ @example X+ 2: [0, 0, 0, ... ] 1: [0, 0., 0., ... ] 1: 1.75 X+ 1: [0, 0.25, 0.5, ... ] . . X+ . X+ X+ r 1 V M * V R + X+ @end example X+ @end group X+ X+ If @samp{a =} had produced more than one @samp{1} value, this method X+ would have given the sum of all maximum @samp{x} values; not very X+ useful! In this case we could have used @kbd{v m} (@code{calc-mask-vector}) X+ instead. This command deletes all elements of a ``data'' vector that X+ correspond to zeros in a ``mask'' vector, leaving us with, in this X+ example, a vector of maximum @samp{x} values. X+ X+ @node List Answer 9, List Answer 10, List Answer 8, Answers to Exercises X+ @subsection List Tutorial Exercise 9 X+ X+ Step one is to convert our integer into vector notation. X+ X+ @group X+ @example X+ 1: 25129925999 3: 25129925999 X+ . 2: 10 X+ 1: [11, 10, 9, ..., 1, 0] X+ . X+ X+ 25129925999 RET 10 RET 12 RET v x 12 RET - X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: 25129925999 1: [0, 2, 25, 251, 2512, ... ] X+ 2: [100000000000, ... ] . X+ . X+ X+ V M ^ s 1 V M \ X+ @end example X+ @end group X+ X+ (Recall, the @kbd{\} command computes an integer quotient.) X+ X+ @group X+ @example X+ 1: [0, 2, 5, 1, 2, 9, 9, 2, 5, 9, 9, 9] X+ . X+ X+ 10 V M % s 2 X+ @end example X+ @end group X+ X+ Next we must increment this number. This involves adding one to X+ the last digit, plus handling carries. There is a carry out of a X+ digit to the left if that digit is a nine and all the digits to X+ the right of it are nines. X+ X+ @group X+ @example X+ 1: [0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1] 1: [1, 1, 1, 0, 0, 1, ... ] X+ . . X+ X+ 9 V M a = v v X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [1, 1, 1, 0, 0, 0, ... ] 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1] X+ . . X+ X+ H V R * v v 1 | X+ @end example X+ @end group X+ X+ Accumulating @kbd{*} across a vector of ones and zeros will preserve X+ only the leftmost run of ones. These are the carries into all digits X+ except the rightmost digit. Concatenating a one on the right takes X+ care of aligning the carries properly, and also adding one to the X+ rightmost digit. X+ X+ @group X+ @example X+ 2: [0, 0, 0, 0, ... ] 1: [0, 0, 2, 5, 1, 2, 9, 9, 2, 6, 0, 0, 0] X+ 1: [0, 0, 2, 5, ... ] . X+ . X+ X+ 0 r 2 | V M + 10 V M % X+ @end example X+ @end group X+ X+ Here we have concatenated 0 to the @emph{left} of the original number; X+ this takes care of shifting the carries by one with respect to the X+ digits that generated them. X+ X+ Finally, we must convert this list back into an integer. X+ X+ @group X+ @example X+ 3: [0, 0, 2, 5, ... ] 2: [0, 0, 2, 5, ... ] X+ 2: 1000000000000 1: [1000000000000, 100000000000, ... ] X+ 1: [100000000000, ... ] . X+ . X+ X+ 10 RET 12 ^ r 1 | X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [0, 0, 20000000000, 5000000000, ... ] 1: 25129926000 X+ . . X+ X+ V M * V R + X+ @end example X+ @end group X+ X+ @node List Answer 10, Types Answer 1, List Answer 9, Answers to Exercises X+ @subsection List Tutorial Exercise 10 X+ X+ For the list @samp{[a, b, c, d]}, the result is @samp{((a = b) = c) = d}, X+ which will compare @samp{a} and @samp{b} to produce a 1 or 0, which is X+ then compared with @samp{c} to produce another 1 or 0, which is then X+ compared with @samp{d}. This is not at all what Joe wanted. X+ X+ Here's a more correct method: X+ X+ @group X+ @example X+ 1: [7, 7, 7, 8, 7] 2: [7, 7, 7, 8, 7] X+ . 1: 7 X+ . X+ X+ ' [7,7,7,8,7] RET RET v r 1 RET X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [1, 1, 1, 0, 1] 1: 0 X+ . . X+ X+ V M a = V R * X+ @end example X+ @end group X+ X+ @node Types Answer 1, Types Answer 2, List Answer 10, Answers to Exercises X+ @subsection Types Tutorial Exercise 1 X+ X+ If the number is the square root of @samp{pi} times a rational number, X+ then its square, divided by @samp{pi}, should be a rational number. X+ X+ @group X+ @example X+ 1: 1.26508260337 1: 0.509433962268 1: 2486645810:4881193627 X+ . . . X+ X+ 2 ^ P / c F X+ @end example X+ @end group X+ X+ Technically speaking this is a rational number, but not one that is X+ likely to have arisen in the original problem. More likely, it just X+ happens to be the fraction which most closely represents some X+ irrational number to within 12 digits. X+ X+ But perhaps our result was not quite exact. Let's reduce the X+ precision slightly and try again: X+ X+ @group X+ @example X+ 1: 0.509433962268 1: 27:53 X+ . . X+ X+ U p 10 RET c F X+ @end example X+ @end group X+ X+ Aha! It's unlikely that an irrational number would equal a fraction X+ this simple to within ten digits, so our original number was probably X+ @samp{sqrt(27 pi / 53)}. X+ X+ Notice that we didn't need to re-round the number when we reduced the X+ precision. Remember, arithmetic operations always round their inputs X+ to the current precision before starting. X+ X+ @node Types Answer 2, Types Answer 3, Types Answer 1, Answers to Exercises X+ @subsection Types Tutorial Exercise 2 X+ X+ @group X+ @example X+ 2: 0@@ 47' 26" 1: 0@@ 2' 47.411765" X+ 1: 17 . X+ . X+ X+ 0@@ 47' 26" RET 17 / X+ @end example X+ @end group X+ X+ The average song length is two minutes and 47.4 seconds. X+ X+ @group X+ @example X+ 2: 0@@ 2' 47.411765" 1: 0@@ 3' 7.411765" 1: 0@@ 53' 6.000005" X+ 1: 0@@ 0' 20" . . X+ . X+ X+ 20" + 17 * X+ @end example X+ @end group X+ X+ The album would be 53 minutes and 6 seconds long. X+ X+ @node Types Answer 3, Types Answer 4, Types Answer 2, Answers to Exercises X+ @subsection Types Tutorial Exercise 3 X+ X+ The relative errors must be converted to absolute errors so that X+ @samp{+/-} notation may be used. X+ X+ @group X+ @example X+ 1: 1. 2: 1. X+ . 1: 0.2 X+ . X+ X+ 20 RET .05 * 4 RET .05 * X+ @end example X+ @end group X+ X+ Now we simply chug through the formula. X+ X+ @group X+ @example X+ 1: 39.4784176044 1: 789.56 +/- 39.478 1: 12633. +/- 1412.4 X+ . . . X+ X+ 4 P 2 ^ * 20 p 1 * 4 p .2 RET 2 ^ * X+ @end example X+ @end group X+ X+ It turns out the @kbd{v u} command will unpack an error form as X+ well as a vector. This saves us some retyping of numbers. X+ X+ @group X+ @example X+ 3: 12633. +/- 1412.4 2: 12633 +/- 1412.4 X+ 2: 12633. 1: 0.1118 X+ 1: 1412.4 . X+ . X+ X+ RET v u TAB / X+ @end example X+ @end group X+ X+ Thus the volume is 12633 cubic centimeters, within about 11 percent. X+ X+ @node Types Answer 4, Types Answer 5, Types Answer 3, Answers to Exercises X+ @subsection Types Tutorial Exercise 4 X+ X+ It is an error to divide by an interval that contains zero, or that has X+ zero as an open limit. Note that the interval @samp{(0, 10]} doesn't X+ actually contain zero as a possible value, but dividing by it is still X+ an error. If Calc had a symbol for infinity, it could write X+ @samp{[0.1, infinity)} for the reciprocal of @samp{(0, 10]}. But it X+ doesn't, so there's no way to express an interval that is unbounded X+ on one end. X+ X+ @node Types Answer 5, Types Answer 6, Types Answer 4, Answers to Exercises X+ @subsection Types Tutorial Exercise 5 X+ X+ @group X+ @example X+ 1: [-3 .. 3] 2: [-3 .. 3] 2: [0 .. 9] X+ . 1: [0 .. 9] 1: [-9 .. 9] X+ . . X+ X+ [ 3 n .. 3 ] RET 2 ^ TAB RET * X+ @end example X+ @end group X+ X+ In the first case the result says, ``if a number is between -3 and 3, X+ its square is between 0 and 9.'' The second case says, ``the product X+ of two numbers each between -3 and 3 is between -9 and 9.'' X+ X+ An interval form is not a number; it is a symbol that can stand for X+ many different numbers. Two identical-looking error forms can stand X+ for different numbers. X+ X+ The same issue arises when you try to square an error form. X+ X+ @node Types Answer 6, Types Answer 7, Types Answer 5, Answers to Exercises X+ @subsection Types Tutorial Exercise 6 X+ X+ Testing the first number, we might arbitrarily choose 17 for @samp{x}. X+ X+ @group X+ @example X+ 1: 17 mod 811749613 2: 17 mod 811749613 1: 533694123 mod 811749613 X+ . 811749612 . X+ . X+ X+ 17 M 811749613 RET 811749612 ^ X+ @end example X+ @end group X+ X+ Since 533694123 is (considerably) different from 1, the number must X+ not be prime. X+ X+ It's awkward to type the number in twice as we did above. There are X+ various ways to avoid this, and algebraic entry is one. In fact, using X+ a vector mapping operation we can perform several tests at once. Let's X+ use this method to test the second number. X+ X+ @group X+ @example X+ 2: [17, 42, 100000] 1: [1 mod 15485863, 1 mod ... ] X+ 1: 15485863 . X+ . X+ X+ [17 42 100000] 15485863 RET V M ' (a mod n)^(n-1) RET RET X+ @end example X+ @end group X+ X+ We use @samp{a} instead of @samp{x} here so that the argument list X+ will come out right without editing. Calc sorts the variable names X+ into alphabetical order to form the default argument list, @samp{(a n)} X+ in this case. The result is three ones (modulo @samp{n}), so it's X+ very probable that 15485863 is prime. (In fact, this number is the X+ millionth prime.) X+ X+ Note that the formulas @samp{a^(n-1) mod n} or @samp{a^(n-1) % n} would X+ have been vastly less efficient, since they would have calculated X+ the power using full integer arithmetic. X+ X+ Calc has a @kbd{k p} command that does primality testing. For small X+ numbers it does an exact test; for large numbers it uses a variant X+ of the Fermat test we used here. You can use @kbd{k p} repeatedly X+ to prove that a large integer is prime with any desired probability. X+ X+ @node Types Answer 7, Types Answer 8, Types Answer 6, Answers to Exercises X+ @subsection Types Tutorial Exercise 7 X+ X+ It's not easy to insert a calculated number into an HMS form, so X+ instead we'll express the number in hours. X+ X+ @group X+ @example X+ 1: 31415926.5359 1: 8726.64625997 X+ . . X+ X+ P 1e7 * 3600 / X+ @end example X+ @end group X+ X+ It's important to use degrees mode when combining real numbers with X+ HMS forms. If you were in radians mode, Calc would convert 8726 X+ ``radians'' to degrees. X+ X+ @group X+ @example X+ 2: 8726.64625997 1: 6@@ 6' 2.5359" mod 24@@ 0' 0" X+ 1: 15@@ 27' 16" mod 24@@ 0' 0" . X+ . X+ X+ x time RET m d + X+ @end example X+ @end group X+ X+ It will be just after six in the morning. X+ X+ @node Types Answer 8, Types Answer 9, Types Answer 7, Answers to Exercises X+ @subsection Types Tutorial Exercise 8 X+ X+ As we recall, there are 17 songs of about 2 minutes and 47 seconds X+ each. X+ X+ @group X+ @example X+ 2: 0@@ 2' 47" 1: [0@@ 3' 7" .. 0@@ 3' 47"] X+ 1: [0@@ 0' 20" .. 0@@ 1' 0"] . X+ X+ + X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [0@@ 52' 59." .. 1@@ 4' 19."] X+ . X+ X+ 17 * X+ @end example X+ @end group X+ X+ No matter how long it is, the album will fit nicely on one CD. X+ X+ @node Types Answer 9, Types Answer 10, Types Answer 8, Answers to Exercises X+ @subsection Types Tutorial Exercise 9 X+ X+ Type @kbd{' 1 yr RET u c s RET}. The answer is 31557600 seconds. X+ X+ @node Types Answer 10, Types Answer 11, Types Answer 9, Answers to Exercises X+ @subsection Types Tutorial Exercise 10 X+ X+ How long will it take for a signal to get from one end of the computer X+ to the other? X+ X+ @group X+ @example X+ 1: m / c 1: 3.3356 ns X+ . . X+ X+ ' 1 m / c RET u c ns RET X+ @end example X+ @end group X+ X+ (Recall, @samp{c} is a ``unit'' corresponding to the speed of light.) X+ X+ @group X+ @example X+ 1: 3.3356 ns 1: 0.81356 ns / ns 1: 0.81356 X+ 2: 4.1 ns . . X+ . X+ X+ ' 4.1 ns RET / u s X+ @end example X+ @end group X+ X+ Thus a signal could take up to 81 percent of a clock cycle just to X+ go from one place to another inside the computer, assuming the signal X+ could actually attain the full speed of light. Pretty tight! X+ X+ @node Types Answer 11, Algebra Answer 1, Types Answer 10, Answers to Exercises X+ @subsection Types Tutorial Exercise 11 X+ X+ The speed limit is 55 miles per hour on most highways. We want to X+ find the ratio of Sam's speed to the US speed limit. X+ X+ @group X+ @example X+ 1: 55 mph 2: 55 mph 3: 11 hr mph / yd X+ . 1: 5 yd / hr . X+ . X+ X+ ' 55 mph RET ' 5 yd/hr RET / X+ @end example X+ @end group X+ X+ The @kbd{u s} command doesn't figure out how to simplify this, X+ but @kbd{u b} (convert to base units) does. Now we take the X+ logarithm base two to find the final answer, assuming that each X+ successive pill doubles his speed. X+ X+ @group X+ @example X+ 1: 19360. 2: 19360. 1: 14.24 X+ . 1: 2 . X+ . X+ X+ u b 2 B X+ @end example X+ @end group X+ X+ Thus Sam can take up to 14 pills without a worry. X+ X+ @node Algebra Answer 1, Algebra Answer 2, Types Answer 11, Answers to Exercises X+ @subsection Algebra Tutorial Exercise 1 X+ X+ The result @samp{sqrt(x)^2} is simplified back to @samp{x} by the X+ Calculator, but @samp{sqrt(x^2)} is not. (Consider what happens X+ if @samp{x = -3}.) If @samp{x} is real, this formula could be X+ simplified to @samp{abs(x)}, but for general complex arguments even X+ that is not safe. X+ X+ @node Algebra Answer 2, Algebra Answer 3, Algebra Answer 1, Answers to Exercises X+ @subsection Algebra Tutorial Exercise 2 X+ X+ Using @kbd{a S x RET} on the formula @samp{17 x^2 - 6 x^4 + 3 = 0} shows X+ that Calc isn't smart enough to solve this directly. But this is a X+ quadratic equation in @samp{x^2}, so let's rewrite it in terms of a X+ new variable @samp{y = x^2}. We can do this by replacing @samp{x} X+ with @samp{sqrt(y)}. X+ X+ @group X+ @example X+ 1: 17 x^2 - 6 x^4 + 3 = 0 1: 17 y - 6 y^2 + 3 = 0 X+ 2: sqrt(y) . X+ X+ ' sqrt(y) RET l x RET X+ @end example X+ @end group X+ X+ Now we can solve for the values of @samp{y} that satisfy the equation. X+ X+ @group X+ @example X+ 1: y = 1.41667 + 1.58333 s1 1: y = [-0.16667, 3.] X+ . . X+ X+ H a S y RET [ 1 RET 1 n ] l s1 RET X+ @end example X+ @end group X+ X+ We now rewrite in terms of @samp{x = sqrt(y)}. X+ X+ @group X+ @example X+ 2: y 2: y X+ 1: [-0.16667, 3.] 1: [(0., 0.408248), 1.73205] X+ . . X+ X+ v u V M Q X+ @end example X+ @end group X+ X+ These are two solutions to the original equation. We can find the X+ other two by noticing that @samp{x = -sqrt(y)} is another solution X+ to @samp{y = x^2}. X+ X+ @group X+ @example X+ 1: [(0., 0.408248), 1.73205, (0., -0.408248), -1.73205] X+ . X+ X+ RET n | X+ @end example X+ @end group X+ X+ @node Algebra Answer 3, Algebra Answer 4, Algebra Answer 2, Answers to Exercises X+ @subsection Algebra Tutorial Exercise 3 X+ X+ @group X+ @example X+ 1: x sin(pi x) 1: (sin(x pi) - x pi cos(x pi)) / pi^2 X+ . . X+ X+ ' x sin(pi x) RET a i x RET X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [y, 1] X+ 2: (sin(x pi) - x pi cos(x pi)) / pi^2 X+ . X+ X+ ' [y,1] RET TAB X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [(sin(y pi) - y pi cos(y pi)) / pi^2, (sin(pi) - pi cos(pi)) / pi^2] X+ . X+ X+ V M $ RET X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: (sin(y pi) - y pi cos(y pi)) / pi^2 - (sin(pi) - pi cos(pi)) / pi^2 X+ . X+ X+ V R - X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: (sin(3.14159 y) - 3.14159 y cos(3.14159 y)) / 9.8696 - 0.3183 X+ . X+ X+ = X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [0., -0.95493, 0.63662, -1.5915, 1.2732] X+ . X+ X+ v x 5 RET TAB V M $ RET X+ @end example X+ @end group X+ X+ @node Algebra Answer 4, Programming Answer 1, Algebra Answer 3, Answers to Exercises X+ @subsection Algebra Tutorial Exercise 4 X+ X+ The hard part is that @kbd{V R +} is no longer sufficient to add up all X+ the contributions from the slices, since the slices have varying X+ coefficients. So first we must come up with a vector of these X+ coefficients. Here's one way: X+ X+ @group X+ @example X+ 2: -1 2: 3 1: [4, 2, ..., 4] X+ 1: [1, 2, ..., 9] 1: [-1, 1, ..., -1] . X+ . . X+ X+ 1 n v x 9 RET V M ^ 3 TAB - X+ @end example X+ @end group X+ X+ @group X+ @example X+ 1: [4, 2, ..., 4, 1] 1: [1, 4, 2, ..., 4, 1] X+ . . X+ X+ 1 | 1 TAB | X+ @end example X+ @end group X+ X+ Now we compute the function values. Note that for this method we need X+ eleven values, including both endpoints of the desired interval. X+ X+ @group X+ @example X+ 2: [1, 4, 2, ..., 4, 1] X+ 1: [1, 1.1, 1.2, ... , 1.8, 1.9, 2.] X+ . X+ X+ 11 RET 1 RET .1 RET C-u v x X+ @end example X+ @end group X+ X+ @group X+ @example X+ 2: [1, 4, 2, ..., 4, 1] X+ 1: [0., 0.084941, 0.16993, ... ] X+ . X+ X+ ' sin(x) ln(x) RET m r p 5 RET V M $ RET X+ @end example X+ @end group X+ X+ Once again this calls for @kbd{V M * V R +}; a simple @kbd{*} does the X+ same thing. X+ X+ @group X+ @example X+ 1: 11.22 1: 1.112 1: 0.374 X+ . . . X+ X+ * .1 * 3 / X+ @end example X+ @end group X+ X+ Wow! That's even better than the result from the Taylor series method. X+ X+ @node Programming Answer 1, Programming Answer 2, Algebra Answer 4, Answers to Exercises X+ @subsection Programming Tutorial Exercise 1 X+ X+ Here's one way: @kbd{C-x ( M-TAB n M-TAB M-TAB C-x )}. X+ X+ Here's another: @kbd{C-x ( M-3 n M-2 n C-x )}. X+ X+ @node Programming Answer 2, Programming Answer 3, Programming Answer 1, Answers to Exercises X+ @subsection Programming Tutorial Exercise 2 X+ X+ Using the stack: @kbd{C-x ( RET S TAB / C-x )}. X+ X+ Using algebraic entry: @kbd{C-x ( ' sin($)/$ RET C-x )}. X+ X+ @node Programming Answer 3, Programming Answer 4, Programming Answer 2, Answers to Exercises X+ @subsection Programming Tutorial Exercise 3 X+ X+ Here's one way: @kbd{C-x ( RET V R + TAB v l / C-x )}. X+ X+ @node Programming Answer 4, Programming Answer 5, Programming Answer 3, Answers to Exercises X+ @subsection Programming Tutorial Exercise 4 X+ X+ @group X+ @example X+ 2: 1 1: 1.61803398502 2: 1.61803398502 X+ 1: 20 . 1: 1.61803398875 X+ . . X+ X+ 1 RET 20 Z < & 1 + Z > 5 Q 1 + 2 / X+ @end example X+ @end group X+ X+ This answer is quite accurate. X+ X+ @node Programming Answer 5, Programming Answer 6, Programming Answer 4, Answers to Exercises X+ @subsection Programming Tutorial Exercise 5 X+ X+ Here is the matrix: X+ X+ @example X+ [ [ 0, 1 ], * [a, b] = [b, a + b] X+ [ 1, 1 ] ] X+ @end example X+ X+ Thus @samp{[0, 1; 1, 1]^n * [1, 1]} computes Fibonacci numbers @samp{n+1} X+ and @samp{n+2}. Here's one program that does the job: X+ X+ @example X+ C-x ( ' [0, 1; 1, 1] ^ ($-1) * [1, 1] RET v u DEL C-x ) X+ @end example X+ X+ @node Programming Answer 6, Programming Answer 7, Programming Answer 5, Answers to Exercises X+ @subsection Programming Tutorial Exercise 6 X+ X+ The trick here is to compute the harmonic numbers differently, so that X+ the loop counter itself accumulates the sum of reciprocals. We use X+ a separate variable to hold the integer counter. X+ X+ @group X+ @example X+ 1: 1 2: 1 1: . X+ . 1: 4 X+ . X+ X+ 1 s 1 DEL 1 RET 4 Z ( s 2 DEL r 1 1 + s 1 & Z ) X+ @end example X+ @end group X+ X+ The body of the loop goes as follows: First save the harmonic sum X+ so far in variable 2. Then delete it from the stack; the for loop X+ itself will take care of remembering it for us. Next, recall the X+ count from variable 1, add one to it, and feed its reciprocal to X+ the for loop to use as the step value. The for loop will increase X+ the ``loop counter'' by that amount and keep going until the X+ loop counter exceeds 4. X+ X+ @group X+ @example X+ 2: 31 3: 31 X+ 1: 3.99498713092 2: 3.99498713092 X+ . 1: 4.02724519544 X+ . X+ X+ r 1 r 2 RET 31 & + X+ @end example X+ @end group X+ X+ Thus we find that the 30th harmonic number is 3.99, and the 31st X+ harmonic number is 4.02. X+ X+ @node Programming Answer 7, Programming Answer 8, Programming Answer 6, Answers to Exercises X+ @subsection Programming Tutorial Exercise 7 X+ X+ The first step is to compute the derivative @samp{f'(x)} and thus X+ the formula @samp{x - f(x)/f'(x)}. X+ X+ (Because this definition is long, it will be repeated in concise form X+ below. You can use @code{read-kbd-macro} to load it from there. X+ While you are entering a @samp{Z ` Z '} body in a macro, Calc simply X+ collects keystrokes without executing them. In the following diagrams X+ we'll pretend Calc actually executed the keystrokes as you typed them, X+ just for purposes of illustration.) X+ X+ @group X+ @example X+ 2: sin(cos(x)) - 0.5 3: 4.5 X+ 1: 4.5 2: sin(cos(x)) - 0.5 X+ . 1: -(sin(x) cos(cos(x))) X+ . X+ X+ ' sin(cos(x))-0.5 RET 4.5 m r C-x ( Z ` TAB RET a d x RET X+ @end example X+ @end group X+ X+ @group X+ @example X+ 2: 4.5 X+ 1: x + (sin(cos(x)) - 0.5) / sin(x) cos(cos(x)) X+ . X+ X+ / ' x RET TAB - s 1 X+ @end example X+ @end group X+ X+ Now, we enter the loop. We'll use a repeat loop with a 20 repetition X+ limit just in case the method fails to converge for some reason. X+ (Normally, the @kbd{Z /} command will stop the loop before all 20 X+ repetitions are done.) X+ X+ @group X+ @example X+ 1: 4.5 3: 4.5 2: 4.5 X+ . 2: x + (sin(cos(x)) ... 1: 5.24196456928 X+ 1: 4.5 . X+ . X+ X+ DEL 20 Z < RET r 1 TAB l x RET X+ @end example X+ @end group X+ X+ This is the new guess for @samp{x}. Now we compare it with the X+ old one to see if we've converged. X+ X+ @group X+ @example X+ 3: 5.24196 2: 5.24196 1: 5.24196 1: 5.26345856348 X+ 2: 5.24196 1: 0 . . X+ 1: 4.5 . X+ . X+ X+ RET M-TAB a = Z / Z > Z ' C-x ) X+ @end example X+ @end group X+ X+ The loop converges in just a few steps to this value. To check X+ the result, we can simply substitute it back into the equation. X+ X+ @group X+ @example X+ 3: 5.26345856348 2: 5.26345856348 X+ 2: 5.26345856348 1: 0.499999999997 X+ 1: sin(cos(x)) . X+ . X+ X+ RET ' sin(cos(x)) RET TAB l x RET X+ @end example X+ @end group X+ X+ Let's test the new definition again: X+ X+ @group X+ @example X+ 2: x^2 - 9 1: 3. X+ 1: 1 . X+ . X+ X+ ' x^2-9 RET 1 K X+ @end example X+ @end group X+ X+ Once again, here's the full Newton's Method definition: X+ X+ @group X+ @example X+ C-x ( Z ` TAB RET a d x RET / ' x RET TAB - s 1 DEL X+ 20 Z < RET r 1 TAB l x RET X+ RET M-TAB a = Z / X+ Z > X+ Z ' X+ C-x ) X+ @end example X+ @end group X+ X+ @node Programming Answer 8, Programming Answer 9, Programming Answer 7, Answers to Exercises X+ @subsection Programming Tutorial Exercise 8 X+ X+ The first step is to adjust @samp{z} to be greater than 5. A simple X+ ``for'' loop will do the job here. If @samp{z} is less than 5, we X+ reduce the problem using @samp{psi(z) = psi(z+1) - 1/z}. We go X+ on to compute @samp{psi(z+1)}, and remember to add back a factor of X+ @samp{-1/z} when we're done. This step is repeated until @samp{z > 5}. X+ X+ (Because this definition is long, it will be repeated in concise form X+ below. You can use @code{read-kbd-macro} to load it from there. X+ While you are entering a @samp{Z ` Z '} body in a macro, Calc simply X+ collects keystrokes without executing them. In the following diagrams X+ we'll pretend Calc actually executed the keystrokes as you typed them, X+ just for purposes of illustration.) X+ X+ @group X+ @example X+ 1: 1. 1: 1. X+ . . X+ X+ 1.0 RET C-x ( Z ` s 1 0 s 2 DEL X+ @end example X+ @end group X+ X+ Here, variable 1 holds @code{z} and variable 2 holds the adjustment X+ factor. If @samp{z < 5}, we use a loop to increase it. X+ X+ @group X+ @example X+ 3: 1. 2: 1. 1: 6. X+ 2: 1. 1: 1 . X+ 1: 5 . X+ . X+ X+ RET 5 a < Z [ 5 Z ( & s + 2 DEL 1 s + 1 Z ) r 1 Z ] X+ @end example X+ @end group X+ X+ Now we compute the initial part of the sum: @samp{ln(z) - 1/2z} X+ minus the adjustment factor. X+ X+ @group X+ @example X+ 2: 1.79175946923 2: 1.7084261359 1: -0.57490719743 X+ 1: 0.0833333333333 1: 2.28333333333 . X+ . . X+ X+ L r 1 2 * & - r 2 - X+ @end example X+ @end group X+ X+ Now we evaluate the series. We'll use another ``for'' loop counting X+ up the value of @samp{2 n}. X+ X+ @group X+ @example X+ 3: -0.5749 3: -0.5749 4: -0.5749 2: -0.5749 SHAR_EOF echo "End of part 14, continue with part 15" echo "15" > s2_seq_.tmp exit 0