Sum of squares
You are encouraged to solve this task according to the task description, using any language you may know.
Write a program to find the sum of squares of a numeric vector. The program should work on a zero-length vector (with an answer of 0).
Ada
<Ada> with Ada.Text_IO; use Ada.Text_IO;
procedure Test_Sum_Of_Squares is
type Float_Array is array (Integer range <>) of Float;
function Sum_Of_Squares (X : Float_Array) return Float is Sum : Float := 0.0; begin for I in X'Range loop Sum := Sum + X (I) ** 2; end loop; return Sum; end Sum_Of_Squares;
begin
Put_Line (Float'Image (Sum_Of_Squares ((1..0 => 1.0)))); -- Empty array Put_Line (Float'Image (Sum_Of_Squares ((3.0, 1.0, 4.0, 1.0, 5.0, 9.0))));
end Test_Sum_Of_Squares; </Ada> Sample output:
0.00000E+00 1.33000E+02
ALGOL 68
The computation can be written as a loop.
main1:( PROC sum of squares = ([]REAL argv)REAL:( REAL sum := 0; FOR i FROM LWB argv TO UPB argv DO sum +:= argv[i]**2 OD; sum ); printf(($xg(0)l$,sum of squares([]REAL(3, 1, 4, 1, 5, 9)))); )
Output:
133
Another implementation could define a procedure (PROC) or operator (OP) called map.
main2:( []REAL data = (3, 1, 4, 1, 5, 9); PROC map = ( PROC(REAL)REAL func, []REAL argv)REAL: ( REAL out:=0; FOR i FROM LWB argv TO UPB argv DO out:=func(argv[i]) OD; out); REAL sum := 0; printf(($xg(0)l$, map ( ((REAL argv)REAL: sum +:= argv ** 2), data) )); PRIO MAP = 5; # the same priority as the operators <, =<, >=, & > maybe... # OP MAP = ( PROC(REAL)REAL func, []REAL argv)REAL: ( REAL out:=0; FOR i FROM LWB argv TO UPB argv DO out:=func(argv[i]) OD; out); sum := 0; printf(($xg(0)l$, ((REAL argv)REAL: sum +:= argv ** 2) MAP data )) )
Output:
133 133
BASIC
Assume the numbers are in a DIM called a.
sum = 0 FOR I = LBOUND(a) TO UBOUND(a) sum = sum + a(I) ^ 2 NEXT I PRINT "The sum of squares is: " + sum
C++
<cpp>
- include <iostream>
- include <algorithm>
- include <vector>
double add_square(double prev_sum, double new_val) {
return prev_sum + new_val*new_val;
}
double vec_add_squares(std::vector<double>& v) {
return std::accumulate(v.begin(), v.end(), 0.0, add_square);
}
int main() {
// first, show that for empty vectors we indeed get 0 std::vector<double> v; // empty std::cout << vec_add_squares(v) << std::endl;
// now, use some values double data[] = { 0, 1, 3, 1.5, 42, 0.1, -4 }; v.assign(data, data+7); std::cout << vec_add_squares(v) << std::endl;
} </cpp>
Common Lisp
(defun sum-of-squares (vector) (loop for x across vector sum (expt x 2)))
D
<d>module sumsquare ; import std.stdio ;
T sumsq(T)(T[] a) {
T sum = 0 ; foreach(e ; a) sum += e*e ; return sum ;
}
void main() {
real[] arr = [3.1L,1,4,1,5,9] ; writefln(arr) ; writefln(arr.sumsq()) ;
}</d>
Functional style
See std.algorithm <d>import std.algorithm ; T sumsq(T)(inout T[] a) {
return reduce!("a+b")(cast(T)0, map!("a*a")(a)) ;
}</d>
Forth
: fsum**2 ( addr n -- f ) 0e dup 0= if 2drop exit then floats bounds do i f@ fdup f* f+ 1 floats +loop ; create test 3e f, 1e f, 4e f, 1e f, 5e f, 9e f, test 6 fsum**2 f. \ 133.
Fortran
In ISO Fortran 90 orlater, use SUM intrinsic and implicit element-wise array arithmetic:
real, dimension(1000) :: a = (/ (i, i=1, 1000) /) real, pointer, dimension(:) :: p => a(2:1) ! pointer to zero-length array real :: result, zresult result = sum(a*a) ! Multiply array by itself to get squares result = sum(a**2) ! Use exponentiation operator to get squares zresult = sum(p*p) ! P is zero-length; P*P is valid zero-length array expression; SUM(P*P) == 0.0 as expected
Haskell
sumOfSquares = sum . map (^ 2)
> sumOfSquares [3,1,4,1,5,9] 133
IDL
print,total(array^2)
J
ss=: +/ @: *:
That is, sum composed with square. The verb also works on higher-ranked arrays. For example:
ss 3 1 4 1 5 9 133 ss $0 NB. $0 is a zero-length vector 0 x=: 20 4 ?@$ 0 NB. a 20-by-4 table of random (0,1) numbers ss x 9.09516 5.19512 5.84173 6.6916
The computation can also be written as a loop. It is shown here for comparison only and is highly non-preferred compared to the version above.
ss1=: 3 : 0 z=. 0 for_i. i.#y do. z=. z+*:i{y end. ) ss1 3 1 4 1 5 9 133 ss1 $0 0 ss1 x 9.09516 5.19512 5.84173 6.6916
Java
Assume the numbers are in a double array called "nums".
... double sum = 0; for(double a : nums){ sum+= a * a; } System.out.println("The sum of the squares is: " + sum); ...
JavaScript
function sumsq(array) { var sum = 0; for(var i in array) sum += array[i] * array[i]; return sum; } alert( sumsq( [1,2,3,4,5] ) ); // 55
Functional.reduce("x+y*y", 0, [1,2,3,4,5]) // 55
Logo
print apply "sum map [? * ?] [1 2 3 4 5] ; 55
OCaml
List.fold_left (fun sum a -> sum + a * a) 0 ints
List.fold_left (fun sum a -> sum +. a *. a) 0. floats
Perl
<perl>sub sum_of_squares {
my $sum = 0; $sum += $_**2 foreach @_; return $sum;
}
print sum_of_squares(3, 1, 4, 1, 5, 9), "\n";</perl>
Pop11
define sum_squares(v); lvars s = 0, j; for j from 1 to length(v) do s + v(j)*v(j) -> s; endfor; s; enddefine; sum_squares({1 2 3 4 5}) =>
Python
<python>sum([x*x for x in [1, 2, 3, 4, 5]])</python>
Scheme
(define (sum-of-squares l) (apply + (map * l l)))
> (sum-of-squares (list 3 1 4 1 5 9)) 133
UnixPipes
folder() { (read B; res=$( expr $1 \* $1 ) ; test -n "$B" && expr $res + $B || echo $res) }
fold() { (while read a ; do fold | folder $a done) }
(echo 3; echo 1; echo 4;echo 1;echo 5; echo 9) | fold
V
[sumsq [dup *] map 0 [+] fold].
[] sumsq =0 [1 2 3] sumsq =14