% \iffalse meta-comment % % Copyright (C) 1994-2004 Peter Williams % Copyright (C) 2005-2009 Rogério Brito % % This document file is free software; you can redistribute it and/or % modify it under the terms of the GNU Lesser General Public License as % published by the Free Software Foundation; either version 2 of the % License, or (at your option) any later version. % % This document file is distributed in the hope that it will be useful, but % WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser % General Public License for more details. % % You should have received a copy of the GNU Lesser General Public License % along with this document file; if not, write to the Free Software % Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 % USA. % % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{algorithm} % [2009/08/24 v0.1 Document Style `algorithm' - floating environment] % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{algorithmic} % [2009/08/24 v0.1 Document Style `algorithmic'] % % %<*driver> \documentclass{ltxdoc} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[sc]{mathpazo} \usepackage[pdfstartview={FitH}]{hyperref} \usepackage{algorithm} \usepackage{algorithmic} \usepackage{multicol} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{algorithms.dtx} \end{document} % % \fi % %\CheckSum{0} % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \changes{v0.1}{2009/08/24}{Migrated the package to .ins and .dtx format} % % \GetFileInfo{algorithm.sty} % \GetFileInfo{algorithmic.sty} % \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ } % \DoNotIndex{\@ne} % \DoNotIndex{\advance,\begingroup,\catcode,\closein} % \DoNotIndex{\closeout,\day,\def,\edef,\else,\empty,\endgroup} % % \title{The \textsf{algorithms} bundle\thanks{This document % corresponds to \textsf{algorithms}~\fileversion, % dated~\filedate.}} % \author{Rogério Brito\\ \href{mailto:rbrito@ime.usp.br}{\texttt{rbrito@ime.usp.br}}} % % \newcommand{\keyword}[1]{\texttt{#1}} % \newcommand{\nameoffile}[1]{\texttt{#1}} % % \setcounter{tocdepth}{2} % % \addtocontents{toc}{\protect\begin{multicols}{2}} % \maketitle % \tableofcontents % \listofalgorithms % % % \newtheorem{warning}{Warning} % \renewcommand{\thewarning}{} % % \section{Introduction} % % This package provides two environments, \keyword{algorithmic} and % \keyword{algorithm}, which are designed to be used together but may, % depending on the necessities of the user, be used separately. % % The \keyword{algorithmic} environment provides an environment for % describing algorithms and the \keyword{algorithm} environment provides % a ``float'' wrapper for algorithms (implemented using % \keyword{algorithmic} or some other method at the users's option). % The reason for two environments being provided is to allow the user % maximum flexibility. % % This work may be distributed and/or modified under the conditions of % the GNU Lesser General Public License, either version 2 of the % License, or (at your option) any later version, as published by the % Free Software Foundation. See the file \nameoffile{COPYING} included % in this package for further details. % % Currently, this package consists of the following files: % \begin{itemize} % \item \nameoffile{algorithms.ins}: the driver file % \item \nameoffile{algorithms.dtx}: the source file % \item \nameoffile{COPYING}: the license file % \item \nameoffile{README}: remarks about the package % \item \nameoffile{THANKS}: mentions of thanks for contributors to % the package % \end{itemize} % % Starting with with the 2009-08-24 release, the package is now % versioned and this document corresponds to version~\fileversion. % % If you use this package, the author would kindly appreciate if you % mentioned it in your documents, so as to let the package be better % known and have more contributors, to make it better for the community % itself. This is \emph{not} required by the license: it's just a % friendly request. % %\section{Installation} % % The installation procedure of \textsf{algorithms} follows the usual % practice of packages shipped with a pair of % \nameoffile{.ins}/\nameoffile{.dtx}---simply type the comand: % \begin{quote} % \texttt{latex algorithms.ins} % \end{quote} % and the \nameoffile{.sty} files will be generated. Copy them to a % place that is referenced by your \LaTeX{} distribution. To generate % the documentation, type: % \begin{quote} % \texttt{latex algorithms.dtx} % \end{quote} % % \section[Environment: \keyword{algorithmic}]% % {The \keyword{algorithmic} Environment} % \label{sec:algorithmic-envir} % Within an \keyword{algorithmic} a number of commands for typesetting % popular algorithmic constructs are available. In general, the % commands provided can be arbitrarily nested to describe quite complex % algorithms. An optional argument to the \verb+\begin{algorithmic}+ % statement can be used to turn on line numbering by giving a positive % integer indicating the required frequency of line numbering. For % example, \verb+\begin{algorithmic}[5]+ would cause every fifth line % to be numbered. % % \subsection{The Simple Statement} % % The simple statement takes the form % \begin{verbatim} % \STATE % \end{verbatim} % and is used for simple statements. For example, % \begin{verbatim} % \begin{algorithmic} % \STATE $S \leftarrow 0$ % \end{algorithmic} % \end{verbatim} % would produce % \begin{algorithmic} % \STATE $S \leftarrow 0$ % \end{algorithmic} % With line numbering selected for every line, using, % \begin{verbatim} % \begin{algorithmic}[1] % \STATE $S \leftarrow 0$ % \end{algorithmic} % \end{verbatim} % we would get % \begin{algorithmic}[1] % \STATE $S \leftarrow 0$ % \end{algorithmic} % % \begin{warning} % For users of earlier versions of \keyword{algorithmic} this % construct is a cause of an incompatibility. In the earlier version, % instead of starting simple statements with the \verb+\STATE+ % command, simple statements were entered as free text and terminated % with \verb+\\+ command. Unfortunately, this simpler method failed % to survive the modifications necessary for statement numbering. % However, the \verb+\\+ command can still be used to force a line % break within a simple statement. % \end{warning} % %\subsection{The \emph{if-then-else} Statement} % % The \emph{if-then-else} construct takes the forms: % \begin{verbatim} % \IF{} \ENDIF % \IF{} \ELSE \ENDIF % \IF{} \ELSIF{} \ELSE \ENDIF % \end{verbatim} % % In the third of these forms there is no limit placed on the number of % \verb+\ELSIF{}+ that may be used. For example, % \begin{verbatim} % \begin{algorithmic} % \IF{some condition is true} % \STATE do some processing % \ELSIF{some other condition is true} % \STATE do some different processing % \ELSIF{some even more bizarre condition is met} % \STATE do something else % \ELSE % \STATE do the default actions % \ENDIF % \end{algorithmic} % \end{verbatim} % would produce % \begin{algorithmic} % \IF{some condition is true} % \STATE do some processing % \ELSIF{some other condition is true} % \STATE do some different processing % \ELSIF{some even more bizarre condition is met} % \STATE do something else % \ELSE % \STATE do the default actions % \ENDIF % \end{algorithmic} % with appropriate indentations. % % \subsection{The \emph{for} Loop} % % The \emph{for} loop takes two forms. Namely: % \begin{verbatim} % \FOR{} \ENDFOR % \FORALL{} \ENDFOR % \end{verbatim} % % \noindent For example, % \begin{verbatim} % \begin{algorithmic} % \FOR{$i=0$ to $10$} % \STATE carry out some processing % \ENDFOR % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \FOR{$i=0$ to $10$} % \STATE carry out some processing % \ENDFOR % \end{algorithmic} % and % \begin{verbatim} % \begin{algorithmic}[1] % \FORALL{$i$ such that $0\leq i\leq 10$} % \STATE carry out some processing % \ENDFOR % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic}[1] % \FORALL{$i$ such that $0\leq i\leq 10$} % \STATE carry out some processing % \ENDFOR % \end{algorithmic} % % \subsubsection{The \emph{to} Connective} % As may be clear from the usage of loops above, we usually want to % specify ranges over which a variable will assume values. To help make % this typographically distinct, the \keyword{algorithmic} package now % supports the \algorithmicto{} connective, which can be used like: % \begin{verbatim} % \begin{algorithmic} % \FOR{$i=0$ \TO $10$} % \STATE carry out some processing % \ENDFOR % \end{algorithmic} % \end{verbatim} % to produce the output % \begin{algorithmic} % \FOR{$i=0$ \TO $10$} % \STATE carry out some processing % \ENDFOR % \end{algorithmic} % % \subsection{The \emph{while} Loop} % % The \emph{while} loop takes the form % \begin{verbatim} % \WHILE{} \ENDWHILE % \end{verbatim} % For example, % \begin{verbatim} % \begin{algorithmic} % \WHILE{some condition holds} % \STATE carry out some processing % \ENDWHILE % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \WHILE{some condition holds} % \STATE carry out some processing % \ENDWHILE % \end{algorithmic} % % \subsection{The \emph{repeat-until} Loop} % % The \emph{repeat-until} loop takes the form. % \begin{verbatim} % \REPEAT \UNTIL{} % \end{verbatim} % For example, % \begin{verbatim} % \begin{algorithmic} % \REPEAT % \STATE carry out some processing % \UNTIL{some condition is met} % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \REPEAT % \STATE carry out some processing % \UNTIL{some condition is met} % \end{algorithmic} % % \subsection{The Infinite Loop} % % The infinite loop takes the form. % \begin{verbatim} % \LOOP \ENDLOOP % \end{verbatim} % For example, % \begin{verbatim} % \begin{algorithmic} % \LOOP % \STATE this processing will be repeated forever % \ENDLOOP % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \LOOP % \STATE this processing will be repeated forever % \ENDLOOP % \end{algorithmic} % % \subsection{The Logical Connectives} % % The connectives \algorithmicand, \algorithmicor, \algorithmicxor{} and % \algorithmicnot{} can be used in boolean expressions in the familiar, % expected way: % \begin{verbatim} % \AND % \OR % \XOR % \NOT % \end{verbatim} % according to their arity.\footnote{But there is nothing that prevents % the user from violating the arity, from a syntatic point of view.} % For example, % \begin{verbatim} % \begin{algorithmic} % \IF{\NOT ($year \bmod 400$ \XOR $year \bmod 100$ \XOR $year \bmod 4$)} % \STATE $year$ does not represent a leap year. % \ENDIF % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \IF{\NOT ($year \bmod 400$ \XOR $year \bmod 100$ \XOR $year \bmod 4$)} % \STATE $year$ does not represent a leap year. % \ENDIF % \end{algorithmic} % % \subsection{The Precondition} % % The precondition (that must be met if an algorithm is to correctly % execute) takes the form: % \begin{verbatim} % \REQUIRE % \end{verbatim} % For example, % \begin{verbatim} % \begin{algorithmic} % \REQUIRE $x \neq 0$ and $n \geq 0$ % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \REQUIRE $x \neq 0$ and $n \geq 0$ % \end{algorithmic} % % \subsection{The Postcondition} % % The postcondition (that must be met after an algorithm has correctly % executed) takes the form: % \begin{verbatim} % \ENSURE % \end{verbatim} % For example, % \begin{verbatim} % \begin{algorithmic} % \ENSURE $x \neq 0$ and $n \geq 0$ % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \ENSURE $x \neq 0$ and $n \geq 0$ % \end{algorithmic} % % \subsection{Returning Values} % % The \keyword{algorithmic} environment offers a special statement for % explicitly returning values in algorithms. It has the syntax: % \begin{verbatim} % \RETURN % \end{verbatim} % For example, % \begin{verbatim} % \begin{algorithmic} % \RETURN $(x+y)/2$ % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \RETURN $(x+y)/2$ % \end{algorithmic} % % % \subsubsection{The ``true'' and ``false'' Values} % % Since many algorithms have the necessity of returning \emph{true} or % \emph{false} values, \keyword{algorithms}, starting with version % 2006-06-02, includes the keywords \verb+\TRUE+ and \verb+\FALSE+, % which are intented to print the values in a standard fashion, like the % following snippet of an algorithm to decide if an integer $n$ is even or % odd: % \begin{verbatim} % \begin{algorithmic} % \IF{$n$ is odd} % \RETURN \TRUE % \ELSE % \RETURN \FALSE % \ENDIF % \end{algorithmic} % \end{verbatim} % The code above produces the following output: % \begin{algorithmic} % \IF{$n$ is odd} % \RETURN \TRUE % \ELSE % \RETURN \FALSE % \ENDIF % \end{algorithmic} % % \subsection{Printing Messages} % % Another feature of the \keyword{algorithmic} environment is that it % currently provides a standard way of printing values (which is an % operation used enough to merit its own keyword). It has the syntax: % \begin{verbatim} % \PRINT % \end{verbatim} % For example, % \begin{verbatim} % \begin{algorithmic} % \PRINT \texttt{``Hello, World!''} % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \PRINT \texttt{``Hello, World!''} % \end{algorithmic} % % \subsection{Comments} % % Comments may be inserted at most points in an algorithm using the form: % \begin{verbatim} % \COMMENT{} % \end{verbatim} % For example, % \begin{verbatim} % \begin{algorithmic} % \STATE do something \COMMENT{this is a comment} % \end{algorithmic} % \end{verbatim} % produces % \begin{algorithmic} % \STATE do something \COMMENT{this is a comment} % \end{algorithmic} % Because the mechanisms used to build the various algorithmic structures % make it difficult to use the above mechanism for placing comments at the % end of the first line of a construct, the commands \verb+\IF+, % \verb+\ELSIF+, \verb+\ELSE+, \verb+\WHILE+, \verb+\FOR+, \verb+\FORALL+, % \verb+\REPEAT+ and \verb+\LOOP+ all take an optional argument which will % be treated as a comment to be placed at the end of the line on which % they appear. For example, % \begin{algorithmic} % \REPEAT[this is comment number one] % \IF[this is comment number two]{condition one is met} % \STATE do something % \ELSIF[this is comment number three]{condition two is met} % \STATE do something else % \ELSE[this is comment number four] % \STATE do nothing % \ENDIF % \UNTIL{hell freezes over} % \end{algorithmic} % % \subsection{An Example} % % The following example demonstrates the use of the \keyword{algorithmic} % environment to describe a complete algorithm. The following input % \begin{verbatim} % \begin{algorithmic} % \REQUIRE $n \geq 0$ % \ENSURE $y = x^n$ % \STATE $y \leftarrow 1$ % \STATE $X \leftarrow x$ % \STATE $N \leftarrow n$ % \WHILE{$N \neq 0$} % \IF{$N$ is even} % \STATE $X \leftarrow X \times X$ % \STATE $N \leftarrow N / 2$ % \ELSE[$N$ is odd] % \STATE $y \leftarrow y \times X$ % \STATE $N \leftarrow N - 1$ % \ENDIF % \ENDWHILE % \end{algorithmic} % \end{verbatim} % will produce % \begin{algorithmic} % \REQUIRE $n \geq 0$ % \ENSURE $y = x^n$ % % \STATE $y \leftarrow 1$ % \STATE $X \leftarrow x$ % \STATE $N \leftarrow n$ % \WHILE{$N \neq 0$} % \IF{$N$ is even} % \STATE $X \leftarrow X \times X$ % \STATE $N \leftarrow N / 2$ % \ELSE[$N$ is odd] % \STATE $y \leftarrow y \times X$ % \STATE $N \leftarrow N - 1$ % \ENDIF % \ENDWHILE % \end{algorithmic} % which is an algorithm for finding the value of a number taken to a % non-negative power. % % \subsection[Options/Customization]% % {Options and Customization} % % There is a single option, \keyword{noend}\label{kwd:noend} that may be % invoked when the \texttt{algorithmic} package is loaded. With this % option invoked the \emph{end} statements are omitted in the output. % This allows space to be saved in the output document when this is an % issue. % % \subsubsection{Changing Indentation} % \label{sec:changing-indentation} % In the spirit of saving vertical space (which is especially important % when submitting a paper for a journal, where space is frequently limited % for authors), the \keyword{algorithmic} environment offers, beginning % with the version released in 2005-05-08, a way to control the amount of % indentation that is used by a given algorithm. % % The amount of indentation to be used is given by the command % \begin{verbatim} % \algsetup{indent=lenght} % \end{verbatim} % where \emph{length} is any valid length used by \TeX. The default value % of the indentation used by the \keyword{algorithmic} environment is $1$ % em (for ``backward compatibility reasons''), but a value of $2$ em or % more is recommended, depending on the publication. For example, the % snippet % \begin{verbatim} % \algsetup{indent=2em} % \begin{algorithmic}[1] % \STATE $a \leftarrow 1$ % \IF{$a$ is even} % \PRINT ``$a$ is even'' % \ELSE % \PRINT ``$a$ is odd'' % \end{algorithmic} % \end{verbatim} % produces % \algsetup{indent=2em} % \begin{algorithmic}[1] % \STATE $a \leftarrow 1$ % \IF{$a$ is even} % \PRINT ``$a$ is even'' % \ELSE % \PRINT ``$a$ is odd'' % \ENDIF % \end{algorithmic} % while % \begin{verbatim} % \algsetup{indent=5em} % \begin{algorithmic}[1] % \STATE $a \leftarrow 1$ % \IF{$a$ is even} % \PRINT ``$a$ is even'' % \ELSE % \PRINT ``$a$ is odd'' % \end{algorithmic} % \end{verbatim} % would produce % \algsetup{indent=5em} % \begin{algorithmic}[1] % \STATE $a \leftarrow 1$ % \IF{$a$ is even} % \PRINT ``$a$ is even'' % \ELSE % \PRINT ``$a$ is odd'' % \ENDIF % \end{algorithmic} % \algsetup{indent=1em} % % The intended use of this option is to allow the author to omit the % \emph{end} (see Section~\ref{kwd:noend} for details) statements without % loosing readability, by increasing the amount of indentation to a % suitable level. % % \subsubsection{Changing Line Numbering} % % As mentioned in Section~\ref{sec:algorithmic-envir} and illustrated in % Section~\ref{sec:changing-indentation}, \keyword{algorithms} already % provides you with the possibility of numbering lines. % % Starting with the version released in 2005-07-05, you can now change two % aspects of line numbering: the size of the line numbers (which, by % default, is \verb+\footnotesize+) and the delimiter used to separate the % line number from the code (which, by default, is \verb+:+, i.e., a % colon). % % You can change the size of the line numbers using the command: % \begin{verbatim} % \algsetup{linenosize=size} % \end{verbatim} % where \emph{size} is any of the various commands provided by \LaTeX\ to % change the size of the font to be used. Among others, useful values are % \verb+\tiny+, \verb+\scriptsize+, \verb+\footnotesize+ and % \verb+\small+. Please see the complete list of sizes in your \LaTeX\ % documentation. % % As another frequently requested feature, you can change the delimiter % used with the line numbers by issuing the command: % \begin{verbatim} % \algsetup{linenodelimiter=delimiter} % \end{verbatim} % where \emph{delimiter} is any ``well-formed'' string, including the % empty string. With this command, you can change the colon to a period % (\verb+.+) by issuing the command % \begin{verbatim} % \algsetup{linenodelimiter=.} % \end{verbatim} % or even omit the delimiter, by specifying the empty string or a space % (\verb+\ +), whatever seems best for your document. % % As an example of such commands, the code produced by % \begin{verbatim} % \algsetup{ % linenosize=\small, % linenodelimiter=. % } % \begin{algorithmic}[1] % \STATE $i \leftarrow 10$ % \RETURN $i$ % \end{algorithmic} % \end{verbatim} % would be something like % % \algsetup{ % linenosize=\small, % linenodelimiter=. % } % \begin{algorithmic}[1] % \STATE $i \leftarrow 10$ % \RETURN $i$ % \end{algorithmic} % \algsetup{linenosize=\footnotesize, % linenodelimiter=:} % % \subsubsection{Customization} % % In order to facilitate the use of this package with foreign languages, % all of the words in the output are produced via redefinable macro % commands. The default definitions of these macros are: % \begin{verbatim} % \newcommand{\algorithmicrequire}{\textbf{Require:}} % \newcommand{\algorithmicensure}{\textbf{Ensure:}} % \newcommand{\algorithmicend}{\textbf{end}} % \newcommand{\algorithmicif}{\textbf{if}} % \newcommand{\algorithmicthen}{\textbf{then}} % \newcommand{\algorithmicelse}{\textbf{else}} % \newcommand{\algorithmicelsif}{\algorithmicelse\ \algorithmicif} % \newcommand{\algorithmicendif}{\algorithmicend\ \algorithmicif} % \newcommand{\algorithmicfor}{\textbf{for}} % \newcommand{\algorithmicforall}{\textbf{for all}} % \newcommand{\algorithmicdo}{\textbf{do}} % \newcommand{\algorithmicendfor}{\algorithmicend\ \algorithmicfor} % \newcommand{\algorithmicwhile}{\textbf{while}} % \newcommand{\algorithmicendwhile}{\algorithmicend\ \algorithmicwhile} % \newcommand{\algorithmicloop}{\textbf{loop}} % \newcommand{\algorithmicendloop}{\algorithmicend\ \algorithmicloop} % \newcommand{\algorithmicrepeat}{\textbf{repeat}} % \newcommand{\algorithmicuntil}{\textbf{until}} % \newcommand{\algorithmicprint}{\textbf{print}} % \newcommand{\algorithmicreturn}{\textbf{return}} % \newcommand{\algorithmictrue}{\textbf{true}} % \newcommand{\algorithmicfalse}{\textbf{false}} % \end{verbatim} % % If you would like to change the definition of these commands to another % content, then you should use, in your own document, the standard % \LaTeX{} command \keyword{renewcommand}, with an usage like this: % \begin{verbatim} % \renewcommand{\algorithmicrequire}{\textbf{Input:}} % \renewcommand{\algorithmicensure}{\textbf{Output:}} % \end{verbatim} % % \paragraph{About the Way Comments Are Formatted} % % The formatting of comments is implemented via a single argument command % macro which may also be redefined. The default definition is % \begin{verbatim} % \newcommand{\algorithmiccomment}[1]{\{#1\}} % \end{verbatim} % and another option that may be interesting for users familiar with % C-like languages is to redefine the comments to be % \begin{verbatim} % \renewcommand{\algorithmiccomment}[1]{// #1} % \end{verbatim} % Comments produced this way would be like this: % \renewcommand{\algorithmiccomment}[1]{// #1} % \begin{algorithmic} % \STATE $i \leftarrow i + 1$ \COMMENT{Increments $i$} % \end{algorithmic} % This second way to present comments may become the default in a future % version of this package. % % \section[Environment: \keyword{algorithm}]% % {The \keyword{algorithm} Environment} % % \subsection{General} % % When placed within the text without being encapsulated in a floating % environment \texttt{algorithmic} environments may be split over a page % boundary, greatly detracting from their appearance.\footnote{This is the % expected behaviour for floats in \LaTeX. If you don't care about % having your algorithm split between pages, then one option that you % have is to ignore the \texttt{algorithm} environment.} In addition, it % is useful to have algorithms numbered for reference and for lists of % algorithms to be appended to the list of contents. The % \texttt{algorithm} environment is meant to address these concerns by % providing a floating environment for algorithms. % % \subsection{An Example} % To illustrate the use of the \texttt{algorithm} environment, the % following text % \begin{verbatim} % \begin{algorithm} % \caption{Calculate $y = x^n$} % \label{alg1} % \begin{algorithmic} % \REQUIRE $n \geq 0 \vee x \neq 0$ % \ENSURE $y = x^n$ % \STATE $y \leftarrow 1$ % \IF{$n < 0$} % \STATE $X \leftarrow 1 / x$ % \STATE $N \leftarrow -n$ % \ELSE % \STATE $X \leftarrow x$ % \STATE $N \leftarrow n$ % \ENDIF % \WHILE{$N \neq 0$} % \IF{$N$ is even} % \STATE $X \leftarrow X \times X$ % \STATE $N \leftarrow N / 2$ % \ELSE[$N$ is odd] % \STATE $y \leftarrow y \times X$ % \STATE $N \leftarrow N - 1$ % \ENDIF % \ENDWHILE % \end{algorithmic} % \end{algorithm} % \end{verbatim} % produces Algorithm~\ref{alg1} which is a slightly modified version of % the earlier algorithm for determining the value of a number taken to an % integer power. In this case, provided the power may be negative % provided the number is not zero. % % \begin{algorithm}[H] % \caption{Calculate $y = x^n$} % \label{alg1} % \begin{algorithmic} % \REQUIRE $n \geq 0 \vee x \neq 0$ % \ENSURE $y = x^n$ % % \STATE $y \leftarrow 1$ % \IF{$n < 0$} % \STATE $X \leftarrow 1 / x$ % \STATE $N \leftarrow -n$ % \ELSE % \STATE $X \leftarrow x$ % \STATE $N \leftarrow n$ % \ENDIF % % \WHILE{$N \neq 0$} % \IF{$N$ is even} % \STATE $X \leftarrow X \times X$ % \STATE $N \leftarrow N / 2$ % \ELSE[$N$ is odd] % \STATE $y \leftarrow y \times X$ % \STATE $N \leftarrow N - 1$ % \ENDIF % \ENDWHILE % \end{algorithmic} % \end{algorithm} % % The command \verb+\listofalgorithms+ may be used to produce a list of % algorithms as part of the table contents as shown at the beginning of % this document. An auxiliary file with a suffix of \texttt{.loa} is % produced when this feature is used. % % \subsection{Options} % % The appearance of the typeset algorithm may be changed by use of the % options: \texttt{plain}, \texttt{boxed} or \texttt{ruled} during the % loading of the \texttt{algorithm} package. The default option is % \texttt{ruled}. % % The numbering of algorithms can be influenced by providing the name of % the document component within which numbering should be recommenced. % The legal values for this option are: \texttt{part}, \texttt{chapter}, % \texttt{section}, \texttt{subsection}, \texttt{subsubsection} or % \texttt{nothing}. The default value is \texttt{nothing} which causes % algorithms to be numbered sequentially throughout the document. % % \subsection{Customization} % % In order to facilitate the use of this package with foreign languages, % methods have been provided to facilitate the necessary modifications. % % The title used in the caption within \texttt{algorithm} environment can % be set by use of the standard \verb+\floatname+ command which is % provided as part of the \texttt{float} package which was used to % implement this package. For example, % \begin{verbatim} % \floatname{algorithm}{Procedure} % \end{verbatim} % would cause \textbf{Procedure} to be used instead of \textbf{Algorithm} % within the caption of algorithms. % % In a manner analogous to that available for the built in floating % environments, the heading used for the list of algorithms may be changed % by redefining the command \verb+listalgorithmname+. The default % definition for this command is % \begin{verbatim} % \newcommand{\listalgorithmname}{List of Algorithms} % \end{verbatim} % % \subsubsection{Placement of Algorithms} % % One important fact that many users may not have noticed is that the % \texttt{algorithm} environment is actually built with the \texttt{float} % package and \texttt{float}, in turn, uses David Carlisle's \textsf{here} % style option. This means that the floats generated by the % \texttt{algorithm} environment accept a special option, namely, % \textbf{[H]}, with a capital `H', instead of the usual `h' offered by % plain \LaTeX. % % This option works as a stronger request of ``please put the float % here'': instead of just a suggestion for \LaTeX, it actually means ``put % this float HERE'', which is something desired by many. The two % algorithms typeset in this document use this option. % % \medskip % \begin{warning} % You \emph{can't} use the `H' positioning option together with the % usual `h' (for ``here''), `b' (for ``bottom'') etc. This is a % limitation (as far as I know) of the \texttt{float.sty} package. % \end{warning} % % \section[References in Algorithms]% % {Labels and References in Algorithms} % % With the release of 2005-07-05, now \keyword{algorithmic} accepts labels % and references to specific lines of a given algorithm, so you don't have % to hardcode the line numbers yourself when trying to explain what the % code does in your texts. Thanks to Arnaud Legrand for the suggestion % and patch for this highly missed feature. % % An example of its use is shown in Algorithm~\ref{alg2}. % \begin{algorithm}[H] % \caption{Calculate $y = x^n$} % \label{alg2} % \begin{algorithmic}[1] % \REQUIRE $n \geq 0 \vee x \neq 0$ % \ENSURE $y = x^n$ % \STATE $y \leftarrow 1$ % \IF{$n < 0$} % \STATE $X \leftarrow 1 / x$ % \STATE $N \leftarrow -n$ % \ELSE % \STATE $X \leftarrow x$ % \STATE $N \leftarrow n$ % \ENDIF % \WHILE{$N \neq 0$} % \IF{$N$ is even}\label{alg:n-is-even} % \STATE $X \leftarrow X \times X$ % \STATE $N \leftarrow N / 2$ % \ELSE\label{alg:n-is-odd} % \STATE $y \leftarrow y \times X$ % \STATE $N \leftarrow N - 1$ % \ENDIF % \ENDWHILE % \end{algorithmic} % \end{algorithm} % See that, in line~\ref{alg:n-is-even}, we deal with the case of $N$ % being even, while, in line~\ref{alg:n-is-odd}, we give treatment to the % case of $N$ being odd. The numbers you see on this document were % generated automatically from the source document. % % % \section[Known Issues]{Issues Between \texttt{algorithms} and % \href{http://www.ctan.org/tex-archive/help/Catalogue/entries/tocbibind.html}{\texttt{tocbibind}} % or \href{http://www.ctan.org/tex-archive/help/Catalogue/entries/memoir.html}{\texttt{memoir}}} % % It % \href{http://groups.google.com/group/comp.text.tex/browse_thread/thread/4094e0c4f4fbd83e/a80a3f4666c794f0?fwc=1}{has % been discussed} in late 2005 that \texttt{algorithms} may have bad % interactions with the % \href{http://www.ctan.org/tex-archive/help/Catalogue/entries/tocbibind.html}{\texttt{tocbibind}} % or the % \href{http://www.ctan.org/tex-archive/help/Catalogue/entries/memoir.html}{\texttt{memoir}} % package (which includes \texttt{tocbibind}). % % A workaround has been suggested for the problem. After including % something like % \begin{verbatim} % \usepackage[nottoc]{tocbibind} % \end{verbatim} % in the preamble of your document, you can put, after % \verb+\begin{document}+, the following snippet of code: % \begin{verbatim} % \renewcommand{\listofalgorithms}{\begingroup % \tocfile{List of Algorithms}{loa} % \endgroup} % % \makeatletter % \let\l@algorithm\l@figure % \makeatother % \end{verbatim} % which should make the command \verb+\listofalgorithms+ work as expected. % % \section[General Hints]{Hints for Typesetting Algorithms} % % Here are some short hints on typesetting algorithms: % \begin{itemize} % \item Don't overcomment your pseudo-code. If you feel that you need to % comment too much, then you are probably doing something wrong: you should % probably detail the inner workings of the algorithm in regular text % rather than in the pseudo-code; % \item Similarly, don't regard pseudo-code as a low-level programming % language: \emph{don't pollute your algorithms} with punctuation marks % like semi-colons, which are necessary in C, C++ and Java, but not in % pseudo-code. Remember: your readers \emph{are not} compilers; % \item Always document what the algorithm receives as an input and what it % returns as a solution. Don't care to say in the \verb+\REQUIRE+ or in the % \verb+\ENSURE+ commands \emph{how} the algorithm does what it does. Put % this in the regular text of your book/paper/lecture notes; % \item If you feel that your pseudo-code is getting too big, just break it % into sub-algorithms, perhaps abstracting some tasks. Your readers will % probably thank you. % \end{itemize} % % Of course, you should follow those hints with common sense. Well, anything % should be done with common sense. % % \addtocontents{toc}{\protect\end{multicols}} % \end{document} % %\StopEventually{} %\RequirePackage{float} %\RequirePackage{ifthen} %\newcommand{\ALG@within}{nothing} %\newboolean{ALG@within} %\setboolean{ALG@within}{false} %\newcommand{\ALG@floatstyle}{ruled} %\newcommand{\ALG@name}{Algorithm} %\newcommand{\listalgorithmname}{List of \ALG@name s} % %% Declare Options: %% * first: appearance %\DeclareOption{plain}{ % \renewcommand{\ALG@floatstyle}{plain} %} %\DeclareOption{ruled}{ % \renewcommand{\ALG@floatstyle}{ruled} %} %\DeclareOption{boxed}{ % \renewcommand{\ALG@floatstyle}{boxed} %} %% * then: numbering convention %\DeclareOption{part}{ % \renewcommand{\ALG@within}{part} % \setboolean{ALG@within}{true} %} %\DeclareOption{chapter}{ % \renewcommand{\ALG@within}{chapter} % \setboolean{ALG@within}{true} %} %\DeclareOption{section}{ % \renewcommand{\ALG@within}{section} % \setboolean{ALG@within}{true} %} %\DeclareOption{subsection}{ % \renewcommand{\ALG@within}{subsection} % \setboolean{ALG@within}{true} %} %\DeclareOption{subsubsection}{ % \renewcommand{\ALG@within}{subsubsection} % \setboolean{ALG@within}{true} %} %\DeclareOption{nothing}{ % \renewcommand{\ALG@within}{nothing} % \setboolean{ALG@within}{true} %} %\DeclareOption*{\edef\ALG@name{\CurrentOption}} % %% ALGORITHM %% %\ProcessOptions %\floatstyle{\ALG@floatstyle} %\ifthenelse{\boolean{ALG@within}}{ % \ifthenelse{\equal{\ALG@within}{part}} % {\newfloat{algorithm}{htbp}{loa}[part]}{} % \ifthenelse{\equal{\ALG@within}{chapter}} % {\newfloat{algorithm}{htbp}{loa}[chapter]}{} % \ifthenelse{\equal{\ALG@within}{section}} % {\newfloat{algorithm}{htbp}{loa}[section]}{} % \ifthenelse{\equal{\ALG@within}{subsection}} % {\newfloat{algorithm}{htbp}{loa}[subsection]}{} % \ifthenelse{\equal{\ALG@within}{subsubsection}} % {\newfloat{algorithm}{htbp}{loa}[subsubsection]}{} % \ifthenelse{\equal{\ALG@within}{nothing}} % {\newfloat{algorithm}{htbp}{loa}}{} %}{ % \newfloat{algorithm}{htbp}{loa} %} %\floatname{algorithm}{\ALG@name} % %\newcommand{\listofalgorithms}{\listof{algorithm}{\listalgorithmname}} % % %% The algorithmic.sty package: % %\RequirePackage{ifthen} %\RequirePackage{keyval} %\newboolean{ALC@noend} %\setboolean{ALC@noend}{false} %\newcounter{ALC@unique} % new counter to make lines numbers be internally %\setcounter{ALC@unique}{0} % different in different algorithms %\newcounter{ALC@line} % counter for current line %\newcounter{ALC@rem} % counter for lines not printed %\newcounter{ALC@depth} %\newlength{\ALC@tlm} %% %\DeclareOption{noend}{\setboolean{ALC@noend}{true}} %% %\ProcessOptions %% %% For keyval-style options %\def\algsetup{\setkeys{ALG}} %% %% For indentation of algorithms %\newlength{\algorithmicindent} %\setlength{\algorithmicindent}{0pt} %\define@key{ALG}{indent}{\setlength{\algorithmicindent}{#1}} %\ifthenelse{\lengthtest{\algorithmicindent=0pt}}% % {\setlength{\algorithmicindent}{1em}}{} %% %% For line numbers' delimiters %\newcommand{\ALC@linenodelimiter}{:} %\define@key{ALG}{linenodelimiter}{\renewcommand{\ALC@linenodelimiter}{#1}} % %% %% For line numbers' size %\newcommand{\ALC@linenosize}{\footnotesize} %\define@key{ALG}{linenosize}{\renewcommand{\ALC@linenosize}{#1}} % %% %% ALGORITHMIC %\newcommand{\algorithmicrequire}{\textbf{Require:}} %\newcommand{\algorithmicensure}{\textbf{Ensure:}} %\newcommand{\algorithmiccomment}[1]{\{#1\}} %\newcommand{\algorithmicend}{\textbf{end}} %\newcommand{\algorithmicif}{\textbf{if}} %\newcommand{\algorithmicthen}{\textbf{then}} %\newcommand{\algorithmicelse}{\textbf{else}} %\newcommand{\algorithmicelsif}{\algorithmicelse\ \algorithmicif} %\newcommand{\algorithmicendif}{\algorithmicend\ \algorithmicif} %\newcommand{\algorithmicfor}{\textbf{for}} %\newcommand{\algorithmicforall}{\textbf{for all}} %\newcommand{\algorithmicdo}{\textbf{do}} %\newcommand{\algorithmicendfor}{\algorithmicend\ \algorithmicfor} %\newcommand{\algorithmicwhile}{\textbf{while}} %\newcommand{\algorithmicendwhile}{\algorithmicend\ \algorithmicwhile} %\newcommand{\algorithmicloop}{\textbf{loop}} %\newcommand{\algorithmicendloop}{\algorithmicend\ \algorithmicloop} %\newcommand{\algorithmicrepeat}{\textbf{repeat}} %\newcommand{\algorithmicuntil}{\textbf{until}} %\newcommand{\algorithmicprint}{\textbf{print}} %\newcommand{\algorithmicreturn}{\textbf{return}} %\newcommand{\algorithmicand}{\textbf{and}} %\newcommand{\algorithmicor}{\textbf{or}} %\newcommand{\algorithmicxor}{\textbf{xor}} %\newcommand{\algorithmicnot}{\textbf{not}} %\newcommand{\algorithmicto}{\textbf{to}} %\newcommand{\algorithmicinputs}{\textbf{inputs}} %\newcommand{\algorithmicoutputs}{\textbf{outputs}} %\newcommand{\algorithmicglobals}{\textbf{globals}} %\newcommand{\algorithmicbody}{\textbf{do}} %\newcommand{\algorithmictrue}{\textbf{true}} %\newcommand{\algorithmicfalse}{\textbf{false}} %\def\ALC@item[#1]{% %\if@noparitem \@donoparitem % \else \if@inlabel \indent \par \fi % \ifhmode \unskip\unskip \par \fi % \if@newlist \if@nobreak \@nbitem \else % \addpenalty\@beginparpenalty % \addvspace\@topsep \addvspace{-\parskip}\fi % \else \addpenalty\@itempenalty \addvspace\itemsep % \fi % \global\@inlabeltrue %\fi %\everypar{\global\@minipagefalse\global\@newlistfalse % \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels % \penalty\z@ \fi % \everypar{}}\global\@nobreakfalse %\if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi %\sbox\@tempboxa{\makelabel{#1}}% %\global\setbox\@labels % \hbox{\unhbox\@labels \hskip \itemindent % \hskip -\labelwidth \hskip -\ALC@tlm % \ifdim \wd\@tempboxa >\labelwidth % \box\@tempboxa % \else \hbox to\labelwidth {\unhbox\@tempboxa}\fi % \hskip \ALC@tlm}\ignorespaces} %% %\newenvironment{algorithmic}[1][0]{ %\setcounter{ALC@depth}{\@listdepth}% %\let\@listdepth\c@ALC@depth% %\let\@item\ALC@item% % \newcommand{\ALC@lno}{% %\ifthenelse{\equal{\arabic{ALC@rem}}{0}} %{{\ALC@linenosize \arabic{ALC@line}\ALC@linenodelimiter}}{}% %} %\let\@listii\@listi %\let\@listiii\@listi %\let\@listiv\@listi %\let\@listv\@listi %\let\@listvi\@listi %\let\@listvii\@listi % \newenvironment{ALC@g}{ % \begin{list}{\ALC@lno}{ \itemsep\z@ \itemindent\z@ % \listparindent\z@ \rightmargin\z@ % \topsep\z@ \partopsep\z@ \parskip\z@\parsep\z@ % \leftmargin \algorithmicindent%1em % \addtolength{\ALC@tlm}{\leftmargin} % } % } % {\end{list}} % \newcommand{\ALC@it}{% % \stepcounter{ALC@rem}% % \ifthenelse{\equal{\arabic{ALC@rem}}{#1}}{\setcounter{ALC@rem}{0}}{}% % \stepcounter{ALC@line}% % \refstepcounter{ALC@unique}% % \item\def\@currentlabel{\theALC@line}% % } % \newcommand{\ALC@com}[1]{\ifthenelse{\equal{##1}{default}}% %{}{\ \algorithmiccomment{##1}}} % \newcommand{\REQUIRE}{\item[\algorithmicrequire]} % \newcommand{\ENSURE}{\item[\algorithmicensure]} % \newcommand{\PRINT}{\ALC@it\algorithmicprint{} \ } % \newcommand{\RETURN}{\ALC@it\algorithmicreturn{} \ } % \newcommand{\TRUE}{\algorithmictrue{}} % \newcommand{\FALSE}{\algorithmicfalse{}} % \newcommand{\AND}{\algorithmicand{} } % \newcommand{\OR}{\algorithmicor{} } % \newcommand{\XOR}{\algorithmicxor{} } % \newcommand{\NOT}{\algorithmicnot{} } % \newcommand{\TO}{\algorithmicto{} } % \newcommand{\STATE}{\ALC@it} % \newcommand{\STMT}{\ALC@it} % \newcommand{\COMMENT}[1]{\algorithmiccomment{##1}} % \newenvironment{ALC@inputs}{\begin{ALC@g}}{\end{ALC@g}} % \newenvironment{ALC@outputs}{\begin{ALC@g}}{\end{ALC@g}} % \newenvironment{ALC@globals}{\begin{ALC@g}}{\end{ALC@g}} % \newenvironment{ALC@body}{\begin{ALC@g}}{\end{ALC@g}} % \newenvironment{ALC@if}{\begin{ALC@g}}{\end{ALC@g}} % \newenvironment{ALC@for}{\begin{ALC@g}}{\end{ALC@g}} % \newenvironment{ALC@whl}{\begin{ALC@g}}{\end{ALC@g}} % \newenvironment{ALC@loop}{\begin{ALC@g}}{\end{ALC@g}} % \newenvironment{ALC@rpt}{\begin{ALC@g}}{\end{ALC@g}} % \renewcommand{\\}{\@centercr} % \newcommand{\INPUTS}[1][default]{\ALC@it\algorithmicinputs\ \ALC@com{##1}\begin{ALC@inputs}} % \newcommand{\ENDINPUTS}{\end{ALC@inputs}} % \newcommand{\OUTPUTS}[1][default]{\ALC@it\algorithmicoutputs\ \ALC@com{##1}\begin{ALC@outputs}} % \newcommand{\ENDOUTPUTS}{\end{ALC@outputs}} % \newcommand{\GLOBALS}{\ALC@it\algorithmicglobals\ } % \newcommand{\BODY}[1][default]{\ALC@it\algorithmicbody\ \ALC@com{##1}\begin{ALC@body}} % \newcommand{\ENDBODY}{\end{ALC@body}} % \newcommand{\IF}[2][default]{\ALC@it\algorithmicif\ ##2\ \algorithmicthen% %\ALC@com{##1}\begin{ALC@if}} % \newcommand{\ELSE}[1][default]{\end{ALC@if}\ALC@it\algorithmicelse% %\ALC@com{##1}\begin{ALC@if}} % \newcommand{\ELSIF}[2][default]% %{\end{ALC@if}\ALC@it\algorithmicelsif\ ##2\ \algorithmicthen% %\ALC@com{##1}\begin{ALC@if}} % \newcommand{\FOR}[2][default]{\ALC@it\algorithmicfor\ ##2\ \algorithmicdo% %\ALC@com{##1}\begin{ALC@for}} % \newcommand{\FORALL}[2][default]{\ALC@it\algorithmicforall\ ##2\ % %\algorithmicdo% %\ALC@com{##1}\begin{ALC@for}} % \newcommand{\WHILE}[2][default]{\ALC@it\algorithmicwhile\ ##2\ % %\algorithmicdo% %\ALC@com{##1}\begin{ALC@whl}} % \newcommand{\LOOP}[1][default]{\ALC@it\algorithmicloop% %\ALC@com{##1}\begin{ALC@loop}} % \newcommand{\REPEAT}[1][default]{\ALC@it\algorithmicrepeat% %\ALC@com{##1}\begin{ALC@rpt}} % \newcommand{\UNTIL}[1]{\end{ALC@rpt}\ALC@it\algorithmicuntil\ ##1} % \ifthenelse{\boolean{ALC@noend}}{ % \newcommand{\ENDIF}{\end{ALC@if}} % \newcommand{\ENDFOR}{\end{ALC@for}} % \newcommand{\ENDWHILE}{\end{ALC@whl}} % \newcommand{\ENDLOOP}{\end{ALC@loop}} % }{ % \newcommand{\ENDIF}{\end{ALC@if}\ALC@it\algorithmicendif} % \newcommand{\ENDFOR}{\end{ALC@for}\ALC@it\algorithmicendfor} % \newcommand{\ENDWHILE}{\end{ALC@whl}\ALC@it\algorithmicendwhile} % \newcommand{\ENDLOOP}{\end{ALC@loop}\ALC@it\algorithmicendloop} % } % \renewcommand{\@toodeep}{} % \begin{list}{\ALC@lno}{\setcounter{ALC@rem}{0}\setcounter{ALC@line}{0}% % \itemsep\z@ \itemindent\z@ \listparindent\z@% % \partopsep\z@ \parskip\z@ \parsep\z@% % \labelsep 0.5em \topsep 0.2em% %\ifthenelse{\equal{#1}{0}} % {\labelwidth 0.5em } % {\labelwidth 1.2em } %\leftmargin\labelwidth \addtolength{\leftmargin}{\labelsep} % \ALC@tlm\labelsep % } %} %{\end{list}} %\Finale %\PrintChanges %\PrintIndex