\documentclass{article}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{slide-article-tom}
\ifx\pdfoutput\undefined
     \usepackage[dvips]{graphicx}
\else
     \usepackage[pdftex]{graphicx}
     \pdfcompresslevel9

\fi

\usepackage{hyperref}

\hypersetup{colorlinks,
            linkcolor=blue,
            %pdfpagemode=FullScreen
            pdfpagemode=None
            }



\def\pagedone{\newpage}

\def\tthdump#1{#1}

\tthdump{\def\sectionhead#1{\begin{center}{\LARGE\hypertarget{#1}
     {#1}\hyperlink{Our general topics:}{\hfil$\leftarrow$}}\end{center}}}
     
%%tth:\def\sectionhead#1{{\LARGE#1\hypertarget{#1}{#1}}
%%tth:     \special{html: <A NAME="#1"></A><a href="\#Top of file">       Top</a>}}

\tthdump{\def\quotesection#1{\begin{center}{\LARGE\hypertarget{#1}
     {#1}\hyperlink{The quotes}{\hfil$\twoheadleftarrow$}}\end{center}}}
     
%%tth:\def\quotesection#1{{\LARGE#1\hypertarget{#1}{#1}}
%%tth:     \special{html: <A NAME="#1"></A><a href="\#The quotes">       <-</a>}}

%%tth:\def\makehyperlink#1{\special{html: <a href="\##1">}{\large#1}\special{html: </a>}}

%%tth:\def\binom#1#2{\left(\begin{array}{c}#1\\#2\end{array}\right)}

%\def\sectionhead#1{\begin{center}{\LARGE #1}\end{center}}
%\def\sectionhead#1{\section{#1}}

% defines a 2 element column vector.
\def\col#1#2{\left(\begin{array}{c}#1\\#2\end{array}\right)}
\def\tcol#1#2{(#1, #2)^T}

\def\naturals{\mathbb{N}}

\begin{document}
\raggedright
%%tth:\special{html: <A NAME="Top of file"></A>}

\pagestyle{myfooters}
%\pagestyle{plain}

\thispagestyle{empty}


%%tth:\special{html:<title> Introduction to theory of computation</title>}

%Slide 1
\title{{\LARGE\bf Introduction to theory of computation}\newline \newline \newline}
\author{Tom Carter
\newline
\newline
\newline
\tthdump{\href{http://cogs.csustan.edu/\~tom/SFI-CSSS}
     {http://cogs.csustan.edu/\~\ tom/SFI-CSSS}}
%%tth:\href{http://cogs.csustan.edu/~tom/SFI-CSSS}{http://cogs.csustan.edu/\~tom/SFI-CSSS}
\vfill
Complex Systems Summer School
\newline
}
\date{June, 2002}
\maketitle

%Slide 2
\sectionhead{Our general topics:}
%%tth:\begin{itemize}
%%tth:\item
\tthdump{\hyperlink{Symbols, strings and languages}
               {\ $\circledcirc$ Symbols, strings and languages\newline}}
%%tth:\makehyperlink{Symbols, strings and languages}
%%tth:\item
\tthdump{\hyperlink{Finite automata}
	        {$\circledcirc$ Finite automata\newline}} 
%%tth:\makehyperlink{Finite automata}
%%tth:\item
\tthdump{\hyperlink{Regular expressions and languages}
	        {$\circledcirc$ Regular expressions and languages\newline}} 
%%tth:\makehyperlink{Regular expressions and languages}
%%tth:\item
\tthdump{\hyperlink{Markov models}
	        {$\circledcirc$ Markov models\newline}} 
%%tth:\makehyperlink{Markov models}
%%tth:\item
\tthdump{\hyperlink{Context free grammars and languages}
	        {$\circledcirc$ Context free grammars and languages\newline}} 
%%tth:\makehyperlink{Context free grammars and languages}
%%tth:\item
 \tthdump{\hyperlink{Language generators and recognizers}
	         {$\circledcirc$ Language generators and recognizers\newline}} 
%%tth:\makehyperlink{Language generators and recognizers}
%%tth:\item
\tthdump{\hyperlink{The Chomsky hierarchy}
	         {$\circledcirc$ The Chomsky hierarchy\newline}} 
%%tth:\makehyperlink{The Chomsky hierarchy}
%%tth:\item
 \tthdump{\hyperlink{Turing machines}
	         {$\circledcirc$ Turing machines\newline}} 
%%tth:\makehyperlink{Turing machines}
%%tth:\item
\tthdump{\hyperlink{Computability and tractability}
	         {$\circledcirc$ Computability and tractability\newline}} 
%%tth:\makehyperlink{Computability and tractability}
%%tth:\item
\tthdump{\hyperlink{Computational complexity}
	         {$\circledcirc$ Computational complexity\newline}} 
%%tth:\makehyperlink{Computational complexity}
%%tth:\item
\tthdump{\hyperlink{References}
	        {$\circledcirc$ References\newline}} 
%%tth:\makehyperlink{References}
%%tth:\end{itemize}

\pagedone

%%  \quotesection{The quotes}
%%  %%tth:\begin{itemize}
%%  
%%  %%tth:\item
%%  \tthdump{\hyperlink{Science, wisdom, and counting}
%%                 {\ $\circledcirc$ Science, wisdom, and counting\newline}}
%%  %%tth:\makehyperlink{Science, wisdom, and counting}
%%  %%tth:\item
%%  	 \tthdump{\hyperlink{Being different -- or random}
%%  	        {$\circledcirc$ Being different -- or random\newline}}
%%  %%tth:\makehyperlink{Being different -- or random}
%%  %%tth:\item
%%  	 \tthdump{\hyperlink{Surprise, information, and miracles}
%%  	        {$\circledcirc$ Surprise, information, and miracles\newline}}
%%  %%tth:\makehyperlink{Surprise, information, and miracles}
%%  %%tth:\item
%%  	 \tthdump{\hyperlink{Information (and hope)}
%%  	        {$\circledcirc$ Information (and hope)\newline}}
%%  %%tth:\makehyperlink{Information (and hope)}
%%  %%tth:\item
%%  	 \tthdump{\hyperlink{H (or S) for Entropy}
%%  	         {$\circledcirc$ H (or S) for Entropy\newline}}
%%  %%tth:\makehyperlink{H (or S) for Entropy}
%%  %%tth:\item
%%   	 \tthdump{\hyperlink{Thermodynamics}
%%  	         {$\circledcirc$ Thermodynamics\newline}}
%%  %%tth:\makehyperlink{Thermodynamics}
%%  %%tth:\item
%%  	 \tthdump{\hyperlink{Language, and putting things together}
%%  	         {$\circledcirc$ Language, and putting things together\newline}}
%%  %%tth:\makehyperlink{Language, and putting things together}
%%  %%tth:\item
%%  	 \tthdump{\hyperlink{Tools}
%%  	         {$\circledcirc$ Tools}}
%%  %%tth:\makehyperlink{Tools}

%%  %%tth:\end{itemize}
%%  %\thepage
%%  \pagedone

%Slide 3

\sectionhead{Introduction}

What follows is an extremely abbreviated look at some of the important ideas
of the general areas of automata theory, computability, and formal languages.
In various respects, this can be thought of as the elementary foundations of
much of computer science.  It also includes a wide variety of tools, and
general categories of tools \ldots

\pagedone

\sectionhead{Symbols, strings and languages}

\begin{itemize}
       \item The classical theory of computation traditionally deals with processing
           an input string of symbols into an output string of symbols.  Note that
           in the special case where the set of possible output strings is just
           \{`yes', `no'\}, (often abbreviated \{T, F\} or \{1, 0\}), then we can
           think of the string processing as string (pattern) recognition.
           
           We should start with a few definitions.  The first step is to avoid
           defining the term `symbol' -- this leaves an open slot to connect the
           abstract theory to the world \ldots
           
%% \pagedone
           We define:
           \begin{enumerate}
                \item An {\em alphabet} is a finite set of symbols.
                \item A {\em string} over an alphabet ${\mathrm A}$ is
                     a finite ordered sequence of symbols from
                     ${\mathrm A}$.  Note that repetitions are allowed.
                     The length of a string is the number of symbols in
                     the string, with repetitions counted.  (e.g.,
                     $\vert \mathrm{aabbcc} \vert\ =\ 6$)
                \item The empty string, denoted by $\epsilon$, is the (unique)
                     string of length zero.  Note that the empty string $\epsilon$
                     is not the same as the empty set $\emptyset$.
                \item If $\mathrm{S}$ and $\mathrm{T}$ are sets of strings,
                     then $\mathrm{ST} = \{xy \vert\ x \in \mathrm{S\ and\ }
                     y \in \mathrm{T}\}$ 
                \item Given an alphabet $\mathrm{A}$, we define
                  \begin{eqnarray*}
                     \mathrm{A}^0 & = & \{\epsilon\}\\
                     \mathrm{A}^{n+1} & = & \mathrm{AA}^n\\
                     \mathrm{A}^* & = & \bigcup_{n=0}^\infty\ \mathrm{A}^n
                  \end{eqnarray*}
                \item A {\em language} $\mathrm{L}$ over an alphabet $\mathrm{A}$ is
                     a subset of $\mathrm{A}^*$.  That is, $\mathrm{L} \subset
                     \mathrm{A}^*$.
           \end{enumerate}

\pagedone

       \item We can define the natural numbers, $\naturals$, as follows:
       
          We let
            \begin{eqnarray*}
                 0 & = & \emptyset\\
                 1 & = & \{\emptyset\}\\
                 2 & = & \{\emptyset, \{\emptyset\}\}\\
                 \mathrm{and} & \mathrm{in} & \mathrm{general}\\
                 n+1 & = & \{0, 1, 2, \ldots , n\}.\\
                 \mathrm{Then} & &\\
                 \naturals & = & \{0, 1, 2, \ldots\}.
            \end{eqnarray*}

       \item Sizes of sets and countability:
           \begin{enumerate}
                \item Given two sets $\mathrm{S}$ and $\mathrm{T}$, we say that
                   they are the same size ($\vert \mathrm{S} \vert\ =\ \vert
                      \mathrm{T} \vert$)
                   if there is a one-to-one onto function $f:\ \mathrm{S} \to \mathrm{T}$.
                \item We write $\vert \mathrm{S} \vert\ \le\ \vert \mathrm{T}\vert$
                   if there is a one-to-one (not necessarily onto) function
                   $f:\ \mathrm{S} \to \mathrm{T}$.
                \item We write $\vert \mathrm{S} \vert\ <\ \vert \mathrm{T} \vert$
                   if there is a one-to-one function $f:\ \mathrm{S} \to \mathrm{T}$,
                   but there does not exist any such onto function.
                \item We call a set $\mathrm{S}$
                   \begin{enumerate}
                      \item Finite if $\vert \mathrm{S} \vert < \vert \naturals \vert$
                      \item Countable if $\vert \mathrm{S} \vert \le
                           \vert \naturals \vert$
                      \item Countably infinite if $\vert \mathrm{S} \vert =
                           \vert \naturals \vert$
                      \item Uncountable if $\vert \naturals \vert <
                           \vert \mathrm{S} \vert$.
                   \end{enumerate}
                \item Some examples:
                   \begin{enumerate}
                      \item The set of integers $\mathbb{Z} = \{0, 1, -1, 2, -2, \ldots\}$
                         is countable.
                      \item The set of rational numbers $\mathbb{Q} = \{p/q\ \vert\ 
                         p,q \in \mathbb{Z}, q \ne 0\}$ is countable.
                      \item If $\mathrm{S}$ is countable, then so is $\mathrm{SxS}$,
                         the cartesian product of $\mathrm{S}$ with itself, and in general
                         so is $\mathrm{S}^n$ for any $n < \infty$.
                      \item For any nonempty alphabet $\mathrm{A}$, $\mathrm{A}^*$
                         is countably infinite.
                   \end{enumerate}
                   
                   Exercise:  Verify each of these statements.
                \item Recall that the {\em power set} of a set $\mathrm{S}$ is
                   the set of all subsets of $\mathrm{S}$:
                   $$\mathit{P}(\mathrm{S}) = \{\mathrm{T}\ \vert\ 
                          \mathrm{T} \subset \mathrm{S}\}.$$
                   We then have the fact that for any set $\mathrm{S}$,
                   $$\vert \mathrm{S} \vert < \vert \mathit{P}(\mathrm{S}) \vert.$$
                   
                   Pf:  First, it is easy to see that
                   $$\vert \mathrm{S} \vert \le \vert \mathit{P}(\mathrm{S})\vert$$
                   since there is the one-to-one function $f : \mathrm{S} \to 
                   \mathit{P}(\mathrm{S})$ given by $f(s) = \{s\}$ for
                   $s \in \mathrm{S}$.
                   
                   On the other hand, no function $f : \mathrm{S} \to
                   \mathit{P}(\mathrm{S})$ can be onto.  To show this, we need to
                   exhibit an element of $\mathit{P}(\mathrm{S})$ that is not in
                   the image of $f$.  For any given $f$, such an element (which must
                   be a subset of $\mathrm{S}$) is
                   $$\mathrm{R}_f = \{x \in \mathrm{S}\ \vert\ x \notin f(x)\}.$$
                   Now suppose, for contradiction, that there is some $s \in \mathrm{S}$
                   with $f(s) = \mathrm{R}_f$.  There are then two possibilities:
                   either $s \in f(s) = \mathrm{R}_f$ or $s \notin f(s) = \mathrm{R}_f$.
                   Each of these lead to a contradiction:
                   
                   If $s \in f(s) = \mathrm{R}_f$, then by the definition of
                   $\mathrm{R}_f$, $s \notin f(s)$.  This is a contradiction.
                   
                   If $s \notin f(s) = \mathrm{R}_f$, then by the definition of
                   $\mathrm{R}_f$, $s \in \mathrm{R}_f = f(s)$.  Again, a contradiction.
                   
                   Since each case leads to a contradiction, no such $s$ can exist, and
                   hence $f$ is not onto.  QED
           \end{enumerate}
\pagedone

       \item From this, we can conclude for any countably infinite set $\mathrm{S}$,
           $\mathit{P}(\mathrm{S})$ is uncountable.  Thus, for example,
           $\mathit{P}(\naturals)$ is uncountable.  It is not hard to see that
           the set of real numbers, $\mathbb{R}$, is the same size as
           $\mathit{P}(\naturals)$, and is therefore uncountable.
           
           Exercise:  Show this.  (Hint:  show that $\mathbb{R}$ is the same size
           as $(0,1) = \{x \in \mathbb{R}\ \vert\ 0 < x < 1\}$, and then use the
           binary representation of real numbers to show that
           $\vert \mathit{P}(\naturals) \vert = \vert (0,1) \vert$.
           
       \item We can also derive a fundamental (non)computability fact:
       
           There are languages that cannot be recognized by any computation.  In
           other words, there are languages for which there cannot exist any computer
           algorithm to determine whether an arbitrary string is in the language or not.
           
           To see this, we will take as given that any computer algorithm can be
           expressed as a computer program, and hence, in particular, can be
           expressed as a finite string of ascii characters.  Therefore, since
           $\mathrm{ASCII}^*$ is countably infinite, there are at most countably
           many computer algorithms/programs.  On the other hand,
           since a language is any arbitrary subset of $\mathrm{A}^*$ for some
           alphabet $\mathrm{A}$, there are uncountably many languages, since
           there are uncountably many subsets.
            
\end{itemize}
\pagedone

%%  \quotesection{Being different -- or random}
%%  %%tth:\begin{quote}
%%  ``The man who follows the crowd will usually get no further than the crowd. The man
%%   who walks alone is likely to find himself in places no one has ever been before.
%%   Creativity
%%   in living is not without its attendant difficulties, for peculiarity breeds contempt.
%%   And the unfortunate thing about being ahead of your time is that when people finally
%%   realize you were right, they'll say it was obvious all along. You have two choices in
%%   life: You can dissolve into the mainstream, or you can be distinct. To be distinct is
%%   to be different. To be different, you must strive to be what no one else but you can
%%   be. ''
%%  
%%   -Alan Ashley-Pitt
%%   
%%  
%%   ``Anyone who considers arithmetical methods of producing random digits is, of course, in a state of sin.''
%%    
%%        - John von Neumann (1903-1957) 
%%  %%tth:\end{quote}
%%   
%%   \pagedone
  
\sectionhead{Finite automata}

\begin{itemize}
	\item This will be a quick tour through some of the basics of the abstract theory
	     of computation.  We will start with a relatively straightforward class of
	     machines and languages -- deterministic finite automata and regular languages.
	     
	     In this context when we talk about a machine, we mean an abstract rather
	     than a physical machine, and in general will think in terms of a computer
	     algorithm that could be implemented in a physical machine.  Our descriptions
	     of machines will be abstract, but are intended to be sufficiently precise
	     that an implementation could be developed.

\pagedone

	\item A deterministic finite automaton (DFA) $\mathrm{M} = (\mathrm{S}, \mathrm{A},
         s_0, \delta, \mathrm{F})$ consists of the following:
	     \begin{description}
	        \item $\mathrm{S}$, a finite set of states,
	        \item $\mathrm{A}$, an alphabet,
	        \item $s_0 \in \mathrm{S}$, the start state,
	        \item $\delta : \mathrm{S} \mathrm{x} \mathrm{A} \to \mathrm{S}$,
	            the transition function, and
	        \item $\mathrm{F} \subset \mathrm{S}$, the set of final (or accepting)
	            states of the machine.
	     \end{description}
	     
	     We think in terms of feeding strings from $\mathrm{A}^*$ into the machine. 
         To do this, we extend the transition function to a function
         $$\hat{\delta} : \mathrm{S} \mathrm{x} \mathrm{A}^* \to \mathrm{S}$$
         by
         \begin{eqnarray*}
             \hat{\delta}(s, \epsilon) & = & s,\\
             \hat{\delta}(s, xa) & = & \hat{\delta}(\delta(s, a), x).
         \end{eqnarray*}
         
         We can then define the language of the machine by
         $$\mathit{L}(\mathrm{M}) = \{x \in \mathrm{A}^*\ \vert\ 
            \hat{\delta}(s_0, x) \in \mathrm{F}\}.$$
         In other words, $\mathit{L}(\mathrm{M})$ is the set of all strings
         in $\mathrm{A}^*$ that move the machine via its transition function from
         the start state $s_0$ into one of the final (accepting) states.
         
         We can think of the machine $\mathrm{M}$ as a recognizer for
         $\mathit{L}(\mathrm{M})$, or as a string processing function
         $$f_{\mathrm{M}} : \mathrm{A}^* \to \{1, 0\}$$
         where $f_{\mathrm{M}}(x) = 1$ exactly when $x \in \mathit{L}(\mathrm{M})$.

     \item There are several generalizations of DFAs that are useful in various contexts.
         A first important generalization is to add a nondeterministic capability to the
         machines.  A nondeterministic finite automaton (NFA)
         $\mathrm{M} = (\mathrm{S}, \mathrm{A},  s_0, \delta, \mathrm{F})$ is the same
         as a DFA except for the transition function:
	     \begin{description}
	        \item $\mathrm{S}$, a finite set of states,
	        \item $\mathrm{A}$, an alphabet,
	        \item $s_0 \in \mathrm{S}$, the start state,
	        \item $\delta : \mathrm{S} \mathrm{x} \mathrm{A} \to \mathit{P}(\mathrm{S})$,
	            the transition function,
	        \item $\mathrm{F} \subset \mathrm{S}$, the set of final (or accepting)
	            states of the machine.
	     \end{description}
	     For a given input symbol, the transition function can take us to any one of
	     a set of states.
	     
	     We extend the transition function to $\hat{\delta} : \mathrm{S} \mathrm{x}
         \mathrm{A}^* \to \mathit{P}(\mathrm{S})$ in much the same way:
	     \begin{eqnarray*}
             \hat{\delta}(s, \epsilon) & = & s,\\
             \hat{\delta}(s, xa) & = & \bigcup_{r \in \delta(s, a)}\hat{\delta}(r, x).
         \end{eqnarray*}
         We define the language of the machine by
         $$\mathit{L}(\mathrm{M}) = \{x \in \mathrm{A}^*\ \vert\ 
            \hat{\delta}(s_0, x) \cap \mathrm{F} \ne \emptyset \}.$$
         
         A useful fact is that DFAs and NFAs define the same class of languages.  In
         particular, given a language $\mathrm{L}$, we have that $\mathrm{L} =
         \mathit{L}(\mathrm{M})$ for some DFA $\mathrm{M}$ if and only if
         $\mathrm{L} = \mathit{L}(\mathrm{M'})$ for some NFA $\mathrm{M'}$.
         
         Exercise:  Prove this fact.
         
         In doing the proof, you will notice that if
         $\mathrm{L} = \mathit{L}(\mathrm{M}) = \mathit{L}(\mathrm{M'})$ for some DFA
         $\mathrm{M}$ and NFA $\mathrm{M'}$, and $\mathrm{M'}$ has $n$ states, then
         $\mathrm{M}$ might need to have as many as $2^n$ states.  In general, NFAs
         are relatively easy to write down, but DFAs can be directly implemented.
         
      \item Another useful generalization is to allow the machine to change states
         without any input (often called $\epsilon$-moves).  An NFA with $\epsilon$-moves
         would be defined similarly to an NFA, but with transition function
         $$\delta : \mathrm{S} \mathrm{x} (\mathrm{A} \cup \{\epsilon\}) \to
             \mathit{P}(\mathrm{S}).$$
         Exercise:  What would an appropriate extended transition function $\hat{\delta}$
         and language $\mathit{L}(\mathrm{M})$ be for an NFA with $\epsilon$-moves?
         
         Exercise:  Show that the class of languages defined by NFAs with $\epsilon$-moves
         is the same as that defined by DFAs and NFAs.
         
         Here is a simple example.  By convention, the states in F are double
         circled.  Labelled arrows indicate transitions.
         Exercise:  what is the language of this machine?
      
        \vspace{1cm}
             
        \centerline{\includegraphics[width = 4in]{DFA-even-odd.jpg}}
        
\end{itemize}


\pagedone


\sectionhead{Regular expressions and languages}
\begin{itemize}
	\item In the preceding section we defined a class of machines (Finite Automata) that
	   can be used to recognize members of a particular class of languages.  It would
	   be nice to have a concise way to describe such a language, and furthermore to
	   have a convenient way to generate strings in such a language (as opposed to
	   having to feed candidate strings into a machine, and hoping they are recognized
	   as being in the language \ldots).
	   
	   Fortunately, there is a nice way to do this.  The class of languages defined
	   by Finite Automata are called Regular Languages (or Regular Sets of strings).
	   These languages are described by Regular Expressions.  We define these as
	   follows.  We will use lower case letters for regular expressions, and upper case
	   for regular sets.
	   
	\item Definition:  Given an alphabet $\mathrm{A}$, the following are regular
       expressions / regular sets over $\mathrm{A}$:
       
	   $\begin{matrix}
	      \mathrm{Expressions:}              &  \mathrm{Sets:}\\
	      \emptyset                          &  \emptyset\\
	      \epsilon                           &  \{\epsilon\}\\
	      a,\ \mathrm{for}\ a \in \mathrm{A} &  \ \ \ \ \{a\},\ \mathrm{for}\ a \in
                                                    \mathrm{A}\\
                                             &  \\
	      \mathrm{If\ r\ and\ s\ are}        &  \ \ \ \ \mathrm{If\ R\ and\ S\ are}\\
	      \mathrm{regular,\ then}            &  \ \ \ \ \mathrm{regular,\ then}\\
	      \mathrm{so\ are:}                  &  \ \ \ \ \mathrm{so\ are:}\\
	                                         &  \\
	      \mathrm{r + s}                     &  \mathrm{R} \cup \mathrm{S} \\
	      \mathrm{rs}                        &  \mathrm{RS}\\
	      \mathrm{r}^*                       &  \mathrm{R}^*\\
	    \end{matrix}
	   $
	   
	   and nothing else is regular.
	   
	   We say that the regular expression on the left represents the corresponding
	   regular set on the right.  We say that a language is a regular language if the
	   set of strings in the language is a regular set.

\pagedone

	   A couple of examples:
	 \vspace{-1.25cm}
    \item The regular expression
	   $$(00 + 11)^*(101 + 110)$$
	   represents the regular set (regular language)
	   
	   $\{101, 110, 00101, 00110, 11101, 11110,\newline
	   0000101, 0000110, 0011101, 0011110, \ldots\}.$
	   
	   Exercise:  What are some other strings in this language?  Is $00110011110$
	   in the language?  How about $00111100101110$?
	   
	 \item A protein motif pattern, described as a (slight variation of our) regular
	   expression.
	   
	   \vspace{1cm}
	          
        \centerline{\includegraphics[width = 5in]{RNP-1-motif}}

\pagedone

	\item It is a nice fact that regular languages are exactly the languages of the finite
	   automata defined in the previous section.  In particular, a language
	   $\mathrm{L}$ is a regular set (as defined above) if and only if
	   $\mathrm{L} = \mathit{L}(\mathrm{M})$ for some finite automaton $\mathrm{M}$.
	   
	   The proof of this fact is relatively straightforward.
	
	   For the first half, we need to show that if $\mathrm{L}$ is a regular set (in
	   particular, if it is represented by a regular expression $\mathrm{r}$), then
	   $\mathrm{L} = \mathit{L}(\mathrm{M})$ for some finite automaton $\mathrm{M}$.
	   We can show this by induction on the size of the regular expression $\mathrm{r}$.
	   The basis for the induction is the three simplest cases: $\emptyset$,
	   $\{\epsilon\}$, and $\{a\}$.  (Exercise:  find machines for these three cases.)  We
	   then show that, if we know how to build machines for $\mathrm{R}$ and $\mathrm{S}$,
	   then we can build machines for $\mathrm{R} \cup \mathrm{S},\ \mathrm{RS}$, and
	   $\mathrm{R}^*$.  (Exercise:  Show how to do these three -- use NFAs with
       $\epsilon$-moves.)
       
       For the second half, we need to show that if we are given a DFA
       $\mathrm{M}$, then we can find a regular expression (or a regular set
       representation) for $\mathit{L}(\mathrm{M})$.  We can do this by looking
       at sets of strings of the form
       
       $\mathrm{R}_{ij}^k = \{x \in \mathrm{A}^*\ \vert\ x$ $\mathrm{takes\ M}$
                from state $s_i$ to state $s_j$ without going through (into and out of)
                any state $s_m$ with $m \ge k\}.$
                
       Note that if the states of $\mathrm{M}$ are $\{s_0, s_1, \ldots, s_{n-1}\}$, then
       $$\mathit{L}(\mathrm{M}) = \bigcup_{s_j \in \mathrm{F}}\mathrm{R}_{0j}^n.$$
       We also have
       $$\mathrm{R}_{ij}^0 = \{a \in \mathrm{A}\ \vert\ \delta(s_i, a) = s_j\}$$
       (for $i = j$, we also get $\epsilon$ \ldots),
       
       and, for $k \ge 0$,
       $$\mathrm{R}_{ij}^{k+1} = \mathrm{R}_{ij}^{k} \cup \mathrm{R}_{ik}^{k}
          (\mathrm{R}_{kk}^{k})^*\mathrm{R}_{kj}^{k}.$$
       Exercise:  Verify, and finish the proof.
	    



\end{itemize}
\pagedone

\sectionhead{Markov models}
\begin{itemize}
	\item An important related class of systems are Markov models (often called
	   Markov chains).  These models are quite similar to finite automata, except
	   that the transitions from state to state are probabilistically determined,
	   and typically we do not concern ourselves with final or accepting states.
	   
	   Markov models can often be thought of as models for discrete dynamical
	   systems.  We model the system as consisting of a finite set of states, with
	   a certain probability of transition from a state to any other state.
	   
\pagedone

	   The typical way to specify a Markov model is via a transition
	   matrix:
	   \[
          \mathrm{T} = 
          \left[ 
            \begin{array}{cccc}
	          p_{11} & p_{12} & \cdots & p_{1n} \\
	          p_{21} & p_{22} & \cdots & p_{2n} \\
	          \vdots & \vdots & \ddots & \vdots \\
	          p_{n1} & p_{n2} & \cdots & p_{nn} \\
	        \end{array}
	      \right]
       \]

       where $0 \le p_{ij} \le 1$, and $\sum_jp_{ij} = 1.$
       
       Each entry $p_{ij}$ tells the probability the system will go from
       state $s_i$ to state $s_j$ in the next time step.
       
       The transition probabilities over two steps are given by $\mathrm{T}^2$.
       Over $n$ steps, the probabilities are given by $\mathrm{T}^n$.
       
       Exercises:  Suppose we run the system for very many steps.  How might we
       estimate the relative probabilities of being in any given state?
       
       What information about the system might we get from eigenvalues and
       eigenvectors of the matrix $\mathrm{T}$?
       
\pagedone

     \item A couple of examples:
     
        First, a generic Markov model for DNA sequences:
       
        \centerline{\includegraphics[width = 2in]{ACGT-Markov}}

        An outline for a more complex model, of a type often called
        a hidden Markov model.
          
        \centerline{\includegraphics[width = 5in]{Pairwise-align-HMM}}

\end{itemize}
\pagedone

\sectionhead{Context free grammars and languages}
\begin{itemize}
     \item While regular languages are very useful, not every interesting language
          is regular.  It is not hard to show that even such simple languages
          as balanced parentheses or palindromes are not regular.  (Here is probably
          a good place to remind ourselves again that in this context, a language
          is just a set of strings \ldots)
          
          A more general class of languages is the context free languages.  A
          straightforward way to specify a context free language is via a context
          free grammar.  Context free grammars can be thought of as being for
          context free languages the analogue of regular expressions for regular
          languages.  They provide a mechanism for generating elements on the
          language.
          
     \item A context free grammar G = (V, T, S, P) consists of a two alphabets V
          and T (called variables and terminals, respectively), an element S $\in$ V
          called the start symbol, and a finite set of production rules P.  Each
          production rule is of the form $A \to \alpha$,
          where A $\in$ V and $\alpha \in (\mathrm{V} \cup \mathrm{T})^*$.
          
          We can use such a production rule to generate new strings from old strings.
          In particular, if we have the string $\gamma A \delta \in
          (\mathrm{V} \cup \mathrm{T})^*$ with $\mathrm{A} \in \mathrm{V}$,
          then we can produce the new string $\gamma \alpha \delta$.  The application
          of a production rule from the grammar G is often
          written $\alpha \underset{\mathrm{G}}{\Rightarrow} \beta$, or just
          $\alpha \Rightarrow \beta$ if the grammar is clear.
          The application of 0 or more production rules one after the other is written
          $\alpha \overset{*}{\Rightarrow} \beta$.
          
          The language of the grammar G is then
          $$\mathit{L}(\mathrm{G}) = \{\alpha \in \mathrm{T}^*\ \vert \ 
               \mathrm{S} \overset{*}{\Rightarrow} \alpha\}.$$
          The language of such a grammar is called a context free language.
          
\pagedone

      \item Here, as an example, is the language consisting of strings of
          balanced parenthese.  Note that we can figure out which symbols
          are variables, since they all occur on the left side of some
          production.
          \begin{eqnarray*}
              \mathrm{S} & \to &  \mathrm{R}\\
              \mathrm{R} & \to &  \epsilon\\
              \mathrm{R} & \to &  (R)\\
              \mathrm{R} & \to &  RR\\
          \end{eqnarray*}
          Exercise:  Check this.  How would we modify the grammar if we wanted
          to include balanced `[]' and `\{\}' pairs also? 
      \item Here is a palindrome language over the alphabet T = \{a, b\}:
          \begin{eqnarray*}
              \mathrm{S} & \to &  \mathrm{R}\\
              \mathrm{R} & \to &  \epsilon\ \vert\ \mathrm{a}\ \vert\ \mathrm{b}\\
              \mathrm{R} & \to &  \mathrm{aRa}\ \vert\ \mathrm{bRb}\\
          \end{eqnarray*}
          (note the `$\vert$' to indicate alternatives \ldots)
          
\pagedone

          Exercise:  What would a grammar for simple algebraic expressions
          (with \newline terminals T = \{x, y, +, -, *, (, )\}) \newline
          look like?
          
      \item A couple of important facts are that any regular language is
          also context free, but there are context free languages that are
          not regular.
          
          Exercise:  How might one prove these facts?
          
      \item Context free grammars can easily be used to generate strings in
          the corresponsing language.  We would also like to have machines
          to recognize such languages.  We can build such machines through
          a slight generalization of finite automata.  The generalization is
          to add a `pushdown stack' to our finite automata.  These more
          powerful machines are called pushdown automata, or PDAs \ldots
          
      \item  Here is an example -- this is a grammar for the RNP-1 motif
          from an earlier example.  This also gives an example of what
          a grammar for a regular language might look like.  Question:
          what features of this grammar reflect the fact that it is for
          a regular language?
          
          \ \ \ RNP-1 motif grammar
          \begin{eqnarray*}
             S   & \to & rW_1\ \vert\ kW_1 \\
             W_1 & \to & gW_2 \\
             W_2 & \to & [afilmnqstvwy]W_3 \\
             W_3 & \to & [agsci]W_4 \\
             W_4 & \to & fW_5\ \vert\ yW_5\\
             W_5 & \to & [liva]W_6 \\
             W_6 & \to & [acdefghiklmnpqrstvwy]W_7 \\
             W_7 & \to & f\ \vert\ y\ \vert\ m \\ 
          \end{eqnarray*}

\pagedone

       \item Could we build a context free
          grammar for the primary structure of this tRNA that would reflect
          the secondary structure?  What features could be variable, and
          which must be fixed in order for the tRNA to function appropriately
          in context?         
        \centerline{\includegraphics[width = 5in]{yeast-tRNA-Phe}}
        

        
        
\end{itemize}
\pagedone

\sectionhead{Language generators and recognizers}

\begin{itemize}

     \item First, note that the function $\ln(x)$ has derivative $1/x$.  From this, we find that
          the tangent to $\ln(x)$ at $x = 1$ is the line $y = x - 1$.  Further, since $\ln(x)$
          is concave down, we have, for $x > 0$, that
          $$\ln(x) \le x - 1,$$
          with equality only when $x = 1$.
          
          Now, given two probability distributions, $ P = \{p_1, p_2, \ldots, p_n\}$
          and $Q = \{q_1, q_2, \ldots, q_n\}$, where $p_i, q_i \ge 0$ and $\sum_i p_i = \sum_i q_i = 1$,
          we have
          \begin{eqnarray*}
               \sum_{i=1}^n p_i \ln\left(\frac{q_i}{p_i}\right) & \le & \sum_{i=1}^n p_i
                              \left(\frac{q_i}{p_i} - 1\right)
                   =  \sum_{i=1}^n(q_i - p_i)\\
              & = & \sum_{i=1}^n q_i - \sum_{i=1}^n p_i  =  1 - 1 = 0,
          \end{eqnarray*}
          with equality only when $p_i = q_i$ for all $i$.  It is easy to see that the inequality
          actually holds for any base, not just $e$.

\end{itemize}


\sectionhead{The Chomsky hierarchy}

\begin{itemize}

       \item  Let us work briefly with a simple model for an idealized gas.  Let us assume
            that the gas is made up of $N$ point particles, and that at some time $t_0$ all
            the particles are contained within a (cubical) volume $V$.  Assume that through
            some mechanism, we can determine the location of each particle sufficiently
            well as to be able to locate it within a box with sides $1/100$ of the sides
            of the containing volume $V$.  There are $10^6$ of these small boxes within
            $V$.
            

\end{itemize}
\pagedone

\sectionhead{Turing machines}
\begin{itemize}

	\item In his classic 1948 papers, Claude Shannon laid the foundations
	     for contemporary {\em information}, {\em coding}, and {\em communication}
	     theory.  He developed a general model for communication systems, and a set
	     of theoretical tools for analyzing such systems.
	     
	     His basic model consists of three parts:  a sender (or source), a
	     channel, and a receiver (or sink).  His general model also includes
	     encoding and decoding elements, and noise within the channel.
	     

\end{itemize}
\pagedone

\sectionhead{Computability and tractability}

\begin{itemize}

    \item We have already observed that there are some problems that are not
       computable -- in particular, we showed the existence of languages for
       which there cannot be an algorithmic recognizer to determine which
       strings are in the language.  Another important example of a noncomputable
       problem is the so-called halting problem.  In simple terms, the question is,
       given a computer program, does the program contain an infinite loop?  There
       cannot be an algorithm that is guaranteed to correctly answer this question
       for all programs.
       
       More practically, however, we often are interested in whether a program can
       be executed in a `reasonable' length of time, using a reasonable amount of
       resources such as system memory.
       
	\item We can generally categorize computational algorithms according to how the resources needed for execution of the algorithm increase as we increase the size of the input.  Typical resources are time and (storage) space.  In different contexts, we may be interested in worst-case or average-case performance of the algorithm.  For theoretical purposes, we will typically be interested in large input sets \ldots

\pagedone
	\item A standard mechanism for comparing the growth of functions with domain $\mathbb{N}$ is ``big-Oh.''  One way of defining this notion is to associate each function with a set of functions.  We can then compare algorithms by looking at their ``big-Oh'' categories.  
	\item Given a function $f$, we define $O(f)$ by:
$$ g \in O(f) \iff $$
\centerline{there exist $c > 0$ and $N \ge 0$ such that}
\centerline{$\vert g(n) \vert \le c\vert f(n) \vert $ for all $n \ge N$.}
	\item We further define $\theta(f)$ by:
	
\centerline{$g \in \theta(f)$ iff $g \in O(f)$ and $f \in O(g)$.}
\pagedone
	\item In general we will consider the run-time of algorithms in terms of the growth of the number of elementary computer operations as a function of the number of bits in the (encoded) input.  Some important categories -- an algorithm's run-time $f$ is:
	
	\begin{enumerate}
		\item Logarithmic if $f \in \theta(\log(n))$.	
		\item Linear if $f \in \theta(n)$.	
		\item Quadratic if $f \in \theta(n^2)$.	
		\item Polynomial if $f \in \theta(P(n))$ for some polynomial $P(n)$.	
		\item Exponential if $f \in \theta(b^n)$ for some constant $b > 1$.	
		\item Factorial if $f \in \theta(n!)$.
	
	\end{enumerate}
\pagedone
	\item Typically we say that a problem is {\em tractable} if (we know) there exists an algorithm whose run-time is (at worst) polynomial that solves the problem.  Otherwise, we call the problem {\em intractable}.

	\item There are many problems which have the interesting property that if someone (an oracle?) provides you with a solution to the problem, you can tell in polynomial time whether what they provided you actually is a solution.  Problems with this property are called Non-deterministically Polynomial, or NP, problems.  One way to think about this property is to imagine that we have arbitrarily many machines available.  We let each machine work on one possible solution, and whichever machine finds the (a) solution lets us know.
	\item There are some even more interesting NP problems which are universal for the class of NP problems.  These are called NP-complete problems.  A problem $S$ is NP-complete if $S$ is NP and, there exists a polynomial time algorithm that allows us to translate any NP problem into an instance of $S$.  If we could find a polynomial time algorithm to solve a single NP-complete problem, we would then have a polynomial time solution for each NP problem.
\pagedone
	\item Some examples:
	
	\begin{enumerate}
		\item Factoring a number is NP.  First, we recognize that if $M$ is the number we want to factor, then the input size $m$ is approximately $\log(M)$ (that is, the input size is the number of digits in the number).  The elementary school algorithm (try dividing by each number less than $\sqrt M$) has run-time approximately $10^{\frac{m}{2}}$, which is exponential in the number of digits.  On the other hand, if someone hands you two numbers they claim are factors of $M$, you can check by multiplying, which takes on the order of $m^2$ operations.

It is worth noting that there is a polynomial time algorithm to determine whether or not a number is prime, but for composite numbers, this algorithm does not provide a factorization.  Factoring is a particularly important example because various encryption algorithms such as RSA (used in the PGP software) depend for their security on the difficulty of factoring numbers with several hundred digits.
\pagedone
		\item Satisfiability of a boolean expression is NP-complete.  Suppose we have $n$ boolean variables $\{b_1,b_2,\ldots,b_n\}$ (each with the possible values 0 and 1).  We can form a general boolean expression from these variables and their negations:
$$ f(b_1,b_2,\ldots,b_n) = \bigwedge_k(\bigvee_{i,j\le n}(b_i,\sim b_j)).$$
A solution to such a problem is an assignment of values 0 or 1 to each of the $b_i$ such that $f(b_1,b_2,\ldots,b_n) = $1.  There are $2^n$ possible assignments of values.  We can check an individual possible solution in polynomial time, but there are exponentially many possibilities to check.  If we could develop a feasible computation for this problem, we would have resolved the traditional P$\overset{?}=$NP problem \ldots

\end{enumerate}

\end{itemize}

\pagedone

\sectionhead{Computational complexity}

\begin{itemize}
       \item  Suppose we have a system for which we can measure certain macroscopic
            characteristics.  Suppose further that the system is made up of many microscopic
            elements, and that the system is free to vary among various states.  Given
            the discussion above, let us assume that with probability essentially equal to
            1, the system will be observed in states with maximum entropy.
            
            We will then sometimes be able to gain understanding of the system by
            applying a {\em maximum information entropy} principle, and, using
            Lagrange multipliers, derive formulas for aspects of the system.

\end{itemize}

\pagedone

\footnotesize
 \bibliographystyle{plain}
\tthdump{\hypertarget{References}{}\hyperlink{Our general topics:}{\hfil \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ To top $\leftarrow$}}
%%tth:{\special{html: <A NAME="References"></A><a href="\#Top of file">       Top</a>}}


\vspace{-1.0 in}

\begin{thebibliography}{12}
%%tth:{\special{html: <font size="+0">}}

% \bibitem{bennett2}
% Bennett, C. H., 
% The Thermodynamics of Computation - a Review, 
% {\em International Journal of Theoretical Physics}, 
% {\bf 21}, No. 12, p. 905, 1982.
%  
% \bibitem{bennett3}
% Bennett, C. H. and Landauer, R., 
% The fundamental physical limits of computation,
% {\em Scientific American,} July 38--46, 1985.
 
%  \bibitem{bennett4}
%  Bennett, C. H., 
%  Demons, engines and the second law,
%  {\em Scientific American} {\bf 257} no. 5 (November) pp 88--96,
%  1987.

 \bibitem{brillouin}
 Brillouin, L.,
 {\em Science and information theory}
 Academic Press, New York, 1956.

\bibitem{brooks}
Brooks, Daniel R., and Wiley, E. O.,
{\em Evolution as Entropy}, Toward a Unified Theory of Biology,
Second Edition,
University of Chicago Press, Chicago, 1988.

\bibitem{campbell}
Campbell, Jeremy,
{\em Grammatical Man}, Information, Entropy, Language, and Life,
Simon and Schuster, New York, 1982.

% \bibitem{church}
% Church, Alonzo, 
% An unsolvable problem of elementary number theory,
% {\em Amer. J. Math.} {\bf 58} 345--363, 1936.

% \bibitem{clausen}
% Clausen, M., 
% Fast Generalized Fourier transforms, 
% {\em Theoret. Comput. Sci.} {\bf 56} 55--63 1989.

\bibitem{cover}
Cover, T. M., and Thomas J. A., 
{\em Elements of Information Theory,}
John Wiley and Sons, New York, 1991.

\bibitem{delillo}
DeLillo, Don,
{\em White Noise},
Viking/Penguin, New York, 1984.

\bibitem{feller}
Feller, W.,
{\em An Introduction to Probability Theory and Its Applications},
Wiley, New York,1957.
 
\bibitem{feynman-96}
Feynman, Richard,
{\em Feynman lectures on computation},
Addison-Wesley, Reading, 1996.

\bibitem{gatlin}
Gatlin, L. L.,
{\em Information Theory and the Living System},
Columbia University Press, New York, 1972.

% \bibitem{golay}
% Golay, M. J. E.,
% Notes on digital coding,
% {\em Proc. IEEE} {\bf 37} 657, 1949.
% 
% \bibitem{grey}
% Garey M R and Johnson D S,
% {\em Computers and Intractability}, 
% Freeman and Company, New York, 1979.

\bibitem{haken}
Haken, Hermann,
{\em Information and Self-Organization, a Macroscopic Approach to Complex Systems},
Springer-Verlag, Berlin/New York, 1988.

\bibitem{hamming1}
Hamming, R. W.,
Error detecting and error correcting codes,
{\em Bell Syst. Tech. J.} {\bf 29} 147, 1950.

\bibitem{hamming2}
Hamming, R. W.,
{\em Coding and information theory}, 2nd ed,
Prentice-Hall, Englewood Cliffs, 1986.

% \bibitem{hardy}
% Hardy, G. H. and Wright, E. M.,
% {\em An introduction to the theory of numbers}
% Clarendon Press, Oxford, 1979.

\bibitem{hill}
Hill, R.,
{\em A first course in coding theory}
Clarendon Press, Oxford, 1986.

\bibitem{hodges}
Hodges, A.,
{\em Alan Turing: the enigma}
Vintage, London, 1983.

\bibitem{hofstadter}
Hofstadter, Douglas R.,
{\em Metamagical Themas:  Questing for the Essence of Mind and Pattern},
Basic Books, New York, 1985
 
\bibitem{jones}
Jones, D. S.,
{\em Elementary information theory}
Clarendon Press, Oxford, 1979.

% \bibitem{knuthd} 
% Knuth, D. E.,
% {\em The Art of Computer Programming, Vol. 2: Seminumerical Algorithms},
% 2nd ed, Addison-Wesley, Reading, 1981.

\bibitem{knuthe}
Knuth, Eldon L.,
{\em Introduction to Statistical Thermodynamics},
McGraw-Hill, New York, 1966.

\bibitem{landauer3}
Landauer, R.,
Information is physical,
{\em Phys. Today}, May 1991 23-29.

\bibitem{landauer4} 
Landauer, R.,
The physical nature of information,
{\em Phys. Lett. A}, {\bf 217} 188, 1996.

\bibitem{lint}
van Lint, J. H.,
{\em Coding Theory},
Springer-Verlag, New York/Berlin, 1982.

\bibitem{lipton}
Lipton, R. J., 
Using DNA to solve NP-complete problems, 
{\em Science}, {\bf 268} 542--545, Apr. 28, 1995.

\bibitem{macwilliams}
MacWilliams, F. J., and Sloane, N. J. A.,
{\em The theory of error correcting codes},
Elsevier Science, Amsterdam, 1977.

\bibitem{martin}
Martin, N. F. G., and England, J. W.,
{\em Mathematical Theory of Entropy},
Addison-Wesley, Reading, 1981.

\bibitem{maxwell}
Maxwell, J. C.,
{\em Theory of heat}
Longmans, Green and Co, London, 1871.

% \bibitem{minsky}
% Minsky, M. L.,
% {\em Computation: Finite and Infinite Machines}
% Prentice-Hall, Inc., Englewood Cliffs, N. J. (also London 1972), 1967.

\bibitem{neumann}
von Neumann, John,
Probabilistic logic and the synthesis of reliable organisms
		  from unreliable components,
in {\em automata studies( Shanon,McCarthy eds)}, 1956 .

\bibitem{papa}
Papadimitriou, C. H., 
{\em Computational Complexity}, 
Addison-Wesley, Reading, 1994.

\bibitem{pierce}
Pierce, John R.,
{\em An Introduction to Information Theory -- Symbols, Signals and Noise},
(second revised edition),
Dover Publications, New York, 1980.

% \bibitem{rabin79} 
% Rabin, M. O., 
% Probabilistic Algorithms,
% {\em  Algorithms and Complexity: New Directions 
% and Recent Results}, pp. 21-39,
%    Academic Press, 1976.

\bibitem{roman}
Roman, Steven, 
{\em Introduction to Coding and Information Theory},
Springer-Verlag, Berlin/New York, 1997.

\bibitem{sampson}
Sampson, Jeffrey R.,
{\em Adaptive Information Processing, an Introductory Survey},
Springer-Verlag, Berlin/New York, 1976.

\bibitem{schroeder1}
Schroeder, Manfred,
{\em Fractals, Chaos, Power Laws, Minutes from an Infinite Paradise},
W. H. Freeman, New York, 1991.

% \bibitem{schroeder2}
% Schroeder, M. R., 1984
% {\em Number theory in science and communication}
% Springer-Verlag, New York/Berlin/Heidelberg, 1984.

\bibitem{shannon}
Shannon, C. E.,
A mathematical theory of communication
{\em Bell Syst. Tech. J.} {\bf 27} 379; also p. 623, 1948.

\bibitem{slepian}
Slepian, D., ed.,
{\em Key papers in the development of information theory}
IEEE Press, New York, 1974.

% \bibitem{szilard}
% Szilard L 1929 Z. Phys. {\bf 53} 840;
% translated in Wheeler and Zurek (1983).

\bibitem{turing}
Turing, A. M.,
On computable numbers, with an application to the
Entscheidungsproblem,
{\em Proc. Lond. Math. Soc. Ser. 2} {\bf 42}, 230 ; see also
{\em Proc. Lond. Math. Soc. Ser. 2} {\bf 43}, 544, 1936.

% \bibitem{vergis} 
% Vergis, A., Steiglitz, K., and Dickinson, B.,
% The Complexity of Analog Computation,
% {\em Math. Comput. Simulation 28}, pp. 91-113. 1986.

\bibitem{zurek2}
Zurek, W. H.,
Thermodynamic cost of computation, algorithmic complexity and the
information metric,
{\em Nature} {\bf 341} 119-124, 1989.

\end{thebibliography}

\tthdump{\hyperlink{Our general topics:}{\hfil To top $\leftarrow$}}
%%tth:{\special{html: <a href="\#Top of file">       Back to top of file</a>}}

% 
% \sectionhead{On-line references}
% 
% 
% Some of the references listed above are available on line.  They are listed again here for easy access:
% 
% %\bibitem{abrams2}
% Abrams D S and Lloyd S, 
% Non-Linear Quantum Mechanics implies Polynomial Time 
% solution for NP-complete and $\#$P problems,
% %in {\it LANL e-print} quant-ph/9801041, http://xxx.lanl.gov (1998)
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9801041}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9801041}
% {http://xxx.lanl.gov/abs/quant-ph/9801041}
% 
% 
% %\bibitem{aharonov5}
% Aharonov D, Beckman D, Chuang I and  Nielsen M,
% What Makes Quantum Computers Powerful? 
% \hyperref{http://wwwcas.phys.unm.edu/\~mnielsen/science.html}{}{}
% %\hyperURL{http}{wwwcas.phys.unm.edu/~mnielsen}{science.html}
% {http://wwwcas.phys.unm.edu/\~mnielsen/science.html}
% % 
% % 
% 
% %\bibitem{decoherence2}
%  Chuang I L, Laflamme R and Paz J P, 
% Effects of Loss and Decoherence on a Simple Quantum Computer,
% %in {\it LANL e-print} quant-ph/9602018,  http://xxx.lanl.gov (1996)
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9602018}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9602018}
% {http://xxx.lanl.gov/abs/quant-ph/9602018}
% 
% %\bibitem{grover2}
%  Grover L K, 
% A framework for fast quantum mechanical algorithms,
% %in {\it LANL e-print} quant-ph/9711043,  http://xxx.lanl.gov (1997)
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9711043}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9711043}
% {http://xxx.lanl.gov/abs/quant-ph/9711043}
% 
% %\bibitem{grover4}
%  Grover L K, 
% A fast quantum mechanical algorithm for estimating the median,
% %in {\it LANL e-print} quant-ph/9607024,  http://xxx.lanl.gov (1997)
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9607024}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9607024}
% {http://xxx.lanl.gov/abs/quant-ph/9607024}
% 
% 
% %\bibitem{knill4}
% Knill E, Laflamme R and Zurek W H 1997
% Resilient quantum computation: error models and thresholds
% %in {\it LANL e-print} quant-ph/9702058,  http://xxx.lanl.gov (1997)
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9702058}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9702058}
% {http://xxx.lanl.gov/abs/quant-ph/9702058}
% 
% \pagedone
% 
% 
% %\bibitem{preskill2}
% Preskill J 1997
% Fault tolerant quantum computation,
% %in {\it LANL e-print} quant-ph/9712048,  http://xxx.lanl.gov (1997), 
% to appear in {\it Introduction to Quantum
% Computation},  edited by H.-K. Lo, S. Popescu, and T. P. Spiller
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9712048}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9712048}
% {http://xxx.lanl.gov/abs/quant-ph/9712048}
% 
% %\bibitem{preskill3}
% Preskill J, Kitaev A, Course notes for Physics 229, Fall 1998, Caltech Univ.,
% \hyperref{http://www.theory.caltech.edu/people/preskill/ph229}{}{}
% %\hyperURL{http}{www.theory.caltech.edu/people/preskill}{ph229}
% {http://www.theory.caltech.edu/people/preskill/ph229}
% 
% 
% %\bibitem{rieffel}
% Rieffel E, Polak W
% An Introduction to Quantum Computing for Non-Physicists
% %{\it LANL e-print} quant-ph/9809016,  http://xxx.lanl.gov (1998),
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9809016}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9809016}
% {http://xxx.lanl.gov/abs/quant-ph/9809016}
% 
% %\bibitem{Steane-97}
% Steane A,
% Quantum Computation, Reports on Progress in Physics 61 (1998) 117,
% %(preprint in {\it LANL e-print} quant-ph/9708022, http://xxx.lanl.gov)
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9708022}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9708022}
% {http://xxx.lanl.gov/abs/quant-ph/9708022}
% 
% %\bibitem{zalka2}
% Zalka C, 
% Grover's quantum searching algorithm is optimal,
% %in {\it LANL e-print} quant-ph/9711070http://xxx.lanl.gov (1997)
% \hyperref{http://xxx.lanl.gov/abs/quant-ph/9711070}{}{}
% %\hyperURL{http}{xxx.lanl.gov/abs/quant-ph}{9711070}
% {http://xxx.lanl.gov/abs/quant-ph/9711070}
% 

\end{document}
