# Command for the table Ruffini-Horner algorithm

I am trying to code a command in LaTeX to type the tables used in the computation of the Ruffini-Horner algorithm. You can see in the Wikipedia link above that these are rather simple tables. There is a vertical line at the beginning, after the first column, and there is a horizontal line at the end, before the last row.

I would like to have a command that I can pass the numerical entries of the table and ir draw the rest.

How to do this?

I would like something like \ruffini{...} and in entries we either enter the list of numbers, perhaps separated by commas. Or maybe even entering the numbers with the separators & and \\ to format in what position the go in the table. But I wouldn't want to be thinking about the lines in the table. I would like the command to take care of the line.

We can build the table row by row; the syntax is:

\ruffini{<list of coefficients>}
{<divisor>}
{<list of numbers for the computation>}
{<list of coefficients for the result>}


Here are the macros:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ruffini}{mmmm}
{% #1 = polynomial, #2 = divisor, #3 = middle row, #4 = result
\franklin_ruffini:nnnn { #1 } { #2 } { #3 } { #4 }
}

\seq_new:N \l_franklin_temp_seq
\tl_new:N \l_franklin_scheme_tl
\int_new:N \l_franklin_degree_int

\cs_new_protected:Npn \franklin_ruffini:nnnn #1 #2 #3 #4
{
% Start the first row
\tl_set:Nn \l_franklin_scheme_tl { #2 & }
% Split the list of coefficients
\seq_set_split:Nnn \l_franklin_temp_seq { , } { #1 }
% Remember the number of columns
\int_set:Nn \l_franklin_degree_int { \seq_count:N \l_franklin_temp_seq }
% Fill the first row
\tl_put_right:Nx \l_franklin_scheme_tl
{ \seq_use:Nnnn \l_franklin_temp_seq { & } { & } { & } }
% End the first row and leave two empty places in the next
\tl_put_right:Nn \l_franklin_scheme_tl { \\ & & }
% Split the list of coefficients and fill the second row
\seq_set_split:Nnn \l_franklin_temp_seq { , } { #3 }
\tl_put_right:Nx \l_franklin_scheme_tl
{ \seq_use:Nnnn \l_franklin_temp_seq { & } { & } { & } }
% End the second row
\tl_put_right:Nn \l_franklin_scheme_tl { \\ }
% Compute the \cline command
\tl_put_right:Nx \l_franklin_scheme_tl
{
\exp_not:N \cline { 2-\int_to_arabic:n { \l_franklin_degree_int + 1 } }
}
% Leave an empty place in the third row (no rule either)
\tl_put_right:Nn \l_franklin_scheme_tl { \multicolumn{1}{r}{} & }
% Split and fill the third row
\seq_set_split:Nnn \l_franklin_temp_seq { , } { #4 }
\tl_put_right:Nx \l_franklin_scheme_tl
{ \seq_use:Nnnn \l_franklin_temp_seq { & } { & } { & } }
% Start the array (with \use:x because the array package
% doesn't expand the argument)
\use:x
{
\exp_not:n { \begin{array} } { r | *{\int_use:N \l_franklin_degree_int} { r } }
}
% Body of the array and finish
\tl_use:N \l_franklin_scheme_tl
\end{array}
}
\ExplSyntaxOff

\begin{document}
$\ruffini{1,-6,11,-6}{2}{2,-8,6}{1,-4,3,0}$
\end{document}


A variation for the “Italian style” scheme.

\documentclass{article}
\usepackage{xparse,array}

\ExplSyntaxOn

\NewDocumentCommand{\ruffini}{mmmm}
{% #1 = polynomial, #2 = divisor, #3 = middle row, #4 = result
\franklin_ruffini:nnnn { #1 } { #2 } { #3 } { #4 }
}

\seq_new:N \l_franklin_temp_seq
\tl_new:N \l_franklin_scheme_tl
\int_new:N \l_franklin_degree_int

\cs_new_protected:Npn \franklin_ruffini:nnnn #1 #2 #3 #4
{
% Start the first row
\tl_set:Nn \l_franklin_scheme_tl { & }
% Split the list of coefficients
\seq_set_split:Nnn \l_franklin_temp_seq { , } { #1 }
% Remember the number of columns
\int_set:Nn \l_franklin_degree_int { \seq_count:N \l_franklin_temp_seq }
% Fill the first row
\tl_put_right:Nx \l_franklin_scheme_tl
{ \seq_use:Nn \l_franklin_temp_seq { & } }
% End the first row and leave two empty places in the next
\tl_put_right:Nn \l_franklin_scheme_tl { \\ #2 & & }
% Split the list of coefficients and fill the second row
\seq_set_split:Nnn \l_franklin_temp_seq { , } { #3 }
\tl_put_right:Nx \l_franklin_scheme_tl
{ \seq_use:Nn \l_franklin_temp_seq { & } }
% End the second row
\tl_put_right:Nn \l_franklin_scheme_tl { \\ \hline }
% Split and fill the third row
\seq_set_split:Nnn \l_franklin_temp_seq { , } { #4 }
\tl_put_right:Nx \l_franklin_scheme_tl
{ & \seq_use:Nn \l_franklin_temp_seq { & } }
% Start the array (with \use:x because the array package
% doesn't expand the argument)
\use:x
{
\exp_not:n { \begin{array} } { r | *{\int_eval:n { \l_franklin_degree_int - 1 }} { r } | r }
}
% Body of the array and finish
\tl_use:N \l_franklin_scheme_tl
\end{array}
}
\ExplSyntaxOff

\begin{document}
$\ruffini{1,-6,11,-6}{2}{2,-8,6}{1,-4,3,0}$
\end{document}


• Can I be picky? It gets an error for constant polynomials. – Anna Taurogenireva Jul 6 '13 at 17:34
• Well, there's not much do do in that case; add a test for \l_franklin_degree_int=1. ;-) – egreg Jul 6 '13 at 19:26

There is a much easier way to get this: using the polynom package, as follows:

\usepackage{polynom}


and

\begin{center}
\polyhornerscheme[x=2]{x^3-6x^2+11x-6}
\end{center}

• Yes, but the placement is different than in the linked examples. Good alternative, though. – egreg Apr 23 at 23:23