(* Content-type: application/mathematica *)
(*** Wolfram Notebook File ***)
(* http://www.wolfram.com/nb *)
(* CreatedBy='Mathematica 7.0' *)
(*CacheID: 234*)
(* Internal cache information:
NotebookFileLineBreakTest
NotebookFileLineBreakTest
NotebookDataPosition[ 145, 7]
NotebookDataLength[ 78539, 2938]
NotebookOptionsPosition[ 67234, 2589]
NotebookOutlinePosition[ 69095, 2637]
CellTagsIndexPosition[ 68978, 2631]
WindowFrame->Normal*)
(* Beginning of Notebook Content *)
Notebook[{
Cell["\<\
An Overview of Computation at the Symbolic\[Hyphen]Numeric Boundary\
\>", "Title",
PageBreakAbove->False],
Cell["Daniel Lichtblau", "Author"],
Cell["\<\
Wolfram Research, Inc.
100 Trade Centre Dr.
Champaign IL 61820
danl@wolfram.com
\
\>", "Address",
CellChangeTimes->{3.463423758876299*^9}],
Cell["\<\
In the general world of scientific computation one frequently encounters \
\"numeric computation\" and \"symbolic computation\" as separate if loosely \
related entities. Sometimes one even hears about both used within one \
program. What is less often noted is that the two types of computation have \
begun to cross\[Hyphen]pollinate in the past 15 years or so, with each \
invading the other's historic turf. In this talk I will present a few \
examples of such interaction. My goal is to demonstrate that what is now \
called \"hybrid symbolic/numeric computation\" is a fruitful and active area \
of research and development in the current field of scientific computation.\
\>", "Abstract"],
Cell["\<\
A brief and mostly incorrect history of symbolic computation (including an \
irrelevant forecast of dubious validity pertaining to future trends)\
\>", "SectionFirst",
PageBreakAbove->True],
Cell["\<\
~35 years ago:
Scientific computation mostly sophisticated number crunching (generally \
performed between mastodon hunts).
Algorithms entirely numeric.
Symbolic computation began to make its entry into the scientific world. \
Algorithmic development also heavily mathematical but very different from \
numerical stuff.\
\>", "Text"],
Cell[TextData[{
"~20 years ago:\nEmerging emphasis on having numeric capabilities within the \
symbolic programs.\nLocal history: ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" appears in 1988. Regarded as a powerful blend of symbolic, numeric, and \
graphical capabilities. Reason: these parts get along as an integrated system."
}], "Text"],
Cell["\<\
Today:
One requires much more in a general purpose technical program.
(i) editable user interface
(ii) ability to communicate with other programs
(iii) ability to import and export various flavors of data
(iv) ability to interact with the web
We will ignore all this.\
\>", "Text"],
Cell["\<\
What we discuss began as a small trend in both the symbolic and numeric \
computation communities (which by and large did not overlap) to \"reduce\" \
problems in one domain to computations in the other. Gradually it became \
clear that both fields grew stronger when each made use of the other's \
functionality. In the following I will give some examples of specific ways in \
which this is done.\
\>", "Text"],
Cell[CellGroupData[{
Cell["What is meant by \"symbolic\" computation", "Section"],
Cell["\<\
Numeric computation is what happens when you have a bunch of machine numbers \
and you tell your friend's computer \"Do something useful with them, and \
hurry up because my homework is due an hour ago\".\
\>", "Text"],
Cell["\<\
Symbolic computation: Start with rational arithmetic (a major component is \
\"exact\" computation). What makes rational arithmetic different from \
floating point?
Must parse into a numerator and denominator.
Then must find and remove the greatest common divisor.\
\>", "Text"],
Cell[TextData[{
"Symbolic computation is far more general than simple manipulation of exact \
numbers such as ",
Cell[BoxData[
FractionBox["7", "3"]]],
". Must work with polynomials and all manner of other functions. Requires an \
ability to \n(i) do arithmetic with such things\n(ii) put them into a \
\"canonical\" form\n(iii) use them in a calculus framework\n(iv) do linear \
algebra with such expressions\netc."
}], "Text"],
Cell["\<\
For purposes of this talk \"symbolic methods\" may indicate any programming \
that is mathematical in nature but not strictly a matter of number crunching \
computation.\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["An aside into what we do at Wolfram Research, Incorporated", "Section"],
Cell[TextData[{
"There are many departments at Wolfram Research. As with any software house \
we have Sales, Marketing, Customer Service, Design, Shipping/Receiving, \
Administrative, Human Resources, Finance, and Library departments. Then there \
are the groups that handle various technical aspects of ",
StyleBox["Mathematica",
FontSlant->"Italic"],
". Here is a quick run\.03down on them."
}], "Text"],
Cell["(1) Software Quality Assurance. Design and perform testing.", "Text"],
Cell[TextData[{
"(2) Documentation and Publications. Technical writing editing, and \
translating. Also do The ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" Journal and The ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" Book."
}], "Text"],
Cell[TextData[{
"(3) Release Engineering. Building ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" and installers on various machines and operating systems."
}], "Text"],
Cell["(4) Technical Support. Handle questions from users.", "Text"],
Cell["\<\
(5) Applications. Commercial add\[Hyphen]ons such as \"Control Systems \
Professional\".\
\>", "Text"],
Cell["\<\
(6) Project Management. Keep tabs on timetables for various projects. \
Requires a blend of the skills from each of the above groups. Also: sense of \
humor; Black Belt in some martial arts discipline is strongly advised.\
\>", "Text"],
Cell[TextData[{
"(7) ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" Programming. Technical programming for standard (noncommercial) add\
\[Hyphen]on packages and related work."
}], "Text"],
Cell["\<\
(8) Information Technology. Umbrella for three subgroups.
(i) Systems Administration
(ii) Web Programming
(iii) Management Information Systems\
\>", "Text"],
Cell[TextData[{
"(9) Front\[Hyphen]end. Design, code, and port ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" user interface. Includes the type\[Hyphen]setting code responsible for \
this particular document."
}], "Text"],
Cell[TextData[{
"(10) Kernel Development. My group. We debug and extend ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" core functionality. Includes the programming language, pattern matching, \
mathematical functionality, and more."
}], "Text"],
Cell[TextData[{
"What are the credentials needed to work in these various groups? No hard \
rules but here are some basic facts.\nSeveral groups have people with \
doctoral degrees (Applications group exclusively so). Kernel Development \
mostly at that level, in particular math and applied math.\n\
Front\[Hyphen]end, Documentation and Publications, Release Engineering, and \
Software Quality Assurance groups have a mix of educational backgrounds and \
degrees.\nThe ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" Programming group mostly master's degrees in various fields.\nNo idea \
about folks in Project Management have, frankly too frightened to ask.\n\
Information Technology folks are even scarier because they know how to mess \
with our machines."
}], "Text"],
Cell["\<\
More about my department. We require a lot of mathematicians. If you don't \
want to go to graduate school for several years, pick another department.
Brings to mind a story told by a retiring executive at a Massachusetts \
software house where I worked many years ago. A prospective applicant (who \
did not get a job offer) had asked \"Would you really hire someone with a \
math Ph.D?\" and he replied \"Yes, they are almost as smart as CS Bachelors \
and we don't have to pay them as much.\"\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Domains of computation", "Section",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell["Machine floating point arithmetic", "Subsection"],
Cell["\<\
Computations using double precision arithmetic and system libraries of \
compiled code\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"expr", "=",
RowBox[{"2.0", "+",
RowBox[{"Sin", "[", "33.", "]"}]}]}]], "Input"],
Cell[BoxData["2.999911860107267`"], "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["High precision approximate arithmetic", "Subsection"],
Cell["\<\
Again approximate arithmetic but implemented in software. Frequently utilized \
at higher than hardware precision.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"exprbig", " ", "=",
RowBox[{
RowBox[{"N", "[",
RowBox[{"2", ",", "50"}], "]"}], "+",
RowBox[{"Sin", "[",
RowBox[{"N", "[",
RowBox[{"33", ",", "100"}], "]"}], "]"}]}]}]], "Input"],
Cell[BoxData["2.\
99991186010726714572808437670782831435094461649184588392103189`50.1761"], \
"Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Precision", "[", "exprbig", "]"}]], "Input"],
Cell[BoxData["50"], "Output"]
}, Open ]],
Cell["\<\
Note adjusted precision of the result based on the lowest precision of the \
operands. Unlike machine arithmetic there is an active precision tracking \
mechanism. Not so with all implementations of extended\[Hyphen]precision but \
we regard it as an asset. Originally developed at WRI by Jerry Keiper, who \
died tragically in 1995.\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Exact arithmetic", "Subsection",
PageBreakAbove->True],
Cell["Represent quantities exactly.", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"exprexact", "=",
RowBox[{"2", "+",
RowBox[{"Sin", "[", "33", "]"}]}]}]], "Input"],
Cell[BoxData[
RowBox[{"2", "+",
RowBox[{"Sin", "[", "33", "]"}]}]], "Output"]
}, Open ]],
Cell["\<\
Well, what did you expect? But we can \"evaluate numerically\" and to \
whatever precision we desire.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"N", "[",
RowBox[{"exprexact", ",", "200"}], "]"}]], "Input"],
Cell[BoxData["2.\
999911860107267145728084376707828314350944616491845883921031894099242887277350\
857296168611326413495627237787213776554821949078843409118764396693395395844845\
409042092646491595240364937429485014534021654430374376902719`200"], "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Symbolic results", "Subsection"],
Cell["\<\
We now deal with expressions that contain nonnumeric entities.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"exprsymbolic", "=",
RowBox[{"2", "+",
RowBox[{"Sin", "[",
RowBox[{"33", "*", "x"}], "]"}]}]}]], "Input"],
Cell[BoxData[
RowBox[{"2", "+",
RowBox[{"Sin", "[",
RowBox[{"33", " ", "x"}], "]"}]}]], "Output"]
}, Open ]],
Cell["\<\
Again we can obtain numeric values if we give numeric values to the symbols.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Table", "[",
RowBox[{"exprsymbolic", ",",
RowBox[{"{",
RowBox[{"x", ",", "0.", ",", "3."}], "}"}]}], "]"}]], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
"2.`", ",", "2.999911860107267`", ",", "1.973448845976033`", ",",
"1.0007931658136462`"}], "}"}]], "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["But it's not really a hierarchy", "Subsection",
PageBreakAbove->True],
Cell["\<\
Often thought that \"exact\" results are somehow more desirable than \
approximate and symbolic are better than exact because they are more general. \
Historically analogous to food chain wherein mastodon eats bushes and the \
caveman eats mastodon. In fact this computational hierarchy developed when \
cave dwellers were eating mastodons.\
\>", "Text"],
Cell["\<\
We have come a long way in the intervening decades.
Consumption of mastodons has plummetted (due in no small part to scarcity).
Food web supplants the chain.
Modes of computation no longer live in separate worlds and they now borrow \
from one another.
The hierarchy of generality is not always appropriate: remember that on a bad \
day the caveman gets trampled.\
\>", "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["\<\
Hybrid methods: numeric computation invades the symbolic domain\
\>", "Section",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell["The ubiquitous multiplication of integers", "Subsection"],
Cell[TextData[{
"Our first example involves every day multiplication of integers. How do you \
multiply integers? Basically you multiply every digit by every other digit, \
keeping track of place value when you sum the results. Suppose you are a \
computer? You can do it the same way, but use base 2. So you form aAround ",
Cell[BoxData[
SuperscriptBox["n", "2"]]],
" products if your inputs each have around ",
Cell[BoxData["n"]],
" bits. Does ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" use an O(",
Cell[BoxData[
SuperscriptBox["n", "2"]]],
") method to multiply her integers? To test we'll need some honking big \
integers. We will start with a pair of random integers with around a million \
bits."
}], "Text"],
Cell[BoxData[{
RowBox[{
RowBox[{"m20", "=",
RowBox[{"RandomInteger", "[",
SuperscriptBox["2",
SuperscriptBox["2", "20"]], "]"}]}], ";"}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"n20", "=",
RowBox[{"RandomInteger", "[",
SuperscriptBox["2",
SuperscriptBox["2", "20"]], "]"}]}], ";"}]}], "Input"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Timing", "[",
RowBox[{
RowBox[{"prod", " ", "=", " ",
RowBox[{"m20", "*", "n20"}]}], ";"}], "]"}]], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"0.24`", " ", "Second"}], ",", "Null"}], "}"}]], "Output"]
}, Open ]],
Cell["\<\
Now we double the size to two million bits and see if it takes four times as \
long to get the product.\
\>", "Text"],
Cell[BoxData[{
RowBox[{
RowBox[{"m21", "=",
RowBox[{"RandomInteger", "[",
SuperscriptBox["2",
SuperscriptBox["2", "21"]], "]"}]}], ";"}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"n21", "=",
RowBox[{"RandomInteger", "[",
SuperscriptBox["2",
SuperscriptBox["2", "21"]], "]"}]}], ";"}]}], "Input"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Timing", "[",
RowBox[{
RowBox[{"prod", " ", "=", " ",
RowBox[{"m21", "*", "n21"}]}], ";"}], "]"}]], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"0.55`", " ", "Second"}], ",", "Null"}], "}"}]], "Output"]
}, Open ]],
Cell[TextData[{
"It took a bit more than twice as long. The secret is that ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" is using a fast Fourier transform (FFT) behind the scenes. This is done in \
floating point arithmetic, our first example of using a numerical method to \
do something that is exact."
}], "Text"],
Cell[TextData[{
"Actually what we just saw is a more subtle example of a hybrid exact\
\[Hyphen]numeric algorithm. I used a development kernel of ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" and in that version we have changed the way we do integer arithmetic. \
Instead of using the FFT there is something called the number theory \
transform (NTT). This uses exact integer arithmetic modulo a few primes. So \
we have an example where exact computation has appropriated a numerical \
algorithm into an exact setting."
}], "Text"],
Cell["\<\
Let's see how long it would take to print out these numbers by breaking \
digits into a list.\
\>", "Text",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Timing", "[",
RowBox[{
RowBox[{"digits", " ", "=", " ",
RowBox[{"IntegerDigits", "[", "m21", "]"}]}], ";"}], "]"}]], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"5.879999999999999`", " ", "Second"}], ",", "Null"}],
"}"}]], "Output"]
}, Open ]],
Cell[TextData[{
"It took significantly longer than to multiply a pair. The reason is that \
one must do a lot of division by large powers of ",
Cell[BoxData["10"]],
" in order to get the (decimal) digits. So we \n(i) form those powers \
(large multiplications)\n(ii) do divisions that are roughly two or three \
times as costly\n\nSince numbers are stored in a binary format, if the base \
of interest is a power of ",
Cell[BoxData["2"]],
" we can do a lot better."
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Timing", "[",
RowBox[{
RowBox[{"digits", " ", "=", " ",
RowBox[{"IntegerDigits", "[",
RowBox[{"m21", ",", " ", "16"}], "]"}]}], ";"}], "]"}]], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"0.010000000000001563`", " ", "Second"}], ",", "Null"}],
"}"}]], "Output"]
}, Open ]],
Cell["\<\
I will point out that division is converted to multiplication problems using \
Newton iterations. This tactic appears in arithmetic as a numeric method but \
a variation is used in polynomial division and that takes an exact approach. \
Now our development code will translate polynomial to integer arithmetic \
which uses the number theoretic transform method discussed above. So it is \
difficult to sort out exactly whether our upcoming polynomial algebra code is \
exact or numeric in spirit, and I think it now also qualifies as a hybrid.\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Integer lattice manipulation", "Subsection",
PageBreakAbove->True],
Cell[TextData[{
"One sometimes needs to work with integer lattices. One important problem is \
to find \"small\" vectors in a given lattice. In a sense this is tantamount \
to finding a nearly orthogonal generating set. Example: ",
Cell[BoxData[
RowBox[{"{",
RowBox[{"1", ",", "0", ",", "104"}], "}"}]]],
" and ",
Cell[BoxData[
RowBox[{"{",
RowBox[{"0", ",", "1", ",", "222"}], "}"}]]],
" are nearly parallel to the ",
Cell[BoxData["z"]],
" axis. We find a smaller pair with a much larger angle between them that \
span the same lattice of integer coordinates in ",
Cell[BoxData[
SuperscriptBox["\[DoubleStruckCapitalR]", "3"]]],
"."
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"LatticeReduce", "[",
RowBox[{"{",
RowBox[{
RowBox[{"{",
RowBox[{"1", ",", "0", ",", "104"}], "}"}], ",", " ",
RowBox[{"{",
RowBox[{"0", ",", "1", ",", "222"}], "}"}]}], "}"}], "]"}]], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"{",
RowBox[{
RowBox[{"-", "2"}], ",", "1", ",", "14"}], "}"}], ",",
RowBox[{"{",
RowBox[{"15", ",",
RowBox[{"-", "7"}], ",", "6"}], "}"}]}], "}"}]], "Output"]
}, Open ]],
Cell["\<\
Internal technology uses Gram\[Hyphen]Schmidt orthogonalization and more. The \
original algorithm worked primarily with rational arithmetic but it can be \
done (if carefully!) using approximate arithmetic. Hence we have numeric \
computation working for us behind the scenes in an exact computation.\
\>", "Text"],
Cell["\<\
This exact computation can be further blended with numeric approximation for \
the exact algebra application of factoring a polynomial.\
\>", "Text"],
Cell[BoxData[
RowBox[{
RowBox[{"poly", "=",
RowBox[{"42", "-",
RowBox[{"13", " ", "x"}], "-",
RowBox[{"20", " ",
SuperscriptBox["x", "2"]}], "+",
RowBox[{"9", " ",
SuperscriptBox["x", "3"]}], "+",
RowBox[{"13", " ",
SuperscriptBox["x", "4"]}], "+",
RowBox[{"2", " ",
SuperscriptBox["x", "5"]}], "-",
SuperscriptBox["x", "6"], "+",
RowBox[{"2", " ",
SuperscriptBox["x", "7"]}], "+",
SuperscriptBox["x", "8"]}]}], ";"}]], "Input"],
Cell["\<\
Start with a numeric root\[Hyphen]finder to approximate a particular root.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"rt", "=",
RowBox[{"x", "/.",
RowBox[{"FindRoot", "[",
RowBox[{
RowBox[{"poly", "\[Equal]", "0"}], ",",
RowBox[{"{",
RowBox[{"x", ",", "2"}], "}"}], ",",
RowBox[{"MaxIterations", "\[Rule]", "100"}], ",",
RowBox[{"WorkingPrecision", "\[Rule]", "40"}]}], "]"}]}]}]], "Input"],
Cell[BoxData[
RowBox[{"-",
"2.0867453398826663835823622043953787427080622114183818`40"}]], "Output"]
}, Open ]],
Cell["\<\
(i) take powers of this root
(ii) multiply them all by some large number
(iii) round off to get integers
(iv) try to find a small integer combination\
\>", "Text"],
Cell["\<\
This last step is known as finding an integer relation between real numbers. \
May be done using lattice reduction. \
\>", "Text"],
Cell["\<\
To record the integer relations we attach a column vector of these powers to \
an identity matrix. Idea is similar to \"place\[Hyphen]value\" arithmetic \
except that successive powers are in the approximate root; they correspond to \
powers in a polynomial variable. When done each column in the matrix prior to \
the last will record the coefficient of the corresponding power of that \
variable that is needed to make the last column approximately zero. Also \
similar to standard method for matrix inversion where we append an identity \
matrix that records row operations.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{
RowBox[{"powers", " ", "=",
RowBox[{"Round", "[",
RowBox[{
RowBox[{"10", "^", "40"}], "*",
RowBox[{"Table", "[",
RowBox[{
RowBox[{"rt", "^", "j"}], ",", " ",
RowBox[{"{",
RowBox[{"j", ",", "0", ",", "7"}], "}"}]}], "]"}]}], "]"}]}],
";"}], "\n",
RowBox[{"lattice", "=",
RowBox[{"Transpose", "[",
RowBox[{"Append", "[",
RowBox[{
RowBox[{"IdentityMatrix", "[", "8", "]"}], ",", "powers"}], "]"}],
"]"}]}], "\n",
RowBox[{"LatticeReduce", "[", "lattice", "]"}]}], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"{",
RowBox[{
"1", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0",
",", "10000000000000000000000000000000000000000"}], "}"}], ",",
RowBox[{"{",
RowBox[{
"0", ",", "1", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0",
",",
RowBox[{"-", "20867453398826663835823622043953787427081"}]}], "}"}], ",",
RowBox[{"{",
RowBox[{
"0", ",", "0", ",", "1", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0",
",", "43545061135220248454440608499700095794098"}], "}"}], ",",
RowBox[{"{",
RowBox[{
"0", ",", "0", ",", "0", ",", "1", ",", "0", ",", "0", ",", "0", ",", "0",
",",
RowBox[{"-", "90867453398826663835823622043953787427081"}]}], "}"}], ",",
RowBox[{"{",
RowBox[{
"0", ",", "0", ",", "0", ",", "0", ",", "1", ",", "0", ",", "0", ",", "0",
",", "189617234927006895305205962807376607783662"}], "}"}], ",",
RowBox[{"{",
RowBox[{
"0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "1", ",", "0", ",", "0",
",",
RowBox[{"-", "395682881345368403016907881541854457985763"}]}], "}"}],
",",
RowBox[{"{",
RowBox[{
"0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "1", ",", "0",
",", "825689408718793542155971317115053119773226"}], "}"}], ",",
RowBox[{"{",
RowBox[{
"0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "0", ",", "1",
",",
RowBox[{"-", "1723003525834416670153349621193490712471397"}]}], "}"}]}],
"}"}]], "Output"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"{",
RowBox[{"7", ",",
RowBox[{"-", "1"}], ",", "0", ",", "1", ",", "0", ",", "0", ",", "0",
",", "0", ",", "0"}], "}"}], ",",
RowBox[{"{",
RowBox[{"0", ",", "7", ",",
RowBox[{"-", "1"}], ",", "0", ",", "1", ",", "0", ",", "0", ",", "0",
",",
RowBox[{"-", "3"}]}], "}"}], ",",
RowBox[{"{",
RowBox[{"0", ",", "0", ",", "7", ",",
RowBox[{"-", "1"}], ",", "0", ",", "1", ",", "0", ",", "0", ",", "4"}],
"}"}], ",",
RowBox[{"{",
RowBox[{"0", ",", "0", ",", "0", ",", "7", ",",
RowBox[{"-", "1"}], ",", "0", ",", "1", ",", "0", ",",
RowBox[{"-", "3"}]}], "}"}], ",",
RowBox[{"{",
RowBox[{"0", ",", "0", ",", "0", ",", "0", ",", "7", ",",
RowBox[{"-", "1"}], ",", "0", ",", "1", ",", "0"}], "}"}], ",",
RowBox[{"{",
RowBox[{"3775678231", ",",
RowBox[{"-", "580501866972"}], ",", "1066579054143", ",",
RowBox[{"-", "606931614580"}], ",",
RowBox[{"-", "119441513761"}], ",",
RowBox[{"-", "1073606811312"}], ",",
RowBox[{"-", "1120453848415"}], ",",
RowBox[{"-", "237516214993"}], ",",
RowBox[{"-", "1749844545569"}]}], "}"}], ",",
RowBox[{"{",
RowBox[{"75133458513", ",",
RowBox[{"-", "210035938933"}], ",", "71000322194", ",",
RowBox[{"-", "735970148531"}], ",",
RowBox[{"-", "78595481320"}], ",", "926824097508", ",", "3453348182341",
",", "1476992466742", ",",
RowBox[{"-", "539949125356"}]}], "}"}], ",",
RowBox[{"{",
RowBox[{
RowBox[{"-", "94796544126"}], ",",
RowBox[{"-", "1250665041382"}], ",", "295437637752", ",",
RowBox[{"-", "587089232479"}], ",", "1430521362673", ",",
"7504276056257", ",",
RowBox[{"-", "2079425574756"}], ",",
RowBox[{"-", "2509373482425"}], ",",
RowBox[{"-", "2539857188259"}]}], "}"}]}], "}"}]], "Output"]
}, Open ]],
Cell[TextData[{
"First vector is ",
Cell[BoxData[
RowBox[{"{",
RowBox[{"7", ",",
RowBox[{"-", "1"}], ",", "0", ",", "1", ",", "0", ",", "0", ",", "0", ",",
"0", ",", "0"}], "}"}]]],
", corresponds to polynomial ",
Cell[BoxData[
RowBox[{
SuperscriptBox["x", "3"], "-", "x", "+", "7"}]]],
". Is it really a factor?"
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Factor", "[", "poly", "]"}]], "Input"],
Cell[BoxData[
RowBox[{
RowBox[{"(",
RowBox[{"7", "-", "x", "+",
SuperscriptBox["x", "3"]}], ")"}], " ",
RowBox[{"(",
RowBox[{"6", "-", "x", "-",
RowBox[{"3", " ",
SuperscriptBox["x", "2"]}], "+",
RowBox[{"2", " ",
SuperscriptBox["x", "4"]}], "+",
SuperscriptBox["x", "5"]}], ")"}]}]], "Output"]
}, Open ]],
Cell["\<\
We used a blend of exact and approximate technologies to attack the symbolic \
algebra problem of factoring a polynomial. Method appeared in the early \
1980's.\
\>", "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Symbolic computation stakes claims on numeric turf", "Section",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell["Solving polynomial systems of equations", "Subsection"],
Cell[TextData[{
"Important for computational mathematics: find simultaneous solutions to a \
system of polynomial equations. Method used by ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" and many other programs involves something known as Gr\[ODoubleDot]bner \
bases. What are those? I'm not telling, as that would be a talk all by \
itself. Suffice it to say that they generalize the Gaussian elimination \
method for solving systems of linear equations."
}], "Text"],
Cell["\<\
This algorithmic technique of polynomial manipulation was first developed in \
the 1960's by Bruno Buchberger (he named the resulting polynomial set for W. \
Gr\[ODoubleDot]bner, his thesis advisor).Buchberger was attacking, \
algorithmically, something called the \"ideal membership\" problem. Later \
(~1978) was it seen how they might be used to solve polynomial systems.\
\>", "Text"],
Cell["\<\
Drawback: it seems to require exact arithmetic. This is trouble as often \
intermediate coefficients grow to enormous size (general phenomenon called \
\"intermediate expression swell\"). Around late 1980's a new method appears. \
Uses Gr\[ODoubleDot]bner bases but ones that are easier to compute. Reduces \
system solving to an eigenspace problem which is tackled with numeric \
software. So we had then a hybrid algorithm with a symbolic computation in \
the first step. Still not a good situation: even with easier \
Gr\[ODoubleDot]bner basis step one often sees problems for which it was not \
feasible.\
\>", "Text"],
Cell["\<\
More hybridization follows. By the mid\[Hyphen]1990's experimentation was \
under way to compute Gr\[ODoubleDot]bner bases using approximate arithmetic \
(I had working code to do that by late 1993, so in this one instance at least \
I was ahead of the field). Worked because it made good use of approximate \
arithmetic at moderate precision, typically one or two hundred digits. At \
this point we had another sort of hybrid in that an algorithm that had \
required exact arithmetic was now working with approximate arithmetic. Still \
not perfect insofar as even approximate Gr\[ODoubleDot]bner bases may be \
expensive to compute but this performs quite well in practice.\
\>", "Text"],
Cell["\<\
Today there are several approaches to solving systems of polynomial \
equations. Some fare even better than the one described above on particularly \
large or otherwise hard problems. But all share the attribute that they use a \
hybrid of exact and numeric methods.\
\>", "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["A brief look at other examples", "Section",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell["Algebra", "Subsection"],
Cell[CellGroupData[{
Cell["Matrix factorization and linear equations", "Subsubsection"],
Cell["\<\
A frequent need in numeric computation is to solve a aytem of linear \
equations. Primarily into two classes of methods.
(i) direct based of Gaussian elimination
(ii) iterative methods based on subspace projections.
Both developed primarily to do inexact numeric computation.\
\>", "Text"],
Cell["\<\
Direct methods also used heavily in symbolic algebra. One application under \
active research is in solving linear Diophantine systems. Given linear \
equations with integer coefficients, find solution vectors with integer \
components (row reduction will give solutions with rational values). Recent \
approach: first solve over rationals. Suffers from growth which makes the \
arithmetic quite slow (computes gcds!). Alternative:
(i) find solutions in prime fields
(ii) somehow \"lift\" to rational solutions
(iii) use these to generate integer solutions
The steps of solving in a prime field and of lifting can be done using \
something called the LU factorization of a matrix. It is an example where \
exact computation in linear algebra has borrowed from a numeric approach.\
\>", "Text"],
Cell[TextData[{
"Iterative methods have been adapted to perform Gaussian elimination of a \
large but sparse matrix of elements that lie in the field of integers modulo ",
Cell[BoxData["2"]],
". Application is integer factorization. This is another example where a \
linear algebra method developed for numeric computation has been deployed in \
an exact setting."
}], "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Polynomial interpolation", "Subsubsection"],
Cell[TextData[{
"Polynomial interpolation often done by working with Vandermonde matrices. \
Originally for numeric purposes. But applications are not entirely numerical. \
~25 years ago: significant body of symbolic algebra developed around \
interpolation of \"sparse\" multivariate polynomials. Principal technology \
used in ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" and elsewhere to do polynomial gcd extraction. This is among the most \
important of polynomial operations."
}], "Text"],
Cell["\<\
Related example: solving symbolic linear systems when the matrix is comprised \
of polynomials in one variable. A useful approach is to interpolate the \
result using exact solutions for various specializations of that variable.\
\>", "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Geometry and combinatorial math", "Subsection",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell["Exact linear programming", "Subsubsection"],
Cell["\<\
To solve a linear programming problem exactly one can use basic algorithms
Too slow when using rational arithmetic. Faster tactic: first use machine \
arithmetic to find an approximate solution. Use this to find the exact \
rational solution.\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Discrete optimization", "Subsubsection"],
Cell["\<\
Genetic methods used in discrete optimization for more than two decades. \
Drawback to application in the continuous realm: difficulty of sensibly \
encoding continuous values as \"genes\". Method of Differential Evolution due \
to Price and Storn ~1995 addressed this so now a method from the discrete \
realm comes to continuous problems.\
\>", "Text"],
Cell["\<\
But the story continues. Around 1999 we started playing with Differential \
Evolution applied to discrete optimization problems.This method hybridized \
from the discrete world (where arithmetic is exact) to handle continuous \
problems (where arithmetic is approximate) has now returned to discrete \
problems.\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Reconstruction of geometric objects", "Subsubsection"],
Cell["\<\
Problem from computational geometry: reconstruct an object containing a given \
set of points. Example: find cylinders that contain a given set of five or \
more points in space. Uses hybrid methods of solving numeric systems, numeric \
root\[Hyphen]finding, and exact methods for forming a parametric or implicit \
representation of the object in question. Numeric methods alone are simply \
not adequate for these tasks.\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Other computational geometry", "Subsubsection"],
Cell["\<\
Frequent need in computational geometry: determine sign of an inequality. \
Arises in finding whether a point lies inside a given circle, in front of or \
behind a given plane, etc. Degenerate case: something evaluates to zero, that \
is, it seems to lie right on the circle or plane. In some applications \
(Delaunay triangulation, convex hull) such degeneracy, when not recognized, \
is very bad. High precision, exact or even symbolic methods may be employed \
to recognize and/or work around it.\
\>", "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Calculus", "Subsection",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell["Numeric optimization", "Subsubsection"],
Cell["\<\
Common task: find an extreme value of a multivariate function near a given \
starting vector. Common methods such as Newton's or steepest descent use \
gradients and maybe Hessians. These can be approximated numerically. But \
often will do better using analytical forms which need symbolic computation. \
More extreme example is to work with a function defined by a program and \
produce new procedural code to evaluate gradients or Hessians. Called \
\"automatic differentiation\".\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Singularity analysis in numeric integration", "Subsubsection"],
Cell["\<\
Trauma for numeric integration (quadrature) methods: handling of integrable \
singularities. Adaptive methods often go crazy near such points. Symbolic \
analysis of a singularity can save a lot of time and trouble.\
\>", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["\<\
Miscellaneous other uses of symbolic methods in numeric calculus\
\>", "Subsubsection"],
Cell["\<\
Numeric ODE solvers may use symbolic algebraic solvers to obtain a canonical \
form prior to use of purely numeric methods.\
\>", "Text"],
Cell["\<\
Numeric PDE solvers sometimes use hybrid symbolic/numeric technique for \
spatial discretization.\
\>", "Text"],
Cell["\<\
Numeric DAE solvers may use a symbolic computation method to do something \
known as index reduction.\
\>", "Text"]
}, Open ]]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Revisiting the computational \"hierarchy\"", "Section",
PageBreakAbove->True],
Cell["\<\
We will now look at an example of exact computation that is not so useful as \
one might wish. We begin with a pair of equations and graph some points of \
intersection.\
\>", "Text"],
Cell[BoxData[
RowBox[{
RowBox[{"eqns", "=",
RowBox[{"{",
RowBox[{
RowBox[{
RowBox[{"4", " ",
SuperscriptBox["x", "4"]}], "-",
RowBox[{"x", " ",
SuperscriptBox["y", "5"]}], "+",
RowBox[{"3", " ",
SuperscriptBox["x", "3"], " ", "y"}], "-",
RowBox[{"9", " ",
SuperscriptBox["x", "2"], " ", "y"}], "+",
RowBox[{"4", " ",
SuperscriptBox["y", "2"]}], "+",
RowBox[{"2", " ", "y"}], "-", "5"}], ",",
RowBox[{
RowBox[{"-",
SuperscriptBox["y", "3"]}], "+",
RowBox[{"3", " ",
SuperscriptBox["x", "3"], " ",
SuperscriptBox["y", "2"]}], "-",
RowBox[{"2", " ",
SuperscriptBox["x", "2"], " ", "y"}], "-",
SuperscriptBox["x", "2"], "-",
RowBox[{"2", " ", "x", " ", "y"}], "+",
RowBox[{"4", " ", "x"}], "+",
RowBox[{"12", " ",
SuperscriptBox["y", "2"]}], "-",
RowBox[{"4", " ", "y"}], "+", "5"}]}], "}"}]}], ";"}]], "Input"],
Cell[BoxData[
StyleBox[
DynamicBox[FEPrivate`FrontEndResource[
"CompatibilityToolbarText", "IssueTag"],
ImageSizeCache->{107.44, {1., 7.}}],
FontFamily->"Times"]], "CompatibilityTextTop",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[TextData[{
"The value of ",
ButtonBox["PlotPoints",
BaseStyle->"Link",
ButtonData->"paclet:ref/PlotPoints"],
" given in this evaluation may cause delay in displaying the graphic. \
Reducing the value of the ",
ButtonBox["PlotPoints",
BaseStyle->"Link",
ButtonData->"paclet:ref/PlotPoints"],
" option may help. ",
"\n",
"Show is terminated by a semicolon. Graphics output will be suppressed if it \
is not removed."
}], "CompatibilityText",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[BoxData[
StyleBox[
DynamicBox[FEPrivate`FrontEndResource[
"CompatibilityToolbarText", "SuggestionTag"],
ImageSizeCache->{103.55, {1., 7.}}],
FontFamily->"Times"]], "CompatibilityInputTop",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[BoxData[{
RowBox[{
RowBox[{"plot1", "=",
RowBox[{"ContourPlot", "[",
RowBox[{
RowBox[{"eqns", "\[LeftDoubleBracket]", "1", "\[RightDoubleBracket]"}],
",",
RowBox[{"{",
RowBox[{"x", ",",
RowBox[{"-", "4"}], ",", "6"}], "}"}], ",",
RowBox[{"{",
RowBox[{"y", ",",
RowBox[{"-", "4"}], ",", "15"}], "}"}], ",",
RowBox[{"PlotPoints", "\[Rule]", "100"}], ",",
RowBox[{"AspectRatio", "\[Rule]", "1"}], ",",
RowBox[{"Contours", "\[Rule]",
RowBox[{"{", "0", "}"}]}], ",",
RowBox[{"ContourShading", "\[Rule]", "False"}], ",",
RowBox[{"ContourStyle", "\[Rule]",
RowBox[{"{",
RowBox[{"{",
RowBox[{
RowBox[{"Thickness", "[", "0.002`", "]"}], ",",
RowBox[{"Hue", "[", "0", "]"}]}], "}"}], "}"}]}], ",",
RowBox[{"DisplayFunction", "\[Rule]", "Identity"}]}], "]"}]}],
";"}], "\n",
RowBox[{
RowBox[{"plot2", "=",
RowBox[{"ContourPlot", "[",
RowBox[{
RowBox[{"eqns", "\[LeftDoubleBracket]", "2", "\[RightDoubleBracket]"}],
",",
RowBox[{"{",
RowBox[{"x", ",",
RowBox[{"-", "4"}], ",", "6"}], "}"}], ",",
RowBox[{"{",
RowBox[{"y", ",",
RowBox[{"-", "4"}], ",", "15"}], "}"}], ",",
RowBox[{"PlotPoints", "\[Rule]", "100"}], ",",
RowBox[{"AspectRatio", "\[Rule]", "1"}], ",",
RowBox[{"Contours", "\[Rule]",
RowBox[{"{", "0", "}"}]}], ",",
RowBox[{"ContourShading", "\[Rule]", "False"}], ",",
RowBox[{"ContourStyle", "\[Rule]",
RowBox[{"{",
RowBox[{"{",
RowBox[{
RowBox[{"Thickness", "[", "0.002`", "]"}], ",",
RowBox[{"RGBColor", "[",
RowBox[{"0", ",", "1", ",", "0"}], "]"}]}], "}"}], "}"}]}], ",",
RowBox[{"DisplayFunction", "\[Rule]", "Identity"}]}], "]"}]}],
";"}], "\n",
RowBox[{"Show", "[",
RowBox[{
RowBox[{"{",
RowBox[{"plot1", ",", "plot2"}], "}"}], ",",
RowBox[{"DisplayFunction", "\[Rule]", "$DisplayFunction"}]}],
"]"}]}], "CompatibilityInput",
CellTags->"compatibility-no"],
Cell[BoxData[
RowBox[{
ButtonBox[
DynamicBox[FEPrivate`FrontEndResource[
"CompatibilityToolbarText", "ReplaceSuggestion"],
ImageSizeCache->{220.87, {3., 9.}}],
ButtonData->{"", "Replace"}],
ButtonBox[
DynamicBox[FEPrivate`FrontEndResource[
"CompatibilityToolbarText", "DiscardSuggestion"],
ImageSizeCache->{186.238, {3., 9.}}],
ButtonData->{"", "Discard"}]}]], "CompatibilityControls", \
"CompatibilityControls",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{
RowBox[{"plot1", "=",
RowBox[{"ContourPlot", "[",
RowBox[{
RowBox[{"eqns", "[",
RowBox[{"[", "1", "]"}], "]"}], ",",
RowBox[{"{",
RowBox[{"x", ",",
RowBox[{"-", "4"}], ",", "6"}], "}"}], ",",
RowBox[{"{",
RowBox[{"y", ",",
RowBox[{"-", "4"}], ",", "15"}], "}"}], ",",
RowBox[{"PlotPoints", "\[Rule]", "100"}], ",",
RowBox[{"AspectRatio", "\[Rule]", "1"}], ",",
RowBox[{"Contours", "\[Rule]",
RowBox[{"{", "0", "}"}]}], ",",
RowBox[{"ContourShading", "\[Rule]", "False"}], ",",
RowBox[{"ContourStyle", "\[Rule]",
RowBox[{"{",
RowBox[{"{",
RowBox[{
RowBox[{"Thickness", "[", "0.002", "]"}], ",",
RowBox[{"Hue", "[", "0", "]"}]}], "}"}], "}"}]}], ",",
RowBox[{"DisplayFunction", "\[Rule]", "Identity"}]}], "]"}]}],
";"}], "\n",
RowBox[{
RowBox[{"plot2", "=",
RowBox[{"ContourPlot", "[",
RowBox[{
RowBox[{"eqns", "[",
RowBox[{"[", "2", "]"}], "]"}], ",",
RowBox[{"{",
RowBox[{"x", ",",
RowBox[{"-", "4"}], ",", "6"}], "}"}], ",",
RowBox[{"{",
RowBox[{"y", ",",
RowBox[{"-", "4"}], ",", "15"}], "}"}], ",",
RowBox[{"PlotPoints", "\[Rule]", "100"}], ",",
RowBox[{"AspectRatio", "\[Rule]", "1"}], ",",
RowBox[{"Contours", "\[Rule]",
RowBox[{"{", "0", "}"}]}], ",",
RowBox[{"ContourShading", "\[Rule]", "False"}], ",",
RowBox[{"ContourStyle", "\[Rule]",
RowBox[{"{",
RowBox[{"{",
RowBox[{
RowBox[{"Thickness", "[", "0.002", "]"}], ",",
RowBox[{"RGBColor", "[",
RowBox[{"0", ",", "1", ",", "0"}], "]"}]}], "}"}], "}"}]}], ",",
RowBox[{"DisplayFunction", "\[Rule]", "Identity"}]}], "]"}]}],
";"}], "\n",
RowBox[{
RowBox[{"Show", "[",
RowBox[{
RowBox[{"{",
RowBox[{"plot1", ",", "plot2"}], "}"}], ",",
RowBox[{"DisplayFunction", "\[Rule]", "$DisplayFunction"}]}], "]"}],
";"}]}], "Input",
CellTags->"compatibility-yes"],
Cell[GraphicsData["PostScript", "\<\
%!
%%Creator: Mathematica
%%AspectRatio: 1
MathPictureStart
/Mabs {
Mgmatrix idtransform
Mtmatrix dtransform
} bind def
/Mabsadd { Mabs
3 -1 roll add
3 1 roll add
exch } bind def
%% Graphics
%%IncludeResource: font Courier
%%IncludeFont: Courier
/Courier findfont 10 scalefont setfont
% Scaling calculations
0.404762 0.0952381 0.224311 0.0501253 [
[.02381 -0.0125 -6 -9 ]
[.02381 -0.0125 6 0 ]
[.21429 -0.0125 -6 -9 ]
[.21429 -0.0125 6 0 ]
[.40476 -0.0125 -3 -9 ]
[.40476 -0.0125 3 0 ]
[.59524 -0.0125 -3 -9 ]
[.59524 -0.0125 3 0 ]
[.78571 -0.0125 -3 -9 ]
[.78571 -0.0125 3 0 ]
[.97619 -0.0125 -3 -9 ]
[.97619 -0.0125 3 0 ]
[ 0 0 -0.125 0 ]
[-0.0125 .099 -24 -4.5 ]
[-0.0125 .099 0 4.5 ]
[-0.0125 .22431 -6 -4.5 ]
[-0.0125 .22431 0 4.5 ]
[-0.0125 .34962 -18 -4.5 ]
[-0.0125 .34962 0 4.5 ]
[-0.0125 .47494 -6 -4.5 ]
[-0.0125 .47494 0 4.5 ]
[-0.0125 .60025 -18 -4.5 ]
[-0.0125 .60025 0 4.5 ]
[-0.0125 .72556 -12 -4.5 ]
[-0.0125 .72556 0 4.5 ]
[-0.0125 .85088 -24 -4.5 ]
[-0.0125 .85088 0 4.5 ]
[-0.0125 .97619 -12 -4.5 ]
[-0.0125 .97619 0 4.5 ]
[ 0 0 -0.125 0 ]
[ 0 1 .125 0 ]
[ 1 0 .125 0 ]
[ 0 0 0 0 ]
[ 1 1 0 0 ]
] MathScale
% Start of Graphics
1 setlinecap
1 setlinejoin
newpath
0 g
.25 Mabswid
[ ] 0 setdash
.02381 0 m
.02381 .00625 L
s
[(-4)] .02381 -0.0125 0 1 Mshowa
.21429 0 m
.21429 .00625 L
s
[(-2)] .21429 -0.0125 0 1 Mshowa
.40476 0 m
.40476 .00625 L
s
[(0)] .40476 -0.0125 0 1 Mshowa
.59524 0 m
.59524 .00625 L
s
[(2)] .59524 -0.0125 0 1 Mshowa
.78571 0 m
.78571 .00625 L
s
[(4)] .78571 -0.0125 0 1 Mshowa
.97619 0 m
.97619 .00625 L
s
[(6)] .97619 -0.0125 0 1 Mshowa
.125 Mabswid
.07143 0 m
.07143 .00375 L
s
.11905 0 m
.11905 .00375 L
s
.16667 0 m
.16667 .00375 L
s
.2619 0 m
.2619 .00375 L
s
.30952 0 m
.30952 .00375 L
s
.35714 0 m
.35714 .00375 L
s
.45238 0 m
.45238 .00375 L
s
.5 0 m
.5 .00375 L
s
.54762 0 m
.54762 .00375 L
s
.64286 0 m
.64286 .00375 L
s
.69048 0 m
.69048 .00375 L
s
.7381 0 m
.7381 .00375 L
s
.83333 0 m
.83333 .00375 L
s
.88095 0 m
.88095 .00375 L
s
.92857 0 m
.92857 .00375 L
s
.25 Mabswid
0 0 m
1 0 L
s
0 .099 m
.00625 .099 L
s
[(-2.5)] -0.0125 .099 1 0 Mshowa
0 .22431 m
.00625 .22431 L
s
[(0)] -0.0125 .22431 1 0 Mshowa
0 .34962 m
.00625 .34962 L
s
[(2.5)] -0.0125 .34962 1 0 Mshowa
0 .47494 m
.00625 .47494 L
s
[(5)] -0.0125 .47494 1 0 Mshowa
0 .60025 m
.00625 .60025 L
s
[(7.5)] -0.0125 .60025 1 0 Mshowa
0 .72556 m
.00625 .72556 L
s
[(10)] -0.0125 .72556 1 0 Mshowa
0 .85088 m
.00625 .85088 L
s
[(12.5)] -0.0125 .85088 1 0 Mshowa
0 .97619 m
.00625 .97619 L
s
[(15)] -0.0125 .97619 1 0 Mshowa
.125 Mabswid
0 .12406 m
.00375 .12406 L
s
0 .14912 m
.00375 .14912 L
s
0 .17419 m
.00375 .17419 L
s
0 .19925 m
.00375 .19925 L
s
0 .24937 m
.00375 .24937 L
s
0 .27444 m
.00375 .27444 L
s
0 .2995 m
.00375 .2995 L
s
0 .32456 m
.00375 .32456 L
s
0 .37469 m
.00375 .37469 L
s
0 .39975 m
.00375 .39975 L
s
0 .42481 m
.00375 .42481 L
s
0 .44987 m
.00375 .44987 L
s
0 .5 m
.00375 .5 L
s
0 .52506 m
.00375 .52506 L
s
0 .55013 m
.00375 .55013 L
s
0 .57519 m
.00375 .57519 L
s
0 .62531 m
.00375 .62531 L
s
0 .65038 m
.00375 .65038 L
s
0 .67544 m
.00375 .67544 L
s
0 .7005 m
.00375 .7005 L
s
0 .75063 m
.00375 .75063 L
s
0 .77569 m
.00375 .77569 L
s
0 .80075 m
.00375 .80075 L
s
0 .82581 m
.00375 .82581 L
s
0 .87594 m
.00375 .87594 L
s
0 .901 m
.00375 .901 L
s
0 .92607 m
.00375 .92607 L
s
0 .95113 m
.00375 .95113 L
s
0 .07393 m
.00375 .07393 L
s
0 .04887 m
.00375 .04887 L
s
0 .02381 m
.00375 .02381 L
s
.25 Mabswid
0 0 m
0 1 L
s
.02381 .99375 m
.02381 1 L
s
.21429 .99375 m
.21429 1 L
s
.40476 .99375 m
.40476 1 L
s
.59524 .99375 m
.59524 1 L
s
.78571 .99375 m
.78571 1 L
s
.97619 .99375 m
.97619 1 L
s
.125 Mabswid
.07143 .99625 m
.07143 1 L
s
.11905 .99625 m
.11905 1 L
s
.16667 .99625 m
.16667 1 L
s
.2619 .99625 m
.2619 1 L
s
.30952 .99625 m
.30952 1 L
s
.35714 .99625 m
.35714 1 L
s
.45238 .99625 m
.45238 1 L
s
.5 .99625 m
.5 1 L
s
.54762 .99625 m
.54762 1 L
s
.64286 .99625 m
.64286 1 L
s
.69048 .99625 m
.69048 1 L
s
.7381 .99625 m
.7381 1 L
s
.83333 .99625 m
.83333 1 L
s
.88095 .99625 m
.88095 1 L
s
.92857 .99625 m
.92857 1 L
s
.25 Mabswid
0 1 m
1 1 L
s
.99375 .099 m
1 .099 L
s
.99375 .22431 m
1 .22431 L
s
.99375 .34962 m
1 .34962 L
s
.99375 .47494 m
1 .47494 L
s
.99375 .60025 m
1 .60025 L
s
.99375 .72556 m
1 .72556 L
s
.99375 .85088 m
1 .85088 L
s
.99375 .97619 m
1 .97619 L
s
.125 Mabswid
.99625 .12406 m
1 .12406 L
s
.99625 .14912 m
1 .14912 L
s
.99625 .17419 m
1 .17419 L
s
.99625 .19925 m
1 .19925 L
s
.99625 .24937 m
1 .24937 L
s
.99625 .27444 m
1 .27444 L
s
.99625 .2995 m
1 .2995 L
s
.99625 .32456 m
1 .32456 L
s
.99625 .37469 m
1 .37469 L
s
.99625 .39975 m
1 .39975 L
s
.99625 .42481 m
1 .42481 L
s
.99625 .44987 m
1 .44987 L
s
.99625 .5 m
1 .5 L
s
.99625 .52506 m
1 .52506 L
s
.99625 .55013 m
1 .55013 L
s
.99625 .57519 m
1 .57519 L
s
.99625 .62531 m
1 .62531 L
s
.99625 .65038 m
1 .65038 L
s
.99625 .67544 m
1 .67544 L
s
.99625 .7005 m
1 .7005 L
s
.99625 .75063 m
1 .75063 L
s
.99625 .77569 m
1 .77569 L
s
.99625 .80075 m
1 .80075 L
s
.99625 .82581 m
1 .82581 L
s
.99625 .87594 m
1 .87594 L
s
.99625 .901 m
1 .901 L
s
.99625 .92607 m
1 .92607 L
s
.99625 .95113 m
1 .95113 L
s
.99625 .07393 m
1 .07393 L
s
.99625 .04887 m
1 .04887 L
s
.99625 .02381 m
1 .02381 L
s
.25 Mabswid
1 0 m
1 1 L
s
0 0 m
1 0 L
1 1 L
0 1 L
closepath
clip
newpath
1 0 0 r
.002 w
.97619 .4275 m
.96657 .42538 L
.95695 .42324 L
.94733 .42108 L
.93771 .41889 L
.93483 .41823 L
.92809 .4167 L
.91847 .41449 L
.90885 .41225 L
.89923 .40999 L
.89343 .40861 L
.88961 .40771 L
.87999 .40542 L
.87037 .4031 L
.86075 .40075 L
.85364 .39899 L
.85113 .39838 L
.84151 .396 L
.83189 .39358 L
.82227 .39112 L
.81549 .38937 L
.81265 .38865 L
.80303 .38616 L
.79341 .38363 L
.78379 .38105 L
.779 .37975 L
.77417 .37846 L
.76455 .37585 L
.75493 .37318 L
.74531 .37045 L
.74419 .37013 L
.73569 .36774 L
.72607 .36496 L
.71645 .36212 L
.7111 .36051 L
.70683 .35925 L
.69721 .35636 L
.68759 .35338 L
.67976 .35089 L
.67797 .35034 L
.66835 .3473 L
.65873 .34415 L
.65021 .34127 L
.64911 .34091 L
.63949 .3377 L
.62987 .33433 L
.62252 .33165 L
.62025 .33087 L
.61063 .32741 L
.60101 .32372 L
Mistroke
.59678 .32203 L
.59139 .32002 L
.58177 .31615 L
.57316 .31241 L
.57215 .31201 L
.56253 .30788 L
.55291 .30316 L
.55223 .30279 L
.54329 .29839 L
.535 .29317 L
.53367 .29247 L
.52405 .28468 L
.52323 .28355 L
.51722 .27393 L
.5148 .26431 L
.51443 .26164 L
.51364 .25469 L
.51217 .24507 L
.50975 .23545 L
.50615 .22583 L
.50481 .22281 L
.50137 .21621 L
.49519 .20666 L
.49514 .20659 L
.48719 .19697 L
.48557 .19528 L
.4767 .18735 L
.47595 .18675 L
.46633 .18003 L
.46244 .17773 L
.45671 .17456 L
.44709 .16992 L
.44292 .16811 L
.43747 .16583 L
.42785 .1621 L
.41823 .15872 L
.41761 .15849 L
.40861 .15553 L
.39899 .15265 L
.38937 .15032 L
.37975 .14968 L
.37013 .15447 L
.36587 .15849 L
.36051 .16569 L
.35778 .16811 L
.35089 .17625 L
.34953 .17773 L
.34127 .18703 L
.34098 .18735 L
.3321 .19697 L
Mistroke
.33165 .19746 L
.32287 .20659 L
.32203 .20744 L
.31305 .21621 L
.31241 .21682 L
.30279 .22539 L
.30226 .22583 L
.29317 .2331 L
.28998 .23545 L
.28355 .24004 L
.276 .24507 L
.27393 .24642 L
.26431 .25243 L
.26054 .25469 L
.25469 .25819 L
.24507 .26399 L
.24454 .26431 L
.23545 .26977 L
.22905 .27393 L
.22583 .27569 L
.21621 .28307 L
.21568 .28355 L
.20659 .29257 L
.20616 .29317 L
.2043 .30279 L
.20659 .30547 L
.21621 .30957 L
.22583 .31103 L
.23545 .31146 L
.24507 .31123 L
.25469 .3113 L
.26431 .31004 L
.27393 .3083 L
.28355 .30609 L
.29317 .30345 L
.29539 .30279 L
.30279 .30097 L
.31241 .29765 L
.32203 .29372 L
.32331 .29317 L
.33165 .28986 L
.34127 .28545 L
.34538 .28355 L
.35089 .28122 L
.36051 .27729 L
.37013 .27396 L
.37022 .27393 L
.37975 .27149 L
.38937 .26989 L
.39899 .2692 L
Mistroke
.40861 .26942 L
.41823 .27058 L
.42785 .27271 L
.43196 .27393 L
.43747 .27598 L
.44709 .28094 L
.45044 .28355 L
.45649 .29317 L
.45528 .30279 L
.45038 .31241 L
.44709 .31757 L
.44411 .32203 L
.43782 .33165 L
.43747 .33227 L
.43216 .34127 L
.42785 .35006 L
.42738 .35089 L
.42347 .36051 L
.42031 .37013 L
.41823 .37797 L
.41777 .37975 L
.41573 .38937 L
.41407 .39899 L
.41273 .40861 L
.41162 .41823 L
.41071 .42785 L
.40995 .43747 L
.40931 .44709 L
.40877 .45671 L
.40861 .45995 L
.40831 .46633 L
.40792 .47595 L
.40759 .48557 L
.4073 .49519 L
.40704 .50481 L
.40682 .51443 L
.40663 .52405 L
.40646 .53367 L
.40631 .54329 L
.40618 .55291 L
.40606 .56253 L
.40595 .57215 L
.40586 .58177 L
.40578 .59139 L
.4057 .60101 L
.40563 .61063 L
.40557 .62025 L
.40551 .62987 L
.40546 .63949 L
.40541 .64911 L
Mistroke
.40537 .65873 L
.40533 .66835 L
.4053 .67797 L
.40526 .68759 L
.40523 .69721 L
.40521 .70683 L
.40518 .71645 L
.40516 .72607 L
.40513 .73569 L
.40511 .74531 L
.40509 .75493 L
.40508 .76455 L
.40506 .77417 L
.40505 .78379 L
.40503 .79341 L
.40502 .80303 L
.40501 .81265 L
.40499 .82227 L
.40498 .83189 L
.40497 .84151 L
.40496 .85113 L
.40495 .86075 L
.40495 .87037 L
.40494 .87999 L
.40493 .88961 L
.40492 .89923 L
.40492 .90885 L
.40491 .91847 L
.4049 .92809 L
.4049 .93771 L
.40489 .94733 L
.40489 .95695 L
.40488 .96657 L
.40488 .97619 L
Mfstroke
.02381 .04634 m
.03343 .04856 L
.04305 .0508 L
.05095 .05267 L
.05267 .05307 L
.06229 .05531 L
.07191 .0576 L
.08153 .05992 L
.09115 .06227 L
.09121 .06229 L
.10077 .06459 L
.11039 .06695 L
.12001 .06936 L
.12963 .0718 L
.13004 .07191 L
.13925 .0742 L
.14887 .07665 L
.15849 .07915 L
.16747 .08153 L
.16811 .08169 L
.17773 .08417 L
.18735 .08672 L
.19697 .08934 L
.20352 .09115 L
.20659 .09195 L
.21621 .09452 L
.22583 .0972 L
.23545 .09995 L
.23828 .10077 L
.24507 .10259 L
.25469 .10529 L
.26431 .10811 L
.27187 .11039 L
.27393 .11093 L
.28355 .11359 L
.29317 .11645 L
.30279 .11944 L
.30452 .12001 L
.31241 .12201 L
.32203 .12479 L
.33165 .12781 L
.33676 .12963 L
.34127 .13071 L
.35089 .13323 L
.36051 .13512 L
.37013 .13444 L
.37671 .12963 L
.37975 .12432 L
.38201 .12001 L
.38597 .11039 L
Mistroke
.38904 .10077 L
.38937 .09946 L
.39152 .09115 L
.39352 .08153 L
.39516 .07191 L
.39652 .06229 L
.39763 .05267 L
.39857 .04305 L
.39899 .03797 L
.39935 .03343 L
.40001 .02381 L
Mfstroke
0 1 0 r
.97619 .2338 m
.96657 .23376 L
.95695 .2337 L
.94733 .23364 L
.93771 .23356 L
.92809 .23346 L
.91847 .23334 L
.90885 .2332 L
.89923 .23303 L
.88961 .23283 L
.87999 .23258 L
.87037 .23226 L
.86075 .23184 L
.85662 .22583 L
.86075 .22551 L
.87037 .22488 L
.87999 .22436 L
.88961 .22391 L
.89923 .22352 L
.90885 .22317 L
.91847 .22286 L
.92809 .22258 L
.93771 .22232 L
.94733 .22209 L
.95695 .22188 L
.96657 .22168 L
.97619 .2215 L
s
.50521 .97619 m
.50481 .97412 L
.50334 .96657 L
.50139 .95695 L
.49935 .94733 L
.49721 .93771 L
.49519 .92908 L
.49496 .92809 L
.49261 .91847 L
.4901 .90885 L
.48742 .89923 L
.48557 .89302 L
.48455 .88961 L
.48146 .87999 L
.47805 .87037 L
.47595 .86496 L
.47429 .86075 L
.47003 .85113 L
.46633 .84394 L
.46505 .84151 L
.45897 .83189 L
.45671 .82896 L
.45095 .82227 L
.44709 .81904 L
.43747 .81317 L
.4362 .81265 L
.42785 .81039 L
.41823 .80973 L
.40861 .8102 L
.39899 .81088 L
.38937 .81079 L
.37975 .809 L
.37013 .80454 L
.36769 .80303 L
.36051 .79648 L
.35768 .79341 L
.35089 .78381 L
.35087 .78379 L
.34532 .77417 L
.34127 .76557 L
.34081 .76455 L
.33676 .75493 L
.33321 .74531 L
.33165 .74069 L
.32999 .73569 L
.327 .72607 L
.32425 .71645 L
.32203 .70806 L
.32171 .70683 L
.31928 .69721 L
Mistroke
.317 .68759 L
.31484 .67797 L
.31281 .66835 L
.31241 .66642 L
.31085 .65873 L
.30897 .64911 L
.30717 .63949 L
.30545 .62987 L
.30381 .62025 L
.30279 .61412 L
.30222 .61063 L
.30067 .60101 L
.29919 .59139 L
.29775 .58177 L
.29637 .57215 L
.29503 .56253 L
.29374 .55291 L
.29317 .54853 L
.29249 .54329 L
.29128 .53367 L
.2901 .52405 L
.28897 .51443 L
.28788 .50481 L
.28682 .49519 L
.28581 .48557 L
.28484 .47595 L
.28391 .46633 L
.28355 .4625 L
.28302 .45671 L
.28217 .44709 L
.28137 .43747 L
.28062 .42785 L
.27992 .41823 L
.27929 .40861 L
.27872 .39899 L
.27822 .38937 L
.27781 .37975 L
.27751 .37013 L
.27732 .36051 L
.27727 .35089 L
.2774 .34127 L
.27775 .33165 L
.27838 .32203 L
.27937 .31241 L
.28086 .30279 L
.283 .29317 L
.28355 .29118 L
.28604 .28355 L
.29032 .27393 L
.29317 .26904 L
Mistroke
.29621 .26431 L
.30279 .25594 L
.30374 .25469 L
.31164 .24507 L
.31241 .24397 L
.31594 .23545 L
.31241 .22693 L
.3113 .22583 L
.30279 .21875 L
.29557 .21621 L
.29317 .21503 L
.28355 .21068 L
.27434 .20659 L
.27393 .20639 L
.26431 .20131 L
.25784 .19697 L
.25469 .19433 L
.24869 .18735 L
.24507 .18042 L
.24408 .17773 L
.24168 .16811 L
.24034 .15849 L
.23951 .14887 L
.23892 .13925 L
.23845 .12963 L
.23803 .12001 L
.23763 .11039 L
.23724 .10077 L
.23684 .09115 L
.23643 .08153 L
.23601 .07191 L
.23557 .06229 L
.23545 .05962 L
.23512 .05267 L
.23467 .04305 L
.2342 .03343 L
.23372 .02381 L
Mfstroke
% End of Graphics
MathPictureEnd
\
\>"], "Graphics",
ImageSize->{288, 288},
ImageMargins->{{35, 0}, {0, 0}},
ImageRegion->{{0, 1}, {0, 1}},
ImageCache->GraphicsData["CompressedBitmap", "\<\
eJztnAtzE1UYhlOSJmmBltJSWijSFhAKtAW5DBcRFKEI5aKgXHSQyoDgoDjA
KApyE0TGuzNy1RnHn+K/4NfE7knyJTl5Tvrl7LZNpZlpCCd7nve77e7Zs2ez
f+TKuTOfjlw5f3qke+jSyOfnzp++3L374qXRpnhdLFbXHfx1x4LPmVgs/5aJ
PX/+vCd4C1om7vNS8088sMF8Cv5WB++JoMV8mhF8GpC2NdCjX7ZLjYHFtkRJ
2+irHzZdq++ezH4wLtaL9VbfVdyXNu0XUH9FwS4JUqw+/1XxZrEVskECZFYy
fFDvuDE+XpSHXqtv8KJA9jGPcm2n0RW0nAVLSkuoXMORB0ekBy0calL1FUq0
8KkAo5j0SzCT+v1pYfBPJlsBo6+6olYLH4e2BmhrVG43WX1r3b4wfU2O6jwS
ScVJ+3GY7VTGZbIbTdSWZmfaku+TsQ8wcXO2y7c9kh4VxDYrYY81lpNlywH2
ZBpWWmYzgn4bQmFNos2RtD7Yeo0S9lhTJI1i40AoGy3sLLG2L0psi2CXRolt
D95Nv54osZ1ibRdgXwbsUw32JbG2MxTWlIYZ5iSCrecpYU80ZbVMsC1Rur5C
Ijo7Smy/7AQzAbsMsM9sbCrr8OiLTmozsimL5Ue3cNoyXiVDydM+SIZYbeul
nuK+8mnAznTJm9rZJKI5vTyf9J7aJZezNP8yX9F1Qapi3LMH+4S4G0gWHVoq
ekzjoCS0aXRzf6YCXgLxPznbZSN8yoJbvzTNScnHQo0FaclIgxQ+JWArSKVl
b+vUSNEOS1iTkWTQMhewf/li54i1c9RYE5hXATY3G6yiA00ZbKwjK9lYOH+l
xNq/fR02SUkFLf/4Iv6tkY7OPHRLrTzzjfliSGBCoq867RCW9v+UVM1DX+wi
wJoSNAed332xXYBtkSD8GiW2VbA/a7CU9QWAbYe2H9zFtA2wHWLZAtkPH2jK
imycD/ZQ8u5rgkDWksNUdN/5CswDWLeESIV9DbCtgF0Cbd9qBLbn0pPBcwUN
Qe64a+INsLYZEDQ8vaWpk9fFWsLS5cltTRB2Zqt1tGPhInCVy8axYLvFxhQg
VkPbTQ12j9gYB8QAtN2wsW0SYhoL7TPvpWOxTGFWs5j8jU1uzfct2ijG46Bh
Cc8rQD4VvHcE39ZXo2GcGs5tUMwb/Q85cCx4TwffdtllV4Ure4EslxVFURx0
WWDC0BsimHukXOuVuieC90VVB9jSHQKy1oLr1ZXlLnExBQKU3Gua3elN6BhO
wHiwU6xtABhV/Nd2AZK1OwTbCNh1vkHYDh3J7vW+AtvE7llRYrcKliY/Nvhi
Nwu2CbDmbJ6WwQ2lcSyBTdCRPChM7qXlEw0mWLQwq2BtTl6ZtrhcKxrv26Dv
VU2ZblSKzhap+fKJhh9faYJK6W4G0ZkiRdf1dEl7VSO/rsyDYtFGwNKYnuS/
1MjTIYUmGtOSZ7pcK1ypRCqaFGwv9KBx7BV3RdNRLivK80c0edUmBl3W1LPb
z7KpMrqd1C5ql9RRNZs3S7JipVOCK0GlQza+qFExB93mYHMaqpBAlwhc0Ajs
UmIXi7uf+GIp6L2CPeeLXQHYZRKEM+4S3Q0wuijpExs/0pQh2UiXUKvFxlO+
rhN2UKw9GSV2rVj7vo0NcwuB5OkydoPIH0N5C6u9haCV35R1cbTpiC1f/S0E
qjs6/G0Tnw/ZdUcrFyrfMyBPSbQwdj1oexrm1gHJ0yzITvF5mPPsffNAa4HJ
jjklDWGqFTcPtFL7JNa7bCntrkpn6gPiwY4osYclNdsQ66ztHoAdFde32LWt
tZGwx8X1jb6uE/akuL4uSuyIWDsQJfasYPt8sd2AvSApW15d/gn2mdjY45t/
wl6WRC2O0vUvxNoFUWKvCXZelNhbwXthDUNU2LsS2yYNliqBLmbuSxAa3GU1
BDCa/P9JXC9MNFZpI2FVt6+mYQpYVdn8YzqH4WHmut05LPTGtgOMRtiUa7ov
qBcwBbFHiS0rocrh8La2FWBTUMA5pCUszYw90tRyOJgz/4R4aOc/envGE0Zu
0nzoCw0z6X1LiVAVRA05Z8HITbrBMdVgJiN7lQhVDmvIuSkDowR0Tg7MpHef
EqEqiBpyLioYzX1VPwcbqbxz6tNqo9R2aES1D3cVxorDSqmyKqp+ltXbqzBz
q96iIWdUw+kmRMo56PQWoJ2MqoAWLU4AzNTYfiVCdWyrIeemDIwSQItMK+Tw
gBKhymE4e8YTRm7SApcXGmbSe1CJUBVEpM6RZbRyaOJhhwBGi00mAGYy8rYS
ocphDTlnwchNWtU1vjCztqywdsC5rtRbILu2rL4EZr6IxXBcSm3vgHjLuImb
GBxWSpYV4dTzNypxU0pxKSXd0miKM63uc7jqSh+VsLcU7XDhYMbGdwFBz2mo
jnNHlDCVc5HCyM2mmoC9B7DZkwMz6T0GiFmAUBXEUSVM5RxZRg+iqmDHAUYL
f1WwEwBrmByYycgHgEgDQpVDAzMsejZK5dKHOZ2MHBKrRphVMk0B4jfN5mdB
JylW/OKLkEmRosD+6AujpzYqPLz5MSDoyRLVw5tkT6PEh61QIOgHKB74wujx
k+9tWAx+S8GcgT2XojoNMYEp8yUrwGOdJpe4QpKewCh7+NTpndVWeSEq1RXJ
37PriuSprfJkaaTe0+BOO4FKhtAzKffKSjBRUoIx59BTO6XqbYmzIBTLVb1F
tbvzHIDdHX+Ys8bp4Zc7do1r7SGY6llugtFDSfwE9wsCc+aQELd9c9jqgvk4
V7uwNoDdmmIwZ0EQ4qZvQUTqHP1AmepHBP6vMGcOCXHDN4ftLpiPc1McVphm
rX4MPB8Eyn5SgqbDaKyhHQVHL+osOpK6bhddcw5ejK0USP7B1Erzo/QYG1Ps
ic6xh5WVrCnzyTlOrOlfvZ3+beXa78uJzGT3oULrePzofazuP3jOi6Y=\
\>"],
ImageRangeCache->{{{143, 430}, {488, 201}} -> {-11.1352, 9.44788, 0.0404426, \
0.076841}}]
}, Open ]],
Cell["", "Text"],
Cell[TextData[{
"Say we are interested in the root near ",
Cell[BoxData[
RowBox[{"{",
RowBox[{"0", ",", "11"}], "}"}]]],
". We can use a numeric root\[Hyphen]finder with no trouble."
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{"Timing", "[",
RowBox[{"rt", "=",
RowBox[{"FindRoot", "[",
RowBox[{
RowBox[{"Evaluate", "[",
RowBox[{"Thread", "[",
RowBox[{"eqns", "\[Equal]", "0"}], "]"}], "]"}], ",",
RowBox[{"{",
RowBox[{"x", ",", "0"}], "}"}], ",",
RowBox[{"{",
RowBox[{"y", ",", "11"}], "}"}]}], "]"}]}],
"]"}], "\[IndentingNewLine]",
RowBox[{"eqns", "/.", "rt"}]}], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"0.`", " ", "Second"}], ",",
RowBox[{"{",
RowBox[{
RowBox[{"x", "\[Rule]", "0.002585314725406652`"}], ",",
RowBox[{"y", "\[Rule]", "11.694143027082712`"}]}], "}"}]}],
"}"}]], "Output"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"-", "1.4796341929468326`*^-9"}], ",",
RowBox[{"-", "6.366462912410498`*^-12"}]}], "}"}]], "Output"]
}, Open ]],
Cell["\<\
Can even find ALL solutions though takes longer. Also check residuals to \
assess quality.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{"Timing", "[",
RowBox[{
RowBox[{"nsolns", "=",
RowBox[{"NSolve", "[",
RowBox[{
RowBox[{"eqns", "\[Equal]", "0"}], ",",
RowBox[{"{",
RowBox[{"x", ",", "y"}], "}"}]}], "]"}]}], ";"}], "]"}], "\n",
RowBox[{"Max", "[",
RowBox[{"Abs", "[",
RowBox[{"eqns", "/.", "nsolns"}], "]"}], "]"}]}], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"0.6200000000000001`", " ", "Second"}], ",", "Null"}],
"}"}]], "Output"],
Cell[BoxData["2.5512463253107853`*^-9"], "Output"]
}, Open ]],
Cell["Exact solutions? We can get those too.", "Text"],
Cell[CellGroupData[{
Cell["Wait, don't touch that solver!", "Subsubsection"],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{"Timing", "[",
RowBox[{
RowBox[{"exactsolns", "=",
RowBox[{"Solve", "[",
RowBox[{
RowBox[{"eqns", "\[Equal]",
RowBox[{"{",
RowBox[{"0", ",", "0"}], "}"}]}], ",",
RowBox[{"{",
RowBox[{"x", ",", "y"}], "}"}]}], "]"}]}], ";"}],
"]"}], "\[IndentingNewLine]",
RowBox[{"LeafCount", "[", "exactsolns", "]"}]}], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"6.8199999999999985`", " ", "Second"}], ",", "Null"}],
"}"}]], "Output"],
Cell[BoxData["87673"], "Output"]
}, Open ]],
Cell["\<\
Too late. A lot slower, with result quite large. Now suppose we want numeric \
values.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{
RowBox[{"nexactsolns", "=",
RowBox[{"N", "[", "exactsolns", "]"}]}], ";"}], "\n",
RowBox[{"Max", "[",
RowBox[{"Abs", "[",
RowBox[{"eqns", "/.", "nexactsolns"}], "]"}], "]"}]}], "Input"],
Cell[BoxData["3.633209908566495`*^23"], "Output"]
}, Open ]],
Cell["\<\
Quite inaccurate. Exact solutions involve algebraic combinations of \
complicated objects and contain large coefficients. Numerical evaluation \
using machine arithmetic is problematic due to cancellation error. No warning \
from evaluation at machine precision that we were getting gibberish. Next try \
higher precsion.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{"Timing", "[",
RowBox[{
RowBox[{"nexactsolns25", "=",
RowBox[{"N", "[",
RowBox[{"exactsolns", ",", "25"}], "]"}]}], ";"}], "]"}], "\n",
RowBox[{"Max", "[",
RowBox[{"Abs", "[",
RowBox[{"eqns", "/.", "nexactsolns25"}], "]"}], "]"}]}], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"0.33000000000000007`", " ", "Second"}], ",", "Null"}],
"}"}]], "Output"],
Cell[BoxData["9.57652`-10.2081*^-33"], "Output"]
}, Open ]],
Cell["\<\
Niw time to evaluate is not small.
We were better off avoiding the exact computation.\
\>", "Text"],
Cell["\<\
Another interesting hybridization involving solving of systems of equations. \
Gr\[ODoubleDot]bner basis/eigensystem method was a hybrid where exact \
computation methods are used in a numeric task. Can instead do all in \
infinite precision.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{"Timing", "[",
RowBox[{
RowBox[{"exactsolnsagain", "=",
RowBox[{"NSolve", "[",
RowBox[{
RowBox[{"eqns", "\[Equal]",
RowBox[{"{",
RowBox[{"0", ",", "0"}], "}"}]}], ",",
RowBox[{"{",
RowBox[{"x", ",", "y"}], "}"}], ",", " ",
RowBox[{"WorkingPrecision", "\[Rule]", "Infinity"}]}], "]"}]}], ";"}],
"]"}], "\[IndentingNewLine]",
RowBox[{"LeafCount", "[", "exactsolnsagain", "]"}]}], "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"0.9100000000000001`", " ", "Second"}], ",", "Null"}],
"}"}]], "Output"],
Cell[BoxData["88729"], "Output"]
}, Open ]],
Cell["Big, yes. But at least it did not take so long to compute.", "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Related misuses of exact computation", "Subsection",
PageBreakAbove->True],
Cell["\<\
Similar problems in integration, solving of differential equations, and \
elsewhere. Methods appropriate to exact domain can give results where \
numerical evaluation is not stable.
Not safe to assume that an \"exact\" result will give good numerical values
Result computed numerically from the outset may be obtained faster and more \
reliably
Not to say that exact results are useless or unsafe but often one is better \
served by numeric or hybrid methods.\
\>", "Text"],
Cell["\<\
Two ways in which machine and higher precision approximate arithmetic interact.
(i) Similar to use of numerical approximation in exact linear programming. \
For many high precision tasks, e.g. root\[Hyphen]finding and optimization, \
one wants a good starting point. Find using fast machine arithmetic. Further \
iterations to proceed at higher precision. May be slow but few needed if we \
began from a good initial point.\
\>", "Text"],
Cell[TextData[{
"(ii) Machine arithmetic can profit from having a higher precision neighbor \
to call upon. One may encounter a machine overflow or at intermediate steps, \
even when result is a perfectly reasonable machine value. A program such as \
",
StyleBox["Mathematica",
FontSlant->"Italic"],
" will then slip into extended precision arithmetic where far larger \
exponents may be represented. Similar to hardware processors that handle \
machine numbers with larger exponents than regular double precision. Has \
unfortunate ability to create trouble if one cannot maintain tight control \
over when a value is in a register. An attempt to store an intermediate \
result too large for ordinary memory will give an overflow that might have \
been avoided by delaying the store operation. Are such overflows carefully \
avoided in hardware arithmetic? Is the IEEE standard up to speed in this \
area? As best I can tell you are nowadays at the mercy of the compiler \
writer. Come to think of it, I used to be a compiler writer. Be very afraid."
}], "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Summary", "Section",
PageBreakAbove->True],
Cell["\<\
Techniques developed for numeric computation have been adapted for exact \
computations. Reverse as happened as well. Important lessons are\
\>", "Text"],
Cell["\<\
(i) Do not assume that exact computations are needed to find exact results. \
Approximate methods (when they exist) tend to be much faster in practice.\
\>", "Text"],
Cell["\<\
(ii) Not all numeric problems must be tackled by exclusively numeric \
programs. Sometimes symbolic methods will reduce the difficulty.\
\>", "Text"],
Cell["\<\
(iii) If you think you need an exact result, determine whether this is really \
so. Often you are better off with a numeric computation done according by \
high quality numeric algorithms rather than using the result of a symbolic \
computation that does not have good algorithms for numeric evaluation.\
\>", "Text"],
Cell["\<\
My hope is that the types of example we have discussed, howsoever briefly, \
will give you some insight into why the world of hybrid \
symbolic\[Hyphen]numeric computation is recently coming into prominence. \
Should this current popularity prove to be more than just a brief trend, you \
may some day find yourself working this realm.\
\>", "Text"]
}, Open ]]
},
ScreenStyleEnvironment->"Presentation",
WindowSize->{811, 600},
WindowMargins->{{Automatic, -35}, {Automatic, 0}},
PrintingPageRange->{Automatic, Automatic},
PrintingOptions->{"Magnification"->1,
"PaperOrientation"->"Portrait",
"PaperSize"->{612, 792},
"PostScriptOutputFile":>FrontEnd`FileName[{$RootDirectory, "home", "usr1",
"danl"}, "IWU_Talk.nb.ps", CharacterEncoding -> "iso8859-1"]},
FrontEndVersion->"7.0 for Linux x86 (64-bit) (February 25, 2009)",
StyleDefinitions->"Classroom.nb"
]
(* End of Notebook Content *)
(* Internal cache information *)
(*CellTagsOutline
CellTagsIndex->{
"compatibility-no"->{
Cell[37049, 1147, 252, 6, 35, "CompatibilityTextTop",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[37304, 1155, 513, 15, 125, "CompatibilityText",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[37820, 1172, 258, 6, 31, "CompatibilityInputTop",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[38081, 1180, 2109, 58, 690, "CompatibilityInput",
CellTags->"compatibility-no"],
Cell[40193, 1240, 500, 13, 70, "CompatibilityControls",
CellTags->{"compatibility-yes", "compatibility-no"}]},
"compatibility-yes"->{
Cell[37049, 1147, 252, 6, 35, "CompatibilityTextTop",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[37304, 1155, 513, 15, 125, "CompatibilityText",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[37820, 1172, 258, 6, 31, "CompatibilityInputTop",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[40193, 1240, 500, 13, 70, "CompatibilityControls",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[40718, 1257, 2081, 59, 371, "Input",
CellTags->"compatibility-yes"]}
}
*)
(*CellTagsIndex
CellTagsIndex->{
{"compatibility-no", 67851, 2606},
{"compatibility-yes", 68421, 2617}
}
*)
(*NotebookFileOutline
Notebook[{
Cell[545, 20, 116, 3, 158, "Title",
PageBreakAbove->False],
Cell[664, 25, 34, 0, 51, "Author"],
Cell[701, 27, 149, 7, 122, "Address"],
Cell[853, 36, 705, 10, 168, "Abstract"],
Cell[1561, 48, 200, 4, 53, "SectionFirst",
PageBreakAbove->True],
Cell[1764, 54, 346, 8, 217, "Text"],
Cell[2113, 64, 351, 7, 177, "Text"],
Cell[2467, 73, 291, 8, 281, "Text"],
Cell[2761, 83, 422, 7, 153, "Text"],
Cell[CellGroupData[{
Cell[3208, 94, 60, 0, 93, "Section"],
Cell[3271, 96, 228, 4, 97, "Text"],
Cell[3502, 102, 288, 6, 149, "Text"],
Cell[3793, 110, 433, 9, 302, "Text"],
Cell[4229, 121, 193, 4, 69, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[4459, 130, 77, 0, 126, "Section"],
Cell[4539, 132, 410, 8, 153, "Text"],
Cell[4952, 142, 75, 0, 41, "Text"],
Cell[5030, 144, 256, 9, 69, "Text"],
Cell[5289, 155, 177, 5, 69, "Text"],
Cell[5469, 162, 67, 0, 41, "Text"],
Cell[5539, 164, 112, 3, 41, "Text"],
Cell[5654, 169, 245, 4, 97, "Text"],
Cell[5902, 175, 197, 6, 69, "Text"],
Cell[6102, 183, 166, 5, 161, "Text"],
Cell[6271, 190, 230, 6, 69, "Text"],
Cell[6504, 198, 253, 6, 97, "Text"],
Cell[6760, 206, 783, 14, 353, "Text"],
Cell[7546, 222, 520, 8, 193, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[8103, 235, 64, 1, 93, "Section",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell[8192, 240, 55, 0, 73, "Subsection"],
Cell[8250, 242, 110, 3, 69, "Text"],
Cell[CellGroupData[{
Cell[8385, 249, 110, 3, 70, "Input"],
Cell[8498, 254, 45, 0, 68, "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[8592, 260, 59, 0, 73, "Subsection"],
Cell[8654, 262, 138, 3, 69, "Text"],
Cell[CellGroupData[{
Cell[8817, 269, 228, 7, 70, "Input"],
Cell[9048, 278, 103, 2, 68, "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[9188, 285, 68, 1, 70, "Input"],
Cell[9259, 288, 29, 0, 68, "Output"]
}, Open ]],
Cell[9303, 291, 357, 6, 125, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[9697, 302, 61, 1, 73, "Subsection",
PageBreakAbove->True],
Cell[9761, 305, 45, 0, 41, "Text"],
Cell[CellGroupData[{
Cell[9831, 309, 112, 3, 70, "Input"],
Cell[9946, 314, 81, 2, 68, "Output"]
}, Open ]],
Cell[10042, 319, 125, 3, 69, "Text"],
Cell[CellGroupData[{
Cell[10192, 326, 87, 2, 70, "Input"],
Cell[10282, 330, 255, 3, 156, "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[10586, 339, 38, 0, 73, "Subsection"],
Cell[10627, 341, 86, 2, 41, "Text"],
Cell[CellGroupData[{
Cell[10738, 347, 140, 4, 70, "Input"],
Cell[10881, 353, 105, 3, 68, "Output"]
}, Open ]],
Cell[11001, 359, 100, 2, 41, "Text"],
Cell[CellGroupData[{
Cell[11126, 365, 153, 4, 70, "Input"],
Cell[11282, 371, 154, 4, 68, "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[11485, 381, 76, 1, 73, "Subsection",
PageBreakAbove->True],
Cell[11564, 384, 364, 6, 153, "Text"],
Cell[11931, 392, 389, 8, 257, "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[12369, 406, 113, 3, 126, "Section",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell[12507, 413, 63, 0, 73, "Subsection"],
Cell[12573, 415, 738, 18, 211, "Text"],
Cell[13314, 435, 331, 10, 125, "Input"],
Cell[CellGroupData[{
Cell[13670, 449, 143, 4, 70, "Input"],
Cell[13816, 455, 109, 3, 68, "Output"]
}, Open ]],
Cell[13940, 461, 127, 3, 69, "Text"],
Cell[14070, 466, 331, 10, 125, "Input"],
Cell[CellGroupData[{
Cell[14426, 480, 143, 4, 70, "Input"],
Cell[14572, 486, 109, 3, 68, "Output"]
}, Open ]],
Cell[14696, 492, 326, 7, 97, "Text"],
Cell[15025, 501, 542, 10, 181, "Text"],
Cell[15570, 513, 140, 4, 69, "Text",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell[15735, 521, 160, 4, 70, "Input"],
Cell[15898, 527, 125, 4, 68, "Output"]
}, Open ]],
Cell[16038, 534, 483, 10, 259, "Text"],
Cell[CellGroupData[{
Cell[16546, 548, 192, 5, 70, "Input"],
Cell[16741, 555, 128, 4, 68, "Output"]
}, Open ]],
Cell[16884, 562, 567, 8, 209, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[17488, 575, 73, 1, 73, "Subsection",
PageBreakAbove->True],
Cell[17564, 578, 668, 18, 156, "Text"],
Cell[CellGroupData[{
Cell[18257, 600, 244, 7, 70, "Input"],
Cell[18504, 609, 235, 8, 68, "Output"]
}, Open ]],
Cell[18754, 620, 325, 5, 125, "Text"],
Cell[19082, 627, 159, 3, 69, "Text"],
Cell[19244, 632, 505, 16, 70, "Input"],
Cell[19752, 650, 98, 2, 41, "Text"],
Cell[CellGroupData[{
Cell[19875, 656, 338, 9, 101, "Input"],
Cell[20216, 667, 104, 2, 68, "Output"]
}, Open ]],
Cell[20335, 672, 173, 5, 161, "Text"],
Cell[20511, 679, 140, 3, 69, "Text"],
Cell[20654, 684, 601, 9, 209, "Text"],
Cell[CellGroupData[{
Cell[21280, 697, 574, 18, 131, "Input"],
Cell[21857, 717, 1589, 40, 504, "Output"],
Cell[23449, 759, 1921, 47, 388, "Output"]
}, Open ]],
Cell[25385, 809, 351, 12, 70, "Text"],
Cell[CellGroupData[{
Cell[25761, 825, 62, 1, 70, "Input"],
Cell[25826, 828, 340, 11, 70, "Output"]
}, Open ]],
Cell[26181, 842, 184, 4, 69, "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[26414, 852, 92, 1, 93, "Section",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell[26531, 857, 61, 0, 73, "Subsection"],
Cell[26595, 859, 477, 9, 153, "Text"],
Cell[27075, 870, 398, 6, 153, "Text"],
Cell[27476, 878, 632, 10, 209, "Text"],
Cell[28111, 890, 699, 10, 237, "Text"],
Cell[28813, 902, 290, 5, 125, "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[29152, 913, 72, 1, 93, "Section",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell[29249, 918, 29, 0, 73, "Subsection"],
Cell[CellGroupData[{
Cell[29303, 922, 66, 0, 70, "Subsubsection"],
Cell[29372, 924, 299, 6, 189, "Text"],
Cell[29674, 932, 804, 13, 397, "Text"],
Cell[30481, 947, 379, 7, 126, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[30897, 959, 49, 0, 70, "Subsubsection"],
Cell[30949, 961, 506, 10, 181, "Text"],
Cell[31458, 973, 252, 4, 97, "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[31759, 983, 76, 1, 73, "Subsection",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell[31860, 988, 49, 0, 70, "Subsubsection"],
Cell[31912, 990, 266, 5, 109, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[32215, 1000, 46, 0, 70, "Subsubsection"],
Cell[32264, 1002, 364, 6, 153, "Text"],
Cell[32631, 1010, 335, 6, 125, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[33003, 1021, 60, 0, 70, "Subsubsection"],
Cell[33066, 1023, 446, 7, 153, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[33549, 1035, 53, 0, 70, "Subsubsection"],
Cell[33605, 1037, 523, 8, 181, "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[34177, 1051, 53, 1, 73, "Subsection",
PageBreakAbove->True],
Cell[CellGroupData[{
Cell[34255, 1056, 45, 0, 70, "Subsubsection"],
Cell[34303, 1058, 509, 8, 209, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[34849, 1071, 68, 0, 70, "Subsubsection"],
Cell[34920, 1073, 239, 4, 97, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[35196, 1082, 97, 2, 70, "Subsubsection"],
Cell[35296, 1086, 147, 3, 69, "Text"],
Cell[35446, 1091, 121, 3, 69, "Text"],
Cell[35570, 1096, 126, 3, 69, "Text"]
}, Open ]]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[35757, 1106, 84, 1, 93, "Section",
PageBreakAbove->True],
Cell[35844, 1109, 193, 4, 69, "Text"],
Cell[36040, 1115, 1006, 30, 104, "Input"],
Cell[37049, 1147, 252, 6, 35, "CompatibilityTextTop",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[37304, 1155, 513, 15, 125, "CompatibilityText",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[37820, 1172, 258, 6, 31, "CompatibilityInputTop",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[38081, 1180, 2109, 58, 690, "CompatibilityInput",
CellTags->"compatibility-no"],
Cell[40193, 1240, 500, 13, 70, "CompatibilityControls",
CellTags->{"compatibility-yes", "compatibility-no"}],
Cell[CellGroupData[{
Cell[40718, 1257, 2081, 59, 371, "Input",
CellTags->"compatibility-yes"],
Cell[42802, 1318, 16013, 994, 304, 12788, 938, "GraphicsData", "PostScript", \
"Graphics"]
}, Open ]],
Cell[58830, 2315, 16, 0, 41, "Text"],
Cell[58849, 2317, 203, 6, 70, "Text"],
Cell[CellGroupData[{
Cell[59077, 2327, 434, 13, 131, "Input"],
Cell[59514, 2342, 258, 8, 68, "Output"],
Cell[59775, 2352, 155, 4, 70, "Output"]
}, Open ]],
Cell[59945, 2359, 114, 3, 69, "Text"],
Cell[CellGroupData[{
Cell[60084, 2366, 364, 11, 101, "Input"],
Cell[60451, 2379, 126, 4, 68, "Output"],
Cell[60580, 2385, 50, 0, 68, "Output"]
}, Open ]],
Cell[60645, 2388, 54, 0, 41, "Text"],
Cell[CellGroupData[{
Cell[60724, 2392, 55, 0, 70, "Subsubsection"],
Cell[CellGroupData[{
Cell[60804, 2396, 396, 12, 101, "Input"],
Cell[61203, 2410, 126, 4, 68, "Output"],
Cell[61332, 2416, 32, 0, 68, "Output"]
}, Open ]],
Cell[61379, 2419, 110, 3, 41, "Text"],
Cell[CellGroupData[{
Cell[61514, 2426, 225, 6, 101, "Input"],
Cell[61742, 2434, 49, 0, 68, "Output"]
}, Open ]],
Cell[61806, 2437, 345, 6, 125, "Text"],
Cell[CellGroupData[{
Cell[62176, 2447, 291, 8, 101, "Input"],
Cell[62470, 2457, 127, 4, 68, "Output"],
Cell[62600, 2463, 48, 0, 68, "Output"]
}, Open ]],
Cell[62663, 2466, 109, 3, 81, "Text"],
Cell[62775, 2471, 266, 5, 97, "Text"],
Cell[CellGroupData[{
Cell[63066, 2480, 477, 13, 161, "Input"],
Cell[63546, 2495, 126, 4, 68, "Output"],
Cell[63675, 2501, 32, 0, 68, "Output"]
}, Open ]],
Cell[63722, 2504, 74, 0, 41, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[63833, 2509, 81, 1, 73, "Subsection",
PageBreakAbove->True],
Cell[63917, 2512, 484, 9, 273, "Text"],
Cell[64404, 2523, 447, 7, 165, "Text"],
Cell[64854, 2532, 1068, 17, 349, "Text"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[65971, 2555, 49, 1, 93, "Section",
PageBreakAbove->True],
Cell[66023, 2558, 163, 3, 69, "Text"],
Cell[66189, 2563, 175, 3, 69, "Text"],
Cell[66367, 2568, 159, 3, 69, "Text"],
Cell[66529, 2573, 327, 5, 125, "Text"],
Cell[66859, 2580, 359, 6, 125, "Text"]
}, Open ]]
}
]
*)
(* End of internal cache information *)