(***********************************************************************

                    Mathematica-Compatible Notebook

This notebook can be used on any computer system with Mathematica 4.0,
MathReader 4.0, or any compatible application. The data for the notebook 
starts with the line containing stars above.

To get the notebook into a Mathematica-compatible application, do one of 
the following:

* Save the data starting with the line of stars above into a file
  with a name ending in .nb, then open the file inside the application;

* Copy the data starting with the line of stars above to the
  clipboard, then use the Paste menu command inside the application.

Data for notebooks contains only printable 7-bit ASCII and can be
sent directly in email or through ftp in text mode.  Newlines can be
CR, LF or CRLF (Unix, Macintosh or MS-DOS style).

NOTE: If you modify the data for this notebook not in a Mathematica-
compatible application, you must delete the line below containing the 
word CacheID, otherwise Mathematica-compatible applications may try to 
use invalid cache data.

For more information on notebooks and Mathematica-compatible 
applications, contact Wolfram Research:
  web: http://www.wolfram.com
  email: info@wolfram.com
  phone: +1-217-398-0700 (U.S.)

Notebook reader applications are available free of charge from 
Wolfram Research.
***********************************************************************)

(*CacheID: 232*)


(*NotebookFileLineBreakTest
NotebookFileLineBreakTest*)
(*NotebookOptionsPosition[     34480,        889]*)
(*NotebookOutlinePosition[     44561,       1199]*)
(*  CellTagsIndexPosition[     43478,       1152]*)
(*WindowFrame->Normal*)



Notebook[{
Cell[TextData[{
  "1.12 Special Topic: The Internals of ",
  StyleBox["Mathematica", "SBO"]
}], "Section",
  CellTags->{"S1.12.0", "0.1"}],

Cell["1.12.1 Why You Do Not Usually Need to Know about Internals", \
"Subsection",
  CellTags->{"S1.12.1", "1.1"}],

Cell[TextData[{
  "Most of this book is concerned with explaining ",
  StyleBox["what", "TI"],
  " ",
  StyleBox["Mathematica", "TI"],
  " does, not ",
  StyleBox["how", "TI"],
  " it does it. But the purpose of this chapter is to say at least a little \
about how ",
  StyleBox["Mathematica", "TI"],
  " does what it does. Appendix ",
  ButtonBox["A.9",
    ButtonData:>{"A.9"},
    ButtonStyle->"MainBookLink"],
  " gives some more details. \nYou should realize at the outset that while \
knowing about the internals of ",
  StyleBox["Mathematica", "TI"],
  " may be of intellectual interest, it is usually much less important in \
practice than one might at first suppose. \nIndeed, one of the main points of \
",
  StyleBox["Mathematica", "TI"],
  " is that it provides an environment where you can perform mathematical and \
other operations without having to think in detail about how these operations \
are actually carried out inside your computer. \nThus, for example, if you \
want to factor the polynomial ",
  Cell[BoxData[
      \(TraditionalForm\`x\^15 - 1\)], "InlineFormula"],
  ", you can do this just by giving ",
  StyleBox["Mathematica", "TI"],
  " the command ",
  StyleBox["Factor[x^15", "MR"],
  " ",
  StyleBox["-", "MR"],
  " ",
  StyleBox["1]", "MR"],
  "; you do not have to know the fairly complicated details of how such a \
factorization is actually carried out by the internal code of ",
  StyleBox["Mathematica", "TI"],
  ". \nIndeed, in almost all practical uses of ",
  StyleBox["Mathematica", "TI"],
  ", issues about how ",
  StyleBox["Mathematica", "TI"],
  " works inside turn out to be largely irrelevant. For most purposes it \
suffices to view ",
  StyleBox["Mathematica", "TI"],
  " simply as an abstract system which performs certain specified \
mathematical and other operations. \nYou might think that knowing how ",
  StyleBox["Mathematica", "TI"],
  " works inside would be necessary in determining what answers it will give. \
But this is only very rarely the case. For the vast majority of the \
computations that ",
  StyleBox["Mathematica", "TI"],
  " does are completely specified by the definitions of mathematical or other \
operations. \nThus, for example, ",
  StyleBox["3^40", "MR"],
  " will always be ",
  StyleBox["12157665459056928801", "MR"],
  ", regardless of how ",
  StyleBox["Mathematica", "TI"],
  " internally computes this result. \nThere are some situations, however, \
where several different answers are all equally consistent with the formal \
mathematical definitions. Thus, for example, in computing symbolic integrals, \
there are often several different expressions which all yield the same \
derivative. Which of these expressions is actually generated by ",
  StyleBox["Integrate", "MR"],
  " can then depend on how ",
  StyleBox["Integrate", "MR"],
  " works inside. "
}], "Text",
  CellTags->{"S1.12.1", "1.2"}],

Cell[TextData[{
  "Here is the answer generated by ",
  StyleBox["Integrate", "MR"],
  ". "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.3"}],

Cell[CellGroupData[{

Cell["Integrate[1/x + 1/x^2, x]", "Input",
  CellLabel->"In[1]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(\(-\(1\/x\)\) + Log[x]\)], "Output",
  CellLabel->"Out[1]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "This is an equivalent expression that might have been generated if ",
  StyleBox["Integrate", "MR"],
  " worked differently inside. "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.4"}],

Cell[CellGroupData[{

Cell["Together[%]", "Input",
  CellLabel->"In[2]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(\(\(-1\) + x\ Log[x]\)\/x\)], "Output",
  CellLabel->"Out[2]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "In numerical computations, a similar phenomenon occurs. Thus, for example, \
",
  StyleBox["FindRoot", "MR"],
  " gives you a root of a function. But if there are several roots, which \
root is actually returned depends on the details of how ",
  StyleBox["FindRoot", "MR"],
  " works inside. "
}], "Text",
  CellTags->{"S1.12.1", "1.5"}],

Cell[TextData[{
  "This finds a particular root of ",
  Cell[BoxData[
      \(TraditionalForm\`cos \((x)\) + sin \((x)\)\)], "InlineFormula"],
  ". "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.6"}],

Cell[CellGroupData[{

Cell["FindRoot[Cos[x] + Sin[x], {x, 10.5}]", "Input",
  CellLabel->"In[3]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \({x \[Rule] 14.922565101146816`}\)], "Output",
  CellLabel->"Out[3]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell["\<\
With a different starting point, a different root is found. Which \
root is found with each starting point depends in detail on the internal \
algorithm used. \
\>", "MathCaption",
  CellTags->{"S1.12.1", "1.7"}],

Cell[CellGroupData[{

Cell["FindRoot[Cos[x] + Sin[x], {x, 10.8}]", "Input",
  CellLabel->"In[4]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \({x \[Rule] 11.780972450961698`}\)], "Output",
  CellLabel->"Out[4]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "The dependence on the details of internal algorithms can be more \
significant if you push approximate numerical computations to the limits of \
their validity. \nThus, for example, if you give ",
  StyleBox["NIntegrate", "MR"],
  " a pathological integrand, whether it yields a meaningful answer or not \
can depend on the details of the internal algorithm that it uses. "
}], "Text",
  CellTags->{"S1.12.1", "1.8"}],

Cell[TextData[{
  StyleBox["NIntegrate", "MR"],
  " knows that this result is unreliable, and can depend on the details of \
the internal algorithm, so it prints warning messages. "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.9"}],

Cell[CellGroupData[{

Cell["NIntegrate[Sin[1/x], {x, 0, 1}]", "Input",
  CellLabel->"In[5]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(NIntegrate::"slwcon" \(\(:\)\(\ \)\) 
      "Numerical integration converging too slowly; suspect one of the \
following: singularity, value of the integration being 0, oscillatory \
integrand, or insufficient WorkingPrecision. If your integrand is oscillatory \
try using the option Method->Oscillatory in NIntegrate."\)], "Message",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(NIntegrate::"ncvb" \(\(:\)\(\ \)\) 
      "NIntegrate failed to converge to prescribed accuracy after \!\(7\) \
recursive bisections in \!\(x\) near \!\(x\) = \!\(0.0035126778890767337`\)."\
\)], "Message",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(0.5048942747035711`\)], "Output",
  CellLabel->"Out[5]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "Traditional numerical computation systems have tended to follow the idea \
that all computations should yield results that at least nominally have the \
same precision. A consequence of this idea is that it is not sufficient just \
to look at a result to know whether it is accurate; you typically also have \
to analyze the internal algorithm by which the result was found. This fact \
has tended to make people believe that it is always important to know \
internal algorithms for numerical computations. \nBut with the approach that \
",
  StyleBox["Mathematica", "TI"],
  " takes, this is rarely the case. For ",
  StyleBox["Mathematica", "TI"],
  " can usually use its arbitrary\[Hyphen]precision numerical computation \
capabilities to give results where every digit that is generated follows the \
exact mathematical specification of the operation being performed. "
}], "Text",
  CellTags->{"S1.12.1", "1.10"}],

Cell[TextData[{
  "Even though this is an approximate numerical computation, every digit is \
determined by the mathematical definition for ",
  Cell[BoxData[
      \(TraditionalForm\`\[Pi]\)], "InlineFormula"],
  ". "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.11"}],

Cell[CellGroupData[{

Cell["N[Pi, 30]", "Input",
  CellLabel->"In[6]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(3.1415926535897932384626433832795028841971694`30\)], "Output",
  CellLabel->"Out[6]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "Once again, every digit here is determined by the mathematical definition \
for ",
  Cell[BoxData[
      \(TraditionalForm\`sin \((x)\)\)], "InlineFormula"],
  ". "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.12"}],

Cell[CellGroupData[{

Cell["N[Sin[10^50], 20]", "Input",
  CellLabel->"In[7]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(\(-0.78967249342931008271028953991740789168`20\)\)], "Output",
  CellLabel->"Out[7]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "If you use machine\[Hyphen]precision numbers, ",
  StyleBox["Mathematica", "TI"],
  " cannot give a reliable result, and the answer depends on the details of \
the internal algorithm used. "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.13"}],

Cell[CellGroupData[{

Cell["Sin[10.^50]", "Input",
  CellLabel->"In[8]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(0.7052215258133128`\)], "Output",
  CellLabel->"Out[8]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "It is a general characteristic that whenever the results you get can be \
affected by the details of internal algorithms, you should not depend on \
these results. For if nothing else, different versions of ",
  StyleBox["Mathematica", "TI"],
  " may exhibit differences in these results, either because the algorithms \
operate slightly differently on different computer systems, or because \
fundamentally different algorithms are used in versions released at different \
times. "
}], "Text",
  CellTags->{"S1.12.1", "1.14"}],

Cell[TextData[{
  "This is the result for ",
  Cell[BoxData[
      \(TraditionalForm\`sin \((10\^50)\)\)], "InlineFormula"],
  " on one type of computer. "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.15"}],

Cell[CellGroupData[{

Cell["Sin[10.^50]", "Input",
  CellLabel->"In[1]:= ",
  CellTags->"S1.12.1"],

Cell[BoxData[
    \(0.7052215258133128`\)], "Output",
  CellLabel->"Out[1]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell["Here is the same calculation on another type of computer. ", \
"MathCaption",
  CellTags->{"S1.12.1", "1.16"}],

Cell[CellGroupData[{

Cell["Sin[10.^50]", "Input",
  CellLabel->"In[1]:= ",
  CellTags->"S1.12.1"],

Cell["-0.0528229", "Output",
  CellLabel->"Out[1]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "And here is the result obtained in ",
  StyleBox["Mathematica", "TI"],
  " Version 1. "
}], "MathCaption",
  CellTags->{"S1.12.1", "1.17"}],

Cell[CellGroupData[{

Cell["Sin[10.^50]", "Input",
  CellLabel->"In[2]:= ",
  CellTags->"S1.12.1"],

Cell["0.0937538", "Output",
  CellLabel->"Out[2]= ",
  CellTags->"S1.12.1"]
}, Open  ]],

Cell[TextData[{
  "Particularly in more advanced applications of ",
  StyleBox["Mathematica", "TI"],
  ", it may sometimes seem worthwhile to try to analyze internal algorithms \
in order to predict which way of doing a given computation will be the most \
efficient. And there are indeed occasionally major improvements that you will \
be able to make in specific computations as a result of such analyses.   \n\
But most often the analyses will not be worthwhile. For the internals of ",
  StyleBox["Mathematica", "TI"],
  " are quite complicated, and even given a basic description of the \
algorithm used for a particular purpose, it is usually extremely difficult to \
reach a reliable conclusion about how the detailed implementation of this \
algorithm will actually behave in particular circumstances. \nA typical \
problem is that ",
  StyleBox["Mathematica", "TI"],
  " has many internal optimizations, and the efficiency of a computation can \
be greatly affected by whether the details of the computation do or do not \
allow a given internal optimization to be used. "
}], "Text",
  CellTags->{"S1.12.1", "1.18"}],

Cell["1.12.2 Basic Internal Architecture", "Subsection",
  CellTags->{"S1.12.2", "2.1"}],

Cell[BoxData[
    FormBox[
      StyleBox[
        FrameBox[
          StyleBox[GridBox[{
                {"\<\"numbers \"\>", "\<\"sequences of binary digits \"\>"},
                {"\<\"strings \"\>", "\<\"sequences of character code bytes \
or byte pairs \"\>"},
                {"\<\"symbols \"\>", "\<\"pointers to the central table of \
symbols \"\>"},
                {"\<\"general expressions \"\>", "\<\"sequences of pointers \
to the head and elements \"\>"}
                },
              ColumnAlignments->{Right, Left}],
            GridBoxOptions->{RowLines->False}]],
        "2ColumnBox"], TraditionalForm]], "Text",
  CellTags->{"S1.12.2", "2.2"}],

Cell[TextData[{
  "Internal representations used by ",
  StyleBox["Mathematica", "SO"],
  ". "
}], "Caption",
  CellTags->"S1.12.2"],

Cell[TextData[{
  "When you type input into ",
  StyleBox["Mathematica", "TI"],
  ", a data structure is created in the memory of your computer to represent \
the expression you have entered. \nIn general, different pieces of your \
expression will be stored at different places in memory. Thus, for example, \
for a list such as ",
  StyleBox["{2,", "MR"],
  " ",
  StyleBox["x,", "MR"],
  " ",
  StyleBox["y", "MR"],
  " ",
  StyleBox["+", "MR"],
  " ",
  StyleBox["z}", "MR"],
  " the \[OpenCurlyDoubleQuote]backbone\[CloseCurlyDoubleQuote] of the list \
will be stored at one place, while each of the actual elements will be stored \
at a different place. \nThe backbone of the list then consists just of three \
\[OpenCurlyDoubleQuote]pointers\[CloseCurlyDoubleQuote] that specify the \
addresses in computer memory at which the actual expressions that form the \
elements of the list are to be found. These expressions then in turn contain \
pointers to their subexpressions. The chain of pointers ends when one reaches \
an object such as a number or a string, which is stored directly as a pattern \
of bits in computer memory. \nCrucial to the operation of ",
  StyleBox["Mathematica", "TI"],
  " is the notion of symbols such as ",
  StyleBox["x", "MR"],
  ". Whenever ",
  StyleBox["x", "MR"],
  " appears in an expression, ",
  StyleBox["Mathematica", "TI"],
  " represents it by a pointer. But the pointer is always to the same place \
in computer memory\[LongDash]an entry in a central table of all symbols \
defined in your ",
  StyleBox["Mathematica", "TI"],
  " session.  \nThis table is a repository of all information about each \
symbol. It contains a pointer to a string giving the symbol's name, as well \
as pointers to expressions which give rules for evaluating the symbol. "
}], "Text",
  CellTags->{"S1.12.2", "2.3"}],

Cell[BoxData[
    FormBox[
      StyleBox[
        FrameBox[
          StyleBox[GridBox[{
                {"\<\"\[FilledSmallSquare] Recycle memory as soon as the data \
in it is no longer referenced. \"\>"}
                },
              ColumnAlignments->{Left}],
            GridBoxOptions->{RowLines->False}]],
        "1ColumnBox"], TraditionalForm]], "Text",
  CellTags->{"S1.12.2", "2.4"}],

Cell[TextData[{
  "The basic principle of ",
  StyleBox["Mathematica", "SO"],
  " memory management. "
}], "Caption",
  CellTags->"S1.12.2"],

Cell[TextData[{
  "Every piece of memory used by ",
  StyleBox["Mathematica", "TI"],
  " maintains a count of how many pointers currently point to it. When this \
count drops to zero, ",
  StyleBox["Mathematica", "TI"],
  " knows that the piece of memory is no longer being referenced, and \
immediately makes the piece of memory available for something new. \nThis \
strategy essentially ensures that no memory is ever wasted, and that any \
piece of memory that ",
  StyleBox["Mathematica", "TI"],
  " uses is actually storing data that you need to access in your ",
  StyleBox["Mathematica", "TI"],
  " session. "
}], "Text",
  CellTags->{"S1.12.2", "2.5"}],

Cell[BoxData[
    FormBox[
      StyleBox[
        FrameBox[
          StyleBox[GridBox[{
                {"\<\"\[FilledSmallSquare] Create an expression corresponding \
to the input you have given. \"\>"},
                {"\<\"\[FilledSmallSquare] Process the expression using all \
rules known for the objects in it. \"\>"},
                {"\<\"\[FilledSmallSquare] Generate output corresponding to \
the resulting expression. \"\>"}
                },
              ColumnAlignments->{Left}],
            GridBoxOptions->{RowLines->False}]],
        "1ColumnBox"], TraditionalForm]], "Text",
  CellTags->{"S1.12.2", "2.6"}],

Cell[TextData[{
  "The basic actions of ",
  StyleBox["Mathematica", "SO"],
  ". "
}], "Caption",
  CellTags->"S1.12.2"],

Cell[TextData[{
  "At the heart of ",
  StyleBox["Mathematica", "TI"],
  " is a conceptually simple procedure known as the ",
  StyleBox["evaluator", "TI"],
  " which takes every function that appears in an expression and evaluates \
that function. \nWhen the function is one of the thousand or so that are \
built into ",
  StyleBox["Mathematica", "TI"],
  ", what the evaluator does is to execute directly internal code in the ",
  StyleBox["Mathematica", "TI"],
  " system. This code is set up to perform the operations corresponding to \
the function, and then to build a new expression representing the result. "
}], "Text",
  CellTags->{"S1.12.2", "2.7"}],

Cell[BoxData[
    FormBox[
      StyleBox[
        FrameBox[
          StyleBox[GridBox[{
                {"\<\"\[FilledSmallSquare] The built\[Hyphen]in functions of \
\\!\\(\\*StyleBox[\\\"\\\\\\\"Mathematica\\\\\\\"\\\", \\\"TI\\\"]\\) support \
universal computation. \"\>"}
                },
              ColumnAlignments->{Left}],
            GridBoxOptions->{RowLines->False}]],
        "1ColumnBox"], TraditionalForm]], "Text",
  CellTags->{"S1.12.2", "2.8"}],

Cell[TextData[{
  "The basic feature that makes ",
  StyleBox["Mathematica", "SO"],
  " a self\[Hyphen]contained system. "
}], "Caption",
  CellTags->"S1.12.2"],

Cell[TextData[{
  "A crucial feature of the built\[Hyphen]in functions in ",
  StyleBox["Mathematica", "TI"],
  " is that they support ",
  StyleBox["universal computation", "TI"],
  ". What this means is that out of these functions you can construct \
programs that perform absolutely any kinds of operation that are possible for \
a computer. \nAs it turns out, small subsets of ",
  StyleBox["Mathematica", "TI"],
  "'s built\[Hyphen]in functions would be quite sufficient to support \
universal computation. But having the whole collection of functions makes it \
in practice easier to construct the programs one needs. \nThe underlying \
point, however, is that because ",
  StyleBox["Mathematica", "TI"],
  " supports universal computation you never have to modify its \
built\[Hyphen]in functions: all you have to do to perform a particular task \
is to combine these functions in an appropriate way. \nUniversal computation \
is the basis for all standard computer languages. But many of these languages \
rely on the idea of ",
  StyleBox["compilation", "TI"],
  ". If you use C or Fortran, for example, you first write your program, then \
you compile it to generate machine code that can actually be executed on your \
computer.  \n",
  StyleBox["Mathematica", "TI"],
  " does not require you to go through the compilation step: once you have \
input an expression, the functions in the expression can immediately be \
executed. \nOften ",
  StyleBox["Mathematica", "TI"],
  " will preprocess expressions that you enter, arranging things so that \
subsequent execution will be as efficient as possible. But such preprocessing \
never affects the results that are generated, and can rarely be seen \
explicitly. "
}], "Text",
  CellTags->{"S1.12.2", "2.9"}],

Cell[TextData[{
  "1.12.3 The Algorithms of ",
  StyleBox["Mathematica", "SBO"]
}], "Subsection",
  CellTags->{"S1.12.3", "3.1"}],

Cell[TextData[{
  "The built\[Hyphen]in functions of ",
  StyleBox["Mathematica", "TI"],
  " implement a very large number of algorithms from computer science and \
mathematics. Some of these algorithms are fairly old, but the vast majority \
had to be created or at least modified specifically for ",
  StyleBox["Mathematica", "TI"],
  ". Most of the more mathematical algorithms in ",
  StyleBox["Mathematica", "TI"],
  " ultimately carry out operations which at least at some time in the past \
were performed by hand. In almost all cases, however, the algorithms use \
methods very different from those common in hand calculation. \nSymbolic \
integration provides an example. In hand calculation, symbolic integration is \
typically done by a large number of tricks involving changes of variables and \
the like. \nBut in ",
  StyleBox["Mathematica", "TI"],
  " symbolic integration is performed by a fairly small number of very \
systematic procedures. For indefinite integration, the idea of these \
procedures is to find the most general form of the integral, then to \
differentiate this and try to match up undetermined coefficients. \nOften \
this procedure produces at an intermediate stage immensely complicated \
algebraic expressions, and sometimes very sophisticated kinds of mathematical \
functions. But the great advantage of the procedure is that it is completely \
systematic, and its operation requires no special cleverness of the kind that \
only a human could be expected to provide. \nIn having ",
  StyleBox["Mathematica", "TI"],
  " do integrals, therefore, one can be confident that it will systematically \
get results, but one cannot expect that the way these results are derived \
will have much at all to do with the way they would be derived by hand. \nThe \
same is true with most of the mathematical algorithms in ",
  StyleBox["Mathematica", "TI"],
  ". One striking feature is that even for operations that are simple to \
describe, the systematic algorithms to perform these operations in ",
  StyleBox["Mathematica", "TI"],
  " involve fairly advanced mathematical or computational ideas. \nThus, for \
example, factoring a polynomial in ",
  Cell[BoxData[
      \(TraditionalForm\`x\)], "InlineFormula"],
  " is first done modulo a prime such as 17 by finding the null space of a \
matrix obtained by reducing high powers of ",
  Cell[BoxData[
      \(TraditionalForm\`x\)], "InlineFormula"],
  " modulo the prime and the original polynomial. Then factorization over the \
integers is achieved by \
\[OpenCurlyDoubleQuote]lifting\[CloseCurlyDoubleQuote] modulo successive \
powers of the prime using a collection of intricate theorems in algebra and \
analysis.  \nThe use of powerful systematic algorithms is important in making \
the built\[Hyphen]in functions in ",
  StyleBox["Mathematica", "TI"],
  " able to handle difficult and general cases. But for easy cases that may \
be fairly common in practice it is often possible to use simpler and more \
efficient algorithms. \nAs a result, built\[Hyphen]in functions in ",
  StyleBox["Mathematica", "TI"],
  " often have large numbers of extra pieces that handle various kinds of \
special cases. These extra pieces can contribute greatly to the complexity of \
the internal code, often taking what would otherwise be a five\[Hyphen]page \
algorithm and making it hundreds of pages long. \nMost of the algorithms in \
",
  StyleBox["Mathematica", "TI"],
  ", including all their special cases, were explicitly constructed by hand. \
But some algorithms were instead effectively created automatically by \
computer. \nMany of the algorithms used for machine\[Hyphen]precision \
numerical evaluation of mathematical functions are examples. The main parts \
of such algorithms are formulas which are as short as possible but which \
yield the best numerical approximations. \nMost such formulas used in ",
  StyleBox["Mathematica", "TI"],
  " were actually derived by ",
  StyleBox["Mathematica", "TI"],
  " itself. Often many months of computation were required, but the result \
was a short formula that can be used to evaluate functions in an optimal way. \
"
}], "Text",
  CellTags->{"S1.12.3", "3.2"}],

Cell[TextData[{
  "1.12.4 The Software Engineering of ",
  StyleBox["Mathematica", "SBO"]
}], "Subsection",
  CellTags->{"S1.12.4", "4.1"}],

Cell[TextData[{
  StyleBox["Mathematica", "TI"],
  " is one of the more complex software systems ever constructed. Its source \
code is written in a combination of C and ",
  StyleBox["Mathematica", "TI"],
  ", and for Version 4, the code for the kernel consists of about 650,000 \
lines of C and 130,000 lines of ",
  StyleBox["Mathematica", "TI"],
  ". This corresponds to roughly 18 megabytes of data, or some 18,000 printed \
pages.  \nThe C code in ",
  StyleBox["Mathematica", "TI"],
  " is actually written in a custom extension of C which supports certain \
memory management and object\[Hyphen]oriented features. The ",
  StyleBox["Mathematica", "TI"],
  " code is optimized using ",
  StyleBox["Share", "MR"],
  " and ",
  StyleBox["DumpSave", "MR"],
  ". \nIn the ",
  StyleBox["Mathematica", "TI"],
  " kernel the breakdown of different parts of the code is roughly as \
follows: language and system: 30%; numerical computation: 25%; algebraic \
computation: 25%; graphics and kernel output: 20%. \nMost of this code is \
fairly dense and algorithmic: those parts that are in effect simple \
procedures or tables use minimal code since they tend to be written at a \
higher level\[LongDash]often directly in ",
  StyleBox["Mathematica", "TI"],
  ". \nThe source code for the kernel, save a fraction of a percent, is \
identical for all computer systems on which ",
  StyleBox["Mathematica", "TI"],
  " runs. \nFor the front end, however, a significant amount of specialized \
code is needed to support each different type of user interface environment. \
The front end contains about 600,000 lines of system\[Hyphen]independent C \
source code, of which roughly 150,000 lines are concerned with expression \
formatting. Then there are between 50,000 and 100,000 lines of specific code \
customized for each user interface environment. \n",
  StyleBox["Mathematica", "TI"],
  " uses a client\[Hyphen]server model of computing. The front end and kernel \
are connected via ",
  StyleBox["MathLink", "TI"],
  "\[LongDash]the same system as is used to communicate with other programs. \
\nWithin the C code portion of the ",
  StyleBox["Mathematica", "TI"],
  " kernel, modularity and consistency are achieved by having different parts \
communicate primarily by exchanging complete ",
  StyleBox["Mathematica", "TI"],
  " expressions. \nBut it should be noted that even though different parts of \
the system are quite independent at the level of source code, they have many \
algorithmic interdependencies. Thus, for example, it is common for numerical \
functions to make extensive use of algebraic algorithms, or for graphics code \
to use fairly advanced mathematical algorithms embodied in quite different ",
  StyleBox["Mathematica", "TI"],
  " functions. \nSince the beginning of its development in 1986, the effort \
spent directly on creating the source code for ",
  StyleBox["Mathematica", "TI"],
  " is a substantial fraction of a thousand man\[Hyphen]years. In addition, a \
comparable or somewhat larger effort has been spent on testing and \
verification. \nThe source code of ",
  StyleBox["Mathematica", "TI"],
  " has changed greatly since Version 1 was released. The total number of \
lines of code in the kernel grew from 150,000 in Version 1 to 350,000 in \
Version 2, 600,000 in Version 3 and nearly 800,000 in Version 4. In addition, \
at every stage existing code has been revised\[LongDash]so that Version 4 has \
only a few percent of its code in common with Version 1. \nDespite these \
changes in internal code, however, the user\[Hyphen]level design of ",
  StyleBox["Mathematica", "TI"],
  " has remained compatible from Version 1 on. Much functionality has been \
added, but programs created for ",
  StyleBox["Mathematica", "TI"],
  " Version 1 will almost always run absolutely unchanged under Version 4. "
}], "Text",
  CellTags->{"S1.12.4", "4.2"}],

Cell["1.12.5 Testing and Verification", "Subsection",
  CellTags->{"S1.12.5", "5.1"}],

Cell[TextData[{
  "Every version of ",
  StyleBox["Mathematica", "TI"],
  " is subjected to a large amount of testing before it is released. The vast \
majority of this testing is done by an automated system that is written in ",
  StyleBox["Mathematica", "TI"],
  ". \nThe automated system feeds millions of pieces of input to ",
  StyleBox["Mathematica", "TI"],
  ", and checks that the output obtained from them is correct. Often there is \
some subtlety in doing such checking: one must account for different behavior \
of randomized algorithms and for such issues as differences in machine\
\[Hyphen]precision arithmetic on different computers. \nThe test inputs used \
by the automated system are obtained in several ways: "
}], "Text",
  CellTags->{"S1.12.5", "5.2"}],

Cell[TextData[{
  "\[FilledSmallSquare] For every ",
  StyleBox["Mathematica", "TI"],
  " function, inputs are devised that exercise both common and extreme cases. \
 \n\[FilledSmallSquare] Inputs are devised to exercise each feature of the \
internal code.  \n\[FilledSmallSquare] All the examples in this book and in \
other books about ",
  StyleBox["Mathematica", "TI"],
  " are used.  \n\[FilledSmallSquare] Standard numerical tables are optically \
scanned for test inputs.  \n\[FilledSmallSquare] Formulas from all standard \
mathematical tables are entered.  \n\[FilledSmallSquare] Exercises from \
textbooks are entered.  \n\[FilledSmallSquare] For pairs of functions such as \
",
  StyleBox["Integrate", "MR"],
  " and ",
  StyleBox["D", "MR"],
  " or ",
  StyleBox["Factor", "MR"],
  " and ",
  StyleBox["Expand", "MR"],
  ", random expressions are generated and tested.  "
}], "Notes",
  CellTags->{"S1.12.5", "5.3"}],

Cell[TextData[{
  "When tests are run, the automated testing system checks not only the \
results, but also side effects such as messages, as well as memory usage and \
speed. \nThere is also a special instrumented version of ",
  StyleBox["Mathematica", "TI"],
  " which is set up to perform internal consistency tests. This version of ",
  StyleBox["Mathematica", "TI"],
  " runs at a small fraction of the speed of the real ",
  StyleBox["Mathematica", "TI"],
  ", but at every step it checks internal memory consistency, \
interruptibility, and so on. \nThe instrumented version of ",
  StyleBox["Mathematica", "TI"],
  " also records which pieces of ",
  StyleBox["Mathematica", "TI"],
  " source code have been accessed, allowing one to confirm that all of the \
various internal functions in ",
  StyleBox["Mathematica", "TI"],
  " have been exercised by the tests given. \nAll standard ",
  StyleBox["Mathematica", "TI"],
  " tests are routinely run on each version of ",
  StyleBox["Mathematica", "TI"],
  ", on each different computer system. Depending on the speed of the \
computer system, these tests take a few days to a few weeks of computer time. \
\nIn addition, huge numbers of tests based on random inputs are run for the \
equivalent of many years of computer time on a sampling of different computer \
systems. \nEven with all this testing, however, it is inevitable in a system \
as complex as ",
  StyleBox["Mathematica", "TI"],
  " that errors will remain. \nThe standards of correctness for ",
  StyleBox["Mathematica", "TI"],
  " are certainly much higher than for typical mathematical proofs. But just \
as long proofs will inevitably contain errors that go undetected for many \
years, so also a complex software system such as ",
  StyleBox["Mathematica", "TI"],
  " will contain errors that go undetected even after millions of people have \
used it. \nNevertheless, particularly after all the testing that has been \
done on it, the probability that you will actually discover an error in ",
  StyleBox["Mathematica", "TI"],
  " in the course of your work is extremely low. \nDoubtless there will be \
times when ",
  StyleBox["Mathematica", "TI"],
  " does things you do not expect. But you should realize that the \
probabilities are such that it is vastly more likely that there is something \
wrong with your input to ",
  StyleBox["Mathematica", "TI"],
  " or your understanding of what is happening than with the internal code of \
the ",
  StyleBox["Mathematica", "TI"],
  " system itself. \nIf you do believe that you have found a genuine error in \
",
  StyleBox["Mathematica", "TI"],
  ", then you should contact Wolfram Research at the addresses given in the \
front of this book so that the error can be corrected in future versions. "
}], "Text",
  CellTags->{"S1.12.5", "5.4"}]
},
FrontEndVersion->"4.0 for X",
ScreenRectangle->{{0, 800}, {0, 600}},
WindowSize->{520, 455},
WindowMargins->{{140, Automatic}, {Automatic, 72}},
StyleDefinitions -> "HelpBrowser.nb"
]


(***********************************************************************
Cached data follows.  If you edit this Notebook file directly, not using
Mathematica, you must remove the line containing CacheID at the top of 
the file.  The cache data will then be recreated when you save this file 
from within Mathematica.
***********************************************************************)

(*CellTagsOutline
CellTagsIndex->{
  "S1.12.0"->{
    Cell[1717, 49, 138, 4, 70, "Section",
      CellTags->{"S1.12.0", "0.1"}]},
  "0.1"->{
    Cell[1717, 49, 138, 4, 70, "Section",
      CellTags->{"S1.12.0", "0.1"}]},
  "S1.12.1"->{
    Cell[1858, 55, 114, 2, 70, "Subsection",
      CellTags->{"S1.12.1", "1.1"}],
    Cell[1975, 59, 2893, 69, 70, "Text",
      CellTags->{"S1.12.1", "1.2"}],
    Cell[4871, 130, 142, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.3"}],
    Cell[5038, 139, 90, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[5131, 143, 104, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[5250, 149, 203, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.4"}],
    Cell[5478, 158, 76, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[5557, 162, 107, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[5679, 168, 357, 9, 70, "Text",
      CellTags->{"S1.12.1", "1.5"}],
    Cell[6039, 179, 200, 6, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.6"}],
    Cell[6264, 189, 101, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[6368, 193, 113, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[6496, 199, 222, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.7"}],
    Cell[6743, 208, 101, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[6847, 212, 113, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[6975, 218, 436, 8, 70, "Text",
      CellTags->{"S1.12.1", "1.8"}],
    Cell[7414, 228, 232, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.9"}],
    Cell[7671, 237, 96, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[7770, 241, 377, 6, 70, "Message",
      CellTags->"S1.12.1"],
    Cell[8150, 249, 249, 5, 70, "Message",
      CellTags->"S1.12.1"],
    Cell[8402, 256, 101, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[8518, 262, 937, 16, 70, "Text",
      CellTags->{"S1.12.1", "1.10"}],
    Cell[9458, 280, 270, 7, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.11"}],
    Cell[9753, 291, 74, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[9830, 295, 130, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[9975, 301, 235, 7, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.12"}],
    Cell[10235, 312, 82, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[10320, 316, 130, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[10465, 322, 261, 6, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.13"}],
    Cell[10751, 332, 76, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[10830, 336, 101, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[10946, 342, 546, 10, 70, "Text",
      CellTags->{"S1.12.1", "1.14"}],
    Cell[11495, 354, 207, 6, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.15"}],
    Cell[11727, 364, 76, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[11806, 368, 101, 3, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[11922, 374, 116, 2, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.16"}],
    Cell[12063, 380, 76, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[12142, 384, 76, 2, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[12233, 389, 158, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.17"}],
    Cell[12416, 398, 76, 2, 70, "Input",
      CellTags->"S1.12.1"],
    Cell[12495, 402, 75, 2, 70, "Output",
      CellTags->"S1.12.1"],
    Cell[12585, 407, 1126, 19, 70, "Text",
      CellTags->{"S1.12.1", "1.18"}]},
  "1.1"->{
    Cell[1858, 55, 114, 2, 70, "Subsection",
      CellTags->{"S1.12.1", "1.1"}]},
  "1.2"->{
    Cell[1975, 59, 2893, 69, 70, "Text",
      CellTags->{"S1.12.1", "1.2"}]},
  "1.3"->{
    Cell[4871, 130, 142, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.3"}]},
  "1.4"->{
    Cell[5250, 149, 203, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.4"}]},
  "1.5"->{
    Cell[5679, 168, 357, 9, 70, "Text",
      CellTags->{"S1.12.1", "1.5"}]},
  "1.6"->{
    Cell[6039, 179, 200, 6, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.6"}]},
  "1.7"->{
    Cell[6496, 199, 222, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.7"}]},
  "1.8"->{
    Cell[6975, 218, 436, 8, 70, "Text",
      CellTags->{"S1.12.1", "1.8"}]},
  "1.9"->{
    Cell[7414, 228, 232, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.9"}]},
  "1.10"->{
    Cell[8518, 262, 937, 16, 70, "Text",
      CellTags->{"S1.12.1", "1.10"}]},
  "1.11"->{
    Cell[9458, 280, 270, 7, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.11"}]},
  "1.12"->{
    Cell[9975, 301, 235, 7, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.12"}]},
  "1.13"->{
    Cell[10465, 322, 261, 6, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.13"}]},
  "1.14"->{
    Cell[10946, 342, 546, 10, 70, "Text",
      CellTags->{"S1.12.1", "1.14"}]},
  "1.15"->{
    Cell[11495, 354, 207, 6, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.15"}]},
  "1.16"->{
    Cell[11922, 374, 116, 2, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.16"}]},
  "1.17"->{
    Cell[12233, 389, 158, 5, 70, "MathCaption",
      CellTags->{"S1.12.1", "1.17"}]},
  "1.18"->{
    Cell[12585, 407, 1126, 19, 70, "Text",
      CellTags->{"S1.12.1", "1.18"}]},
  "S1.12.2"->{
    Cell[13714, 428, 88, 1, 70, "Subsection",
      CellTags->{"S1.12.2", "2.1"}],
    Cell[13805, 431, 667, 16, 70, "Text",
      CellTags->{"S1.12.2", "2.2"}],
    Cell[14475, 449, 132, 5, 70, "Caption",
      CellTags->"S1.12.2"],
    Cell[14610, 456, 1844, 40, 70, "Text",
      CellTags->{"S1.12.2", "2.3"}],
    Cell[16457, 498, 398, 11, 70, "Text",
      CellTags->{"S1.12.2", "2.4"}],
    Cell[16858, 511, 140, 5, 70, "Caption",
      CellTags->"S1.12.2"],
    Cell[17001, 518, 660, 15, 70, "Text",
      CellTags->{"S1.12.2", "2.5"}],
    Cell[17664, 535, 629, 15, 70, "Text",
      CellTags->{"S1.12.2", "2.6"}],
    Cell[18296, 552, 120, 5, 70, "Caption",
      CellTags->"S1.12.2"],
    Cell[18419, 559, 661, 14, 70, "Text",
      CellTags->{"S1.12.2", "2.7"}],
    Cell[19083, 575, 469, 12, 70, "Text",
      CellTags->{"S1.12.2", "2.8"}],
    Cell[19555, 589, 160, 5, 70, "Caption",
      CellTags->"S1.12.2"],
    Cell[19718, 596, 1767, 33, 70, "Text",
      CellTags->{"S1.12.2", "2.9"}]},
  "2.1"->{
    Cell[13714, 428, 88, 1, 70, "Subsection",
      CellTags->{"S1.12.2", "2.1"}]},
  "2.2"->{
    Cell[13805, 431, 667, 16, 70, "Text",
      CellTags->{"S1.12.2", "2.2"}]},
  "2.3"->{
    Cell[14610, 456, 1844, 40, 70, "Text",
      CellTags->{"S1.12.2", "2.3"}]},
  "2.4"->{
    Cell[16457, 498, 398, 11, 70, "Text",
      CellTags->{"S1.12.2", "2.4"}]},
  "2.5"->{
    Cell[17001, 518, 660, 15, 70, "Text",
      CellTags->{"S1.12.2", "2.5"}]},
  "2.6"->{
    Cell[17664, 535, 629, 15, 70, "Text",
      CellTags->{"S1.12.2", "2.6"}]},
  "2.7"->{
    Cell[18419, 559, 661, 14, 70, "Text",
      CellTags->{"S1.12.2", "2.7"}]},
  "2.8"->{
    Cell[19083, 575, 469, 12, 70, "Text",
      CellTags->{"S1.12.2", "2.8"}]},
  "2.9"->{
    Cell[19718, 596, 1767, 33, 70, "Text",
      CellTags->{"S1.12.2", "2.9"}]},
  "S1.12.3"->{
    Cell[21488, 631, 129, 4, 70, "Subsection",
      CellTags->{"S1.12.3", "3.1"}],
    Cell[21620, 637, 4197, 72, 70, "Text",
      CellTags->{"S1.12.3", "3.2"}]},
  "3.1"->{
    Cell[21488, 631, 129, 4, 70, "Subsection",
      CellTags->{"S1.12.3", "3.1"}]},
  "3.2"->{
    Cell[21620, 637, 4197, 72, 70, "Text",
      CellTags->{"S1.12.3", "3.2"}]},
  "S1.12.4"->{
    Cell[25820, 711, 139, 4, 70, "Subsection",
      CellTags->{"S1.12.4", "4.1"}],
    Cell[25962, 717, 3892, 71, 70, "Text",
      CellTags->{"S1.12.4", "4.2"}]},
  "4.1"->{
    Cell[25820, 711, 139, 4, 70, "Subsection",
      CellTags->{"S1.12.4", "4.1"}]},
  "4.2"->{
    Cell[25962, 717, 3892, 71, 70, "Text",
      CellTags->{"S1.12.4", "4.2"}]},
  "S1.12.5"->{
    Cell[29857, 790, 85, 1, 70, "Subsection",
      CellTags->{"S1.12.5", "5.1"}],
    Cell[29945, 793, 774, 14, 70, "Text",
      CellTags->{"S1.12.5", "5.2"}],
    Cell[30722, 809, 929, 22, 70, "Notes",
      CellTags->{"S1.12.5", "5.3"}],
    Cell[31654, 833, 2822, 54, 70, "Text",
      CellTags->{"S1.12.5", "5.4"}]},
  "5.1"->{
    Cell[29857, 790, 85, 1, 70, "Subsection",
      CellTags->{"S1.12.5", "5.1"}]},
  "5.2"->{
    Cell[29945, 793, 774, 14, 70, "Text",
      CellTags->{"S1.12.5", "5.2"}]},
  "5.3"->{
    Cell[30722, 809, 929, 22, 70, "Notes",
      CellTags->{"S1.12.5", "5.3"}]},
  "5.4"->{
    Cell[31654, 833, 2822, 54, 70, "Text",
      CellTags->{"S1.12.5", "5.4"}]}
  }
*)

(*CellTagsIndex
CellTagsIndex->{
  {"S1.12.0", 35105, 906},
  {"0.1", 35196, 909},
  {"S1.12.1", 35291, 912},
  {"1.1", 38461, 997},
  {"1.2", 38555, 1000},
  {"1.3", 38645, 1003},
  {"1.4", 38741, 1006},
  {"1.5", 38837, 1009},
  {"1.6", 38926, 1012},
  {"1.7", 39022, 1015},
  {"1.8", 39118, 1018},
  {"1.9", 39207, 1021},
  {"1.10", 39304, 1024},
  {"1.11", 39396, 1027},
  {"1.12", 39494, 1030},
  {"1.13", 39592, 1033},
  {"1.14", 39691, 1036},
  {"1.15", 39784, 1039},
  {"1.16", 39883, 1042},
  {"1.17", 39982, 1045},
  {"1.18", 40081, 1048},
  {"S1.12.2", 40178, 1051},
  {"2.1", 41195, 1078},
  {"2.2", 41290, 1081},
  {"2.3", 41381, 1084},
  {"2.4", 41473, 1087},
  {"2.5", 41564, 1090},
  {"2.6", 41655, 1093},
  {"2.7", 41746, 1096},
  {"2.8", 41837, 1099},
  {"2.9", 41928, 1102},
  {"S1.12.3", 42024, 1105},
  {"3.1", 42200, 1110},
  {"3.2", 42296, 1113},
  {"S1.12.4", 42392, 1116},
  {"4.1", 42568, 1121},
  {"4.2", 42664, 1124},
  {"S1.12.5", 42760, 1127},
  {"5.1", 43094, 1136},
  {"5.2", 43189, 1139},
  {"5.3", 43280, 1142},
  {"5.4", 43372, 1145}
  }
*)

(*NotebookFileOutline
Notebook[{
Cell[1717, 49, 138, 4, 70, "Section",
  CellTags->{"S1.12.0", "0.1"}],
Cell[1858, 55, 114, 2, 70, "Subsection",
  CellTags->{"S1.12.1", "1.1"}],
Cell[1975, 59, 2893, 69, 70, "Text",
  CellTags->{"S1.12.1", "1.2"}],
Cell[4871, 130, 142, 5, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.3"}],

Cell[CellGroupData[{
Cell[5038, 139, 90, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[5131, 143, 104, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[5250, 149, 203, 5, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.4"}],

Cell[CellGroupData[{
Cell[5478, 158, 76, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[5557, 162, 107, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[5679, 168, 357, 9, 70, "Text",
  CellTags->{"S1.12.1", "1.5"}],
Cell[6039, 179, 200, 6, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.6"}],

Cell[CellGroupData[{
Cell[6264, 189, 101, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[6368, 193, 113, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[6496, 199, 222, 5, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.7"}],

Cell[CellGroupData[{
Cell[6743, 208, 101, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[6847, 212, 113, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[6975, 218, 436, 8, 70, "Text",
  CellTags->{"S1.12.1", "1.8"}],
Cell[7414, 228, 232, 5, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.9"}],

Cell[CellGroupData[{
Cell[7671, 237, 96, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[7770, 241, 377, 6, 70, "Message",
  CellTags->"S1.12.1"],
Cell[8150, 249, 249, 5, 70, "Message",
  CellTags->"S1.12.1"],
Cell[8402, 256, 101, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[8518, 262, 937, 16, 70, "Text",
  CellTags->{"S1.12.1", "1.10"}],
Cell[9458, 280, 270, 7, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.11"}],

Cell[CellGroupData[{
Cell[9753, 291, 74, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[9830, 295, 130, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[9975, 301, 235, 7, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.12"}],

Cell[CellGroupData[{
Cell[10235, 312, 82, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[10320, 316, 130, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[10465, 322, 261, 6, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.13"}],

Cell[CellGroupData[{
Cell[10751, 332, 76, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[10830, 336, 101, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[10946, 342, 546, 10, 70, "Text",
  CellTags->{"S1.12.1", "1.14"}],
Cell[11495, 354, 207, 6, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.15"}],

Cell[CellGroupData[{
Cell[11727, 364, 76, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[11806, 368, 101, 3, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[11922, 374, 116, 2, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.16"}],

Cell[CellGroupData[{
Cell[12063, 380, 76, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[12142, 384, 76, 2, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[12233, 389, 158, 5, 70, "MathCaption",
  CellTags->{"S1.12.1", "1.17"}],

Cell[CellGroupData[{
Cell[12416, 398, 76, 2, 70, "Input",
  CellTags->"S1.12.1"],
Cell[12495, 402, 75, 2, 70, "Output",
  CellTags->"S1.12.1"]
}, Open  ]],
Cell[12585, 407, 1126, 19, 70, "Text",
  CellTags->{"S1.12.1", "1.18"}],
Cell[13714, 428, 88, 1, 70, "Subsection",
  CellTags->{"S1.12.2", "2.1"}],
Cell[13805, 431, 667, 16, 70, "Text",
  CellTags->{"S1.12.2", "2.2"}],
Cell[14475, 449, 132, 5, 70, "Caption",
  CellTags->"S1.12.2"],
Cell[14610, 456, 1844, 40, 70, "Text",
  CellTags->{"S1.12.2", "2.3"}],
Cell[16457, 498, 398, 11, 70, "Text",
  CellTags->{"S1.12.2", "2.4"}],
Cell[16858, 511, 140, 5, 70, "Caption",
  CellTags->"S1.12.2"],
Cell[17001, 518, 660, 15, 70, "Text",
  CellTags->{"S1.12.2", "2.5"}],
Cell[17664, 535, 629, 15, 70, "Text",
  CellTags->{"S1.12.2", "2.6"}],
Cell[18296, 552, 120, 5, 70, "Caption",
  CellTags->"S1.12.2"],
Cell[18419, 559, 661, 14, 70, "Text",
  CellTags->{"S1.12.2", "2.7"}],
Cell[19083, 575, 469, 12, 70, "Text",
  CellTags->{"S1.12.2", "2.8"}],
Cell[19555, 589, 160, 5, 70, "Caption",
  CellTags->"S1.12.2"],
Cell[19718, 596, 1767, 33, 70, "Text",
  CellTags->{"S1.12.2", "2.9"}],
Cell[21488, 631, 129, 4, 70, "Subsection",
  CellTags->{"S1.12.3", "3.1"}],
Cell[21620, 637, 4197, 72, 70, "Text",
  CellTags->{"S1.12.3", "3.2"}],
Cell[25820, 711, 139, 4, 70, "Subsection",
  CellTags->{"S1.12.4", "4.1"}],
Cell[25962, 717, 3892, 71, 70, "Text",
  CellTags->{"S1.12.4", "4.2"}],
Cell[29857, 790, 85, 1, 70, "Subsection",
  CellTags->{"S1.12.5", "5.1"}],
Cell[29945, 793, 774, 14, 70, "Text",
  CellTags->{"S1.12.5", "5.2"}],
Cell[30722, 809, 929, 22, 70, "Notes",
  CellTags->{"S1.12.5", "5.3"}],
Cell[31654, 833, 2822, 54, 70, "Text",
  CellTags->{"S1.12.5", "5.4"}]
}
]
*)




(***********************************************************************
End of Mathematica Notebook file.
***********************************************************************)

