Horner's rule for polynomial evaluation: Difference between revisions
Horner's rule for polynomial evaluation (view source)
Revision as of 15:32, 27 August 2022
, 1 year agosyntax highlighting fixup automation
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
|||
Line 24:
{{trans|Python}}
<
V acc = 0
L(c) reversed(coeffs)
Line 30:
R acc
print(horner([-19, 7, -4, 6], 3))</
{{out}}
Line 38:
=={{header|360 Assembly}}==
<
HORNER CSECT
USING HORNER,R15 set base register
Line 58:
PG DS CL12 buffer
YREGS
END HORNER</
{{out}}
<pre>
Line 65:
=={{header|ACL2}}==
<
(if (endp ps)
0
(+ (first ps)
(* x (horner (rest ps) x)))))</
=={{header|Action!}}==
<
INT v,i
Line 102:
res=Horner(coeffs,4,x)
PrintF("=%I%E",res)
RETURN</
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Horner's_rule_for_polynomial_evaluation.png Screenshot from Atari 8-bit computer]
Line 111:
=={{header|Ada}}==
<
procedure Horners_Rule is
Line 127:
begin
Put(Horner(Coeffs => (-19.0, 7.0, -4.0, 6.0), Val => 3.0), Aft=>1, Exp=>0);
end Horners_Rule;</
Output:
<pre>128.0</pre>
=={{header|Aime}}==
<
horner(list coeffs, real x)
{
Line 154:
0;
}</
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G}}
<
(
REAL res := 0.0;
Line 170:
[4]REAL coeffs := (-19.0, 7.0, -4.0, 6.0);
print( horner(coeffs, 3.0) )
)</
=={{header|ALGOL W}}==
<
% Horner's rule for polynominal evaluation %
% returns the value of the polynominal defined by coefficients, %
Line 199:
write( r_format := "A", r_w := 8, r_d := 2, Horner( coefficients, 4, 3 ) )
end test_cases
end.</
{{out}}
<pre>
Line 207:
=={{header|APL}}==
Works in [[Dyalog APL]]
<syntaxhighlight lang
{{output}}
<pre>
Line 215:
=={{header|ATS}}==
<
"share/atspre_staload.hats"
Line 238:
in
println! (res)
end // end of [main0]</
=={{header|Arturo}}==
<
result: 0
loop reverse coeffs 'c ->
Line 249:
]
print horner @[neg 19, 7, neg 4, 6] 3</
{{out}}
Line 256:
=={{header|AutoHotkey}}==
<
x := 3
Line 271:
i := Co0 - A_Index + 1, Result := Result * x + Co%i%
Return, Result
}</
Message box shows:
<pre>128</pre>
=={{header|AWK}}==
<
function horner(x, A) {
acc = 0;
Line 287:
split(p,P);
print horner(x,P);
}</
{{out}}
Line 296:
=={{header|Batch File}}==
<
@echo off
Line 320:
echo %return%
exit /b
</syntaxhighlight>
{{out}}
<pre>
Line 330:
=={{header|BBC BASIC}}==
<
coefficients() = -19, 7, -4, 6
PRINT FNhorner(coefficients(), 3)
Line 340:
v = v * x + coeffs(i%)
NEXT
= v</
=={{header|Bracmat}}==
<
= accumulator coefficients x coeff
. !arg:(?coefficients.?x)
Line 354:
)
& Horner$(-19 7 -4 6.3)
);</
Output:
<pre>128</pre>
Line 360:
=={{header|C}}==
{{trans|Fortran}}
<
double horner(double *coeffs, int s, double x)
Line 381:
printf("%5.1f\n", horner(coeffs, sizeof(coeffs)/sizeof(double), 3.0));
return 0;
}</
=={{header|C sharp|C#}}==
<
using System.Linq;
Line 399:
Console.WriteLine(Horner(new[] { -19.0, 7.0, -4.0, 6.0 }, 3.0));
}
}</
Output:
<pre>128</pre>
Line 406:
The same C function works too, but another solution could be:
<
#include <vector>
Line 426:
cout << horner(v, 3.0) << endl;
return 0;
}</
Yet another solution, which is more idiomatic in C++ and works on any bidirectional sequence:
<
#include <iostream>
Line 447:
std::cout << horner(c, c + 4, 3) << std::endl;
}
</syntaxhighlight>
=={{header|Clojure}}==
<
(reduce #(-> %1 (* x) (+ %2)) (reverse coeffs)))
(println (horner [-19 7 -4 6] 3))</
=={{header|CoffeeScript}}==
<
eval_poly = (x, coefficients) ->
# coefficients are for ascending powers
Line 466:
console.log eval_poly 10, [4, 3, 2, 1] # 1234
console.log eval_poly 2, [1, 1, 0, 0, 1] # 19
</syntaxhighlight>
=={{header|Common Lisp}}==
<
(reduce #'(lambda (coef acc) (+ (* acc x) coef))
coeffs :from-end t :initial-value 0))</
Alternate version using LOOP. Coefficients are passed in a vector.
<
(loop :with y = 0
:for i :from (1- (length a)) :downto 0
Line 481:
:finally (return y)))
(horner 1.414 #(-2 0 1))</
=={{header|D}}==
The poly() function of the standard library std.math module uses Horner's rule:
<
void main() {
import std.stdio, std.math;
Line 493:
poly(x,pp).writeln;
}
}</
Basic implementation:
<
CommonType!(U, V) horner(U, V)(U[] p, V x) pure nothrow @nogc {
Line 506:
void main() {
[-19, 7, -4, 6].horner(3.0).writeln;
}</
More functional style:
<
auto horner(T, U)(in T[] p, in U x) pure nothrow @nogc {
Line 516:
void main() {
[-19, 7, -4, 6].horner(3.0).writeln;
}</
=={{header|E}}==
<
def indexing := (0..!coefficients.size()).descending()
return def hornerPolynomial(x) {
Line 529:
return acc
}
}</
<
# value: 128</
=={{header|EchoLisp}}==
=== Functional version ===
<
(define (horner x poly)
(foldr (lambda (coeff acc) (+ coeff (* acc x))) 0 poly))
(horner 3 '(-19 7 -4 6)) → 128
</syntaxhighlight>
=== Library ===
<
(lib 'math)
Lib: math.lib loaded.
Line 550:
(poly->string 'x P) → 6x^3 -4x^2 +7x -19
(poly 3 P) → 128
</syntaxhighlight>
=={{header|EDSAC order code}}==
<
[Copyright <2021> <ERIK SARGSYAN>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
Line 615:
EZPF
</syntaxhighlight>
{{out}}
<pre>
Line 624:
{{trans|C#}}
ELENA 5.0 :
<
import system'routines;
Line 635:
{
console.printLine(horner(new real[]{-19.0r, 7.0r, -4.0r, 6.0r}, 3.0r))
}</
{{out}}
<pre>
Line 642:
=={{header|Elixir}}==
<
IO.puts horner.([-19,7,-4,6], 3)</
{{out}}
Line 653:
=={{header|Emacs Lisp}}==
{{trans|Common Lisp}}
<
(defun horner (coeffs x)
Line 659:
coeffs :from-end t :initial-value 0))
(horner '(-19 7 -4 6) 3)</
{{out}}
Line 666:
=={{header|Erlang}}==
<
horner(L,X) ->
lists:foldl(fun(C, Acc) -> X*Acc+C end,0, lists:reverse(L)).
t() ->
horner([-19,7,-4,6], 3).
</syntaxhighlight>
=={{header|ERRE}}==
<syntaxhighlight lang="erre">
PROGRAM HORNER
Line 696:
PRINT(RES)
END PROGRAM
</syntaxhighlight>
=={{header|Euler Math Toolbox}}==
<syntaxhighlight lang="euler math toolbox">
>function horner (x,v) ...
$ n=cols(v); res=v{n};
Line 719:
3 2
6 x - 4 x + 7 x - 19
</syntaxhighlight>
=={{header|F Sharp|F#}}==
<
let horner l x =
List.rev l |> List.fold ( fun acc c -> x*acc+c) 0
horner [-19;7;-4;6] 3
</syntaxhighlight>
=={{header|Factor}}==
<
[ <reversed> 0 ] dip '[ [ _ * ] dip + ] reduce ;</
( scratchpad ) { -19 7 -4 6 } 3 horner .
Line 737:
=={{header|Forth}}==
<
0e
floats bounds ?do
Line 746:
create coeffs 6e f, -4e f, 7e f, -19e f,
coeffs 4 3e fhorner f. \ 128.</
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<
implicit none
Line 773:
end function horner
end program test_horner</
Output:
<pre>128.0</pre>
=== Fortran 77 ===
<
IMPLICIT NONE
INTEGER I,N
Line 787:
END DO
HORNER=Y
END</
As a matter of fact, computing the derivative is not much more difficult (see [http://www.cs.berkeley.edu/~wkahan/Math128/Poly.pdf Roundoff in Polynomial Evaluation], W. Kahan, 1986). The following subroutine computes both polynomial value and derivative for argument x.
<
C COMPUTE POLYNOMIAL VALUE AND DERIVATIVE
C SEE "ROUNDOFF IN POLYNOMIAL EVALUATION", W. KAHAN, 1986
Line 805:
10 Y = Y*X + A(I)
END
</syntaxhighlight>
=={{header|FreeBASIC}}==
<
Function AlgoritmoHorner(coeffs() As Integer, x As Integer) As Integer
Dim As Integer i, acumulador = 0
Line 822:
Print AlgoritmoHorner(coeficientes(), x)
End
</syntaxhighlight>
{{out}}
<pre>
Line 830:
=={{header|FunL}}==
{{trans|Haskell}}
<
def horner( poly, x ) = foldr( \a, b -> a + b*x, 0, poly )
println( horner([-19, 7, -4, 6], 3) )</
{{out}}
Line 843:
=={{header|FutureBasic}}==
<
local fn horner( coeffs as CFArrayRef, x as NSInteger ) as double
Line 876:
NSLog( @"%7.1f", fn horner( coeffs, 2 ) )
HandleEvents</
{{out}}
Line 889:
=={{header|GAP}}==
<
x := Indeterminate(Rationals, "x");
Line 920:
Horner(u, 3);
# 128</
=={{header|Go}}==
<
import "fmt"
Line 936:
func main() {
fmt.Println(horner(3, []int64{-19, 7, -4, 6}))
}</
Output:
<pre>
Line 944:
=={{header|Groovy}}==
Solution:
<
Test includes demonstration of [[currying]] to create polynomial functions of one variable from generic Horner's rule calculation. Also demonstrates constructing the derivative function for the given polynomial. And finally demonstrates in the Newton-Raphson method to find one of the polynomial's roots using the polynomial and derivative functions constructed earlier.
<
println (["p coefficients":coefficients])
Line 969:
def root = newtonRaphson(3g, testPoly, testDeriv)
println ([root:root.toString()[0..5], "p(root)":testPoly(root).toString()[0..5], "p'(root)":testDeriv(root).toString()[0..5]])</
Output:
Line 981:
=={{header|Haskell}}==
<
horner x = foldr (\a b -> a + b*x) 0
main = print $ horner 3 [-19, 7, -4, 6]</
=={{header|HicEst}}==
<
DATA coeffs/-19.0, 7.0, -4.0, 6.0/
Line 998:
Horner = x*Horner + c(i)
ENDDO
END</
=={{header|Icon}} and {{header|Unicon}}==
<syntaxhighlight lang="icon">
procedure poly_eval (x, coeffs)
accumulator := 0
Line 1,013:
write (poly_eval (3, [-19, 7, -4, 6]))
end
</syntaxhighlight>
=={{header|J}}==
'''Solution''':<
horner =: (#."0 _ |.)~ NB. Tacit
horner =: [: +`*/ [: }: ,@,. NB. Alternate tacit (equivalent)
horner =: 4 : ' (+ *&y)/x' NB. Alternate explicit (equivalent)
</syntaxhighlight>
'''Example''':<
128</
'''Note:'''<br>
The primitive verb <code>p.</code> would normally be used to evaluate polynomials.
<
128</
=={{header|Java}}==
{{works with|Java|1.5+}}
<
import java.util.Collections;
import java.util.List;
Line 1,052:
return accumulator;
}
}</
Output:
<pre>128.0</pre>
Line 1,060:
{{trans|Haskell}}
<
return coeffs.reduceRight( function(acc, coeff) { return(acc * x + coeff) }, 0);
}
console.log(horner([-19,7,-4,6],3)); // ==> 128
</syntaxhighlight>
=={{header|Julia}}==
Line 1,070:
'''Imperative''':
<
s = coefs[end] * one(x)
for k in length(coefs)-1:-1:1
Line 1,078:
end
@show horner([-19, 7, -4, 6], 3)</
{{out}}
Line 1,084:
'''Functional''':
<
@show horner2([-19, 7, -4, 6], 3)</
{{out}}
Line 1,093:
'''Note''':
In Julia 1.4 or later one would normally use the built-in '''evalpoly''' function for this purpose:
<
@show evalpoly(3, [-19, 7, -4, 6]) </
{{out}}
Line 1,100:
=={{header|K}}==
<syntaxhighlight lang="k">
horner:{y _sv|x}
horner[-19 7 -4 6;3]
128
</syntaxhighlight>
=={{header|Kotlin}}==
<
fun horner(coeffs: DoubleArray, x: Double): Double {
Line 1,118:
val coeffs = doubleArrayOf(-19.0, 7.0, -4.0, 6.0)
println(horner(coeffs, 3.0))
}</
{{out}}
Line 1,126:
=={{header|Lambdatalk}}==
<
{def horner
{def horner.r
Line 1,143:
-> 2.220446049250313e-16 ~ 0
</syntaxhighlight>
=={{header|Liberty BASIC}}==
<
coefficients$ = "-19 7 -4 6" ' list coefficients of all x^0..x^n in order
x = 3
Line 1,165:
horner = accumulator
end function
</
=={{header|Logo}}==
<
if empty? :coeffs [output 0]
output (first :coeffs) + (:x * horner :x bf :coeffs)
end
show horner 3 [-19 7 -4 6] ; 128</
=={{header|Lua}}==
<
local res = 0
for i = #coeff, 1, -1 do
Line 1,186:
x = 3
coefficients = { -19, 7, -4, 6 }
print( horners_rule( coefficients, x ) )</
=={{header|Maple}}==
<syntaxhighlight lang="maple">
applyhorner:=(L::list,x)->foldl((s,t)->s*x+t,op(ListTools:-Reverse(L))):
Line 1,195:
applyhorner([-19,7,-4,6],3);
</syntaxhighlight>
Output:
<pre>
Line 1,204:
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<
Horner[{6, -4, 7, -19}, x]
-> -19 + x (7 + x (-4 + 6 x))
-19 + x (7 + x (-4 + 6 x)) /. x -> 3
-> 128</
=={{header|MATLAB}}==
<
accumulator = 0;
Line 1,220:
end
end</
Output:
<
ans =
128</
Matlab also has a built-in function "polyval" which uses Horner's Method to evaluate polynomials. The list of coefficients is in descending order of power, where as to task spec specifies ascending order.
<
ans =
128</
=={{header|Maxima}}==
<
horner(5*x^3+2*x+1);
x*(5*x^2+2)+1
Line 1,279:
poleval([0, 0, 0, 0, 1], x);
x^4</
=={{header|Mercury}}==
<
:- module horner.
:- interface.
Line 1,296:
horner(X, Cs) = list.foldr((func(C, Acc) = Acc * X + C), Cs, 0).
</syntaxhighlight>
=={{header|МК-61/52}}==
<syntaxhighlight lang="text">ИП0 1 + П0
ИПE ИПD * КИП0 + ПE
ИП0 1 - x=0 04
ИПE С/П</
''Input:'' Р1:РС - coefficients, Р0 - number of the coefficients, РD - ''x''.
=={{header|Modula-2}}==
<
FROM RealStr IMPORT RealToStr;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
Line 1,335:
WriteLn;
ReadChar
END Horner.</
=={{header|NetRexx}}==
<
options replace format comments java crossref savelog symbols nobinary
Line 1,349:
End
Say r
Say 6*x**3-4*x**2+7*x-19</
'''Output:'''
<pre>128
Line 1,355:
=={{header|Nim}}==
<
iterator reversed[T](x: openArray[T]): T =
for i in countdown(x.high, x.low):
Line 1,364:
result = result * x + c
echo horner([-19, 7, -4, 6], 3)</
=={{header|Oberon-2}}==
{{works with|oo2c}}
<
MODULE HornerRule;
IMPORT
Line 1,397:
Out.Int(Eval(coefs^,4,3),0);Out.Ln
END HornerRule.
</syntaxhighlight>
{{out}}
<pre>
Line 1,404:
=={{header|Objeck}}==
<
class Horner {
function : Main(args : String[]) ~ Nil {
Line 1,424:
}
}
</syntaxhighlight>
=={{header|Objective-C}}==
{{works with|Mac OS X|10.6+}} Using blocks
<
typedef double (^mfunc)(double, double);
Line 1,469:
}
return 0;
}</
=={{header|OCaml}}==
<
List.fold_left (fun acc coef -> acc * x + coef) 0 (List.rev coeffs) ;;
val horner : int list -> int -> int = <fun>
Line 1,479:
# let coeffs = [-19; 7; -4; 6] in
horner coeffs 3 ;;
- : int = 128</
It's also possible to do fold_right instead of reversing and doing fold_left; but fold_right is not tail-recursive.
=={{header|Octave}}==
<
r = 0.0;
for i = length(a):-1:1
Line 1,490:
endfunction
horner([-19, 7, -4, 6], 3)</
=={{header|ooRexx}}==
<
* 04.03.2014 Walter Pachl
*--------------------------------------------------------------------*/
Line 1,504:
End
Say r
Say 6*x**3-4*x**2+7*x-19</
'''Output:'''
<pre>128
Line 1,510:
=={{header|Oz}}==
<
fun {Horner Coeffs X}
{FoldL1 {Reverse Coeffs}
Line 1,522:
end
in
{Show {Horner [~19 7 ~4 6] 3}}</
=={{header|PARI/GP}}==
Also note that Pari has a polynomial type. Evaluating these is as simple as <code>subst(P,variable(P),x)</code>.
<
my(s=0);
forstep(i=#v,1,-1,s=s*x+v[i]);
s
};</
=={{header|Pascal}}==
<
function horner(a: array of double; x: double): double;
Line 1,550:
write ('Horner calculated polynomial of 6*x^3 - 4*x^2 + 7*x - 19 for x = 3: ');
writeln (horner (poly, 3.0):8:4);
end.</
Output:
<pre>Horner calculated polynomial of 6*x^3 - 4*x^2 + 7*x - 19 for x = 3: 128.0000
Line 1,556:
=={{header|Perl}}==
<
use strict;
use warnings;
Line 1,569:
my @coeff = (-19.0, 7, -4, 6);
my $x = 3;
say horner @coeff, $x;</
===<!-- Perl -->Functional version===
<
use List::Util qw(reduce);
Line 1,582:
my @coeff = (-19.0, 7, -4, 6);
my $x = 3;
print horner(\@coeff, $x), "\n";</
===<!-- Perl -->Recursive version===
<
my ($coeff, $x) = @_;
@$coeff and
Line 1,591:
}
print horner( [ -19, 7, -4, 6 ], 3 );</
=={{header|Phix}}==
<!--<
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">horner</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">coeff</span><span style="color: #0000FF;">)</span>
Line 1,605:
<span style="color: #0000FF;">?</span><span style="color: #000000;">horner</span><span style="color: #0000FF;">(</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,{-</span><span style="color: #000000;">19</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">})</span>
<!--</
{{out}}
<pre>
Line 1,612:
=={{header|PHP}}==
<
function horner($coeff, $x) {
$result = 0;
Line 1,623:
$x = 3;
echo horner($coeff, $x), "\n";
?></
===Functional version===
{{works with|PHP|5.3+}}
<
function horner($coeff, $x) {
return array_reduce(array_reverse($coeff), function ($a, $b) use ($x) { return $a * $x + $b; }, 0);
Line 1,635:
$x = 3;
echo horner($coeff, $x), "\n";
?></
=={{header|Picat}}==
===Recursion===
<
horner([H|T],X,V) :-
horner(T,X,V1),
V = V1 * X + H.</
===Iterative===
<
Acc = 0,
foreach(I in Coeff.length..-1..1)
Acc := Acc*X + Coeff[I]
end,
V = Acc.</
===Functional approach===
<
horner3(Coeff, X) = fold($h3(X),0,Coeff.reverse()).</
===Test===
<
horner([-19, 7, -4, 6], 3, V),
println(V),
Line 1,666:
V3 = horner3([-19, 7, -4, 6], 3),
println(V3),
nl.</
{{out}}
Line 1,674:
=={{header|PicoLisp}}==
<
(let Res 0
(for C (reverse Coeffs)
(setq Res (+ C (* X Res))) ) ) )</
<
-> 128</
=={{header|PL/I}}==
<syntaxhighlight lang="pl/i">
declare (i, n) fixed binary, (x, value) float; /* 11 May 2010 */
get (x);
Line 1,695:
put (value);
end;
</syntaxhighlight>
=={{header|Potion}}==
<
result = 0
coef reverse each (a) :
Line 1,706:
.
horner(3, (-19, 7, -4, 6)) print</
=={{header|PowerShell}}==
{{works with|PowerShell|4.0}}
<syntaxhighlight lang="powershell">
function horner($coefficients, $x) {
$accumulator = 0
Line 1,721:
$x = 3
horner $coefficients $x
</syntaxhighlight>
<b>Output:</b>
<pre>
Line 1,729:
=={{header|Prolog}}==
Tested with SWI-Prolog. Works with other dialects.
<
horner([H|T], X, V) :-
horner(T, X, V1),
V is V1 * X + H.
</syntaxhighlight>
Output :
<
V = 128.</
===Functional approach===
Works with SWI-Prolog and module lambda, written by <b>Ulrich Neumerkel</b> found there http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl
<
Line 1,753:
f_horner(L, V, R) :-
foldr(\X^Y^Z^(Z is X * V + Y), 0, L, R).
</syntaxhighlight>
===Functional syntax (Ciao)===
Works with Ciao (https://github.com/ciao-lang/ciao) and the fsyntax package:
<syntaxhighlight lang="prolog">
:- module(_, [horner/3], [fsyntax, hiord]).
:- use_module(library(hiordlib)).
horner(L, X) := ~foldr((''(H,V0,V) :- V is V0*X + H), L, 0).
</syntaxhighlight>
=={{header|PureBasic}}==
<
Define result
ForEach Coefficients()
Line 1,770:
Next
ProcedureReturn result
EndProcedure</
'''Implemented as
<
AddElement(a()): a()= 6
AddElement(a()): a()= -4
AddElement(a()): a()= 7
AddElement(a()): a()=-19
Debug Horner(a(),3)</
'''Outputs
128
=={{header|Python}}==
<
acc = 0
for c in reversed(coeffs):
Line 1,790:
>>> horner( (-19, 7, -4, 6), 3)
128</
===Functional version===
<
except: pass
Line 1,800:
>>> horner( (-19, 7, -4, 6), 3)
128</
==={{libheader|NumPy}}===
<
>>> numpy.polynomial.polynomial.polyval(3, (-19, 7, -4, 6))
128.0</
=={{header|R}}==
Procedural style:
<
y <- 0
for(c in rev(a)) {
Line 1,817:
}
cat(horner(c(-19, 7, -4, 6), 3), "\n")</
Functional style:
<
Reduce(v, right=T, f=function(a, b) {
b * x + a
})
}</
{{out}}
<pre>
Line 1,834:
Translated from Haskell
<
#lang racket
(define (horner x l)
Line 1,841:
(horner 3 '(-19 7 -4 6))
</syntaxhighlight>
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku"
@coeffs.reverse.reduce: { $^a * $x + $^b };
}
say horner( [ -19, 7, -4, 6 ], 3 );</
A recursive version would spare us the need for reversing the list of coefficients. However, special care must be taken in order to write it, because the way Raku implements lists is not optimized for this kind of treatment. [[Lisp]]-style lists are, and fortunately it is possible to emulate them with [http://doc.raku.org/type/Pair Pairs] and the reduction meta-operator:
<syntaxhighlight lang="raku"
multi horner(Pair $c, $x) {
$c.key + $x * horner( $c.value, $x )
}
say horner( [=>](-19, 7, -4, 6 ), 3 );</
We can also use the composition operator:
<syntaxhighlight lang="raku"
([o] map { $_ + $x * * }, @coeffs)(0);
}
say horner( [ -19, 7, -4, 6 ], 3 );</
{{out}}
Line 1,871:
One advantage of using the composition operator is that it allows for the use of an infinite list of coefficients.
<syntaxhighlight lang="raku"
map { .(0) }, [\o] map { $_ + $x * * }, @coeffs;
}
say horner( [ 1 X/ (1, |[\*] 1 .. *) ], i*pi )[20];
</syntaxhighlight>
{{out}}
<pre>-0.999999999924349-5.28918515954219e-10i</pre>
=={{header|Rascal}}==
<
public int horners_rule(list[int] coefficients, int x){
Line 1,888:
acc = acc * x + i;}
return acc;
}</
A neater and shorter solution using a reducer:
<
Output:
<
int: 128
rascal>horners_rule2([-19, 7, -4, 6], 3)
int: 128</
=={{header|REBOL}}==
<
horner: func [coeffs x] [
Line 1,910:
]
print horner [-19 7 -4 6] 3</
=={{header|REXX}}==
===version 1===
<
numeric digits 30 /*use extra numeric precision. */
parse arg x poly /*get value of X and the coefficients. */
Line 1,932:
end /*j*/
say /*display a blank line for readability.*/
say ' answer = ' a /*stick a fork in it, we're all done. */</
'''output''' when the following is used for input: <tt> 3 -19 7 -4 6 </tt>
<pre>
Line 1,943:
===version 2===
<
* 27.07.2012 Walter Pachl
* coefficients reversed to descending order of power
Line 1,987:
Say ' equation = ' equ
Say ' '
Say ' result = ' a</
{{out}}
<pre> x = 3
Line 1,996:
=={{header|Ring}}==
<
coefficients = [-19, 7, -4, 6]
see "x = 3" + nl +
Line 2,009:
next
return w
</syntaxhighlight>
Output:
<pre>
Line 2,025:
This said, solution to the problem is
<syntaxhighlight lang="rlab">
>> a = [6, -4, 7, -19]
6 -4 7 -19
Line 2,033:
128
</syntaxhighlight>
=={{header|Ruby}}==
<
coeffs.reverse.inject(0) {|acc, coeff| acc * x + coeff}
end
p horner([-19, 7, -4, 6], 3) # ==> 128</
=={{header|Run BASIC}}==
<
x = 3
print horner(coef$,x) '128
Line 2,058:
next
horner = accum
end function</
=={{header|Rust}}==
<
v.iter().rev().fold(0.0, |acc, coeff| acc*x + coeff)
}
Line 2,068:
let v = [-19., 7., -4., 6.];
println!("result: {}", horner(&v, 3.0));
}</
A generic version that works with any number type and much more. So much more, it's hard to imagine what that may be useful for.
<
use num::Zero;
use std::ops::{Add, Mul};
Line 2,090:
let output: f64 = horner(&v, 3.0);
println!("result: {}", output);
}</
=={{header|Sather}}==
<
action(s, e, x:FLT):FLT is
Line 2,107:
#OUT + horner(|-19.0, 7.0, -4.0, 6.0|, 3.0) + "\n";
end;
end;</
=={{header|Scala}}==
<
coeffs.reverse.foldLeft(0.0){(a,c)=> a*x+c}
</syntaxhighlight>
<
println(horner(coeffs, 3))
-> 128.0
</syntaxhighlight>
=={{header|Scheme}}==
{{Works with|Scheme|R<math>^5</math>RS}}
<
(define (*horner lst x acc)
(if (null? lst)
Line 2,128:
(display (horner (list -19 7 -4 6) 3))
(newline)</
Output:
<syntaxhighlight lang="text">128</
=={{header|Seed7}}==
<
include "float.s7i";
Line 2,154:
begin
writeln(horner(coeffs, 3.0) digits 1);
end func;</
Output:
Line 2,163:
=={{header|Sidef}}==
Functional:
<
coeff.reverse.reduce { |a,b| a*x + b };
}
say horner([-19, 7, -4, 6], 3); # => 128</
Recursive:
<
coeff.len > 0
&& (coeff[0] + x*horner(coeff.ft(1), x));
}
say horner([-19, 7, -4, 6], 3); # => 128</
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
<
horner: aValue [
^ self reverse inject: 0 into: [:acc :c | acc * aValue + c].
Line 2,185:
].
(#(-19 7 -4 6) asOrderedCollection horner: 3) displayNl.</
=={{header|Standard ML}}==
<
fun horner coeffList x = foldr (fn (a, b) => a + b * x) (0.0) coeffList</
=={{header|Swift}}==
<
return reduce(lazy(coefs).reverse(), 0) { $0 * x + $1 }
}
println(horner([-19, 7, -4, 6], 3))</
{{out}}
<pre>128.0</pre>
=={{header|Tcl}}==
<
proc horner {coeffs x} {
set y 0
Line 2,208:
}
return $y
}</
Demonstrating:
<
Output:
<pre>128</pre>
Line 2,218:
Note: this function, "Horner", gets its coefficients as a ParamArray which has no specified length. This array collect all arguments after the first one(s). This means you must specify x first, then the coefficients.
<syntaxhighlight lang="vba">
Public Function Horner(x, ParamArray coeff())
Dim result As Double
Line 2,231:
Horner = result
End Function
</syntaxhighlight>
Output:
Line 2,240:
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
Function horners_rule(coefficients,x)
accumulator = 0
Line 2,250:
WScript.StdOut.WriteLine horners_rule(Array(-19,7,-4,6),3)
</syntaxhighlight>
{{Out}}
Line 2,257:
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<
Function Horner(coefficients As Double(), variable As Double) As Double
Line 2,267:
End Sub
End Module</
{{out}}
<pre>128</pre>
Line 2,273:
=={{header|Visual FoxPro}}==
===Coefficients in ascending order.===
<
LOCAL x As Double
LOCAL ARRAY aCoeffs[1]
Line 2,293:
RETURN s
ENDFUNC
</syntaxhighlight>
===Coefficients in descending order.===
<
LOCAL x As Double
LOCAL ARRAY aCoeffs[1]
Line 2,315:
RETURN s
ENDFUNC
</syntaxhighlight>
=={{header|Vlang}}==
<
mut acc := i64(0)
for i := c.len - 1; i >= 0; i-- {
Line 2,328:
fn main() {
println(horner(3, [i64(-19), 7, -4, 6]))
}</
{{out}}
Line 2,336:
=={{header|Wren}}==
<
var count = c.count
if (count == 0) return 0
Line 2,342:
}
System.print(horner.call(3, [-19, 7, -4, 6]))</
{{out}}
Line 2,350:
=={{header|XPL0}}==
<
func Horner(X, N, C); \Return value of polynomial in X
Line 2,361:
];
IntOut(0, Horner(3, 4, [-19, 7, -4, 6]));</
Output:
Line 2,369:
=={{header|zkl}}==
<
{ coeffs.reverse().reduce('wrap(a,coeff){ a*x + coeff },0.0) }</
{{out}}
<pre>
|