Sum of squares

From Rosetta Code

Jump to: navigation, search
Task
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).

See also Mean.

Contents

[edit] ActionScript

function sumOfSquares(vector:Vector.<Number>):Number
{
var sum:Number = 0;
for(var i:uint = 0; i < vector.length; i++)
sum += vector[i]*vector[i];
return sum;
}

[edit] 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;

Sample output:

 0.00000E+00
 1.33000E+02

[edit] ALGOL 68

Works with: ALGOL 68 version Revision 1 - no extensions to language used

Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny

Works with: ELLA ALGOL 68 version Any (with appropriate job cards) - tested with release 1.8-8d

The computation can be written as a loop.

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
);
test:(
printf(($g(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.

Translation of: python

[]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);
 
test:(
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(($g(0)l$, ((REAL argv)REAL: sum +:= argv ** 2) MAP data ))
)

Output:

133
133

[edit] AutoHotkey

list = 3 1 4 1 5 9
Loop, Parse, list, %A_Space%
sum += A_LoopField**2
MsgBox,% sum

[edit] AWK

Vectors are read, space-separated, from stdin; sum of squares goes to stdout. The empty line produces 0.

$ awk '{s=0;for(i=1;i<=NF;i++)s+=$i*$i;print s}'
3 1 4 1 5 9
133
 
0

[edit] BASIC

Works with: QuickBasic version 4.5 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

[edit] C

#include <stdio.h>
 
double squaredsum(double *l, int e)
{
int i; double sum = 0.0;
for(i = 0 ; i < e ; i++) sum += l[i]*l[i];
return sum;
}
 
int main()
{
double list[6] = {3.0, 1.0, 4.0, 1.0, 5.0, 9.0};
 
printf("%lf\n", squaredsum(list, 6));
printf("%lf\n", squaredsum(list, 0));
/* the same without using a real list as if it were 0-element long */
printf("%lf\n", squaredsum(NULL, 0));
return 0;
}

[edit] C++

#include <iostream>
#include <numeric>
#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;
return 0;
}

Alternative version using Library: Boost.Lambda:

#include <numeric>
#include <vector>
#include "boost/lambda/lambda.hpp"
 
double vec_add_squares(std::vector<double>& v)
{
using namespace boost::lambda;
 
return std::accumulate(v.begin(), v.end(), 0.0, _1 + _2 * _2);
}

[edit] C#

using System;
using System.Collections.Generic;
using System.Linq;
 
class Program {
static int sumsq(ICollection<int> i) {
if (i == null || i.Count == 0) return 0;
return i.Select(x => x * x).Sum();
}
 
static void Main() {
int[] a = { 1, 2, 3, 4, 5 };
Console.WriteLine(sumsq(a)); // 55
}
}

[edit] Chef

Sum of squares.
 
First input is length of vector, then rest of input is vector.
 
Ingredients.
1 g How Many
0 g Num
 
Method.
Put Num into the 1st mixing bowl.
Take How Many from refrigerator.
Square the How Many.
Take Num from refrigerator.
Put Num into 2nd mixing bowl.
Combine Num into 2nd mixing bowl.
Fold Num into 2nd mixing bowl.
Add the Num into the 1st mixing bowl.
Ask the How Many until squared.
Pour contents of the 1st mixing bowl into the 1st baking dish.
 
Serves 1.

[edit] Clojure

(defn sum-of-squares [v]
(reduce #(+ %1 (* %2 %2)) 0 v))

[edit] Common Lisp

(defun sum-of-squares (vector)
(loop for x across vector sum (expt x 2)))

[edit] 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()) ;
}

Functional style
Works with: D version 2.011 See std.algorithm

import std.algorithm ;
T sumsq(T)(inout T[] a) {
return reduce!("a+b")(cast(T)0, map!("a*a")(a)) ;
}

[edit] E

def sumOfSquares(numbers) {
var sum := 0
for x in numbers {
sum += x**2
}
return sum
}

[edit] Erlang

lists:foldl(fun(X, Sum) -> X*X + Sum end, 0, [3,1,4,1,5,9]).

[edit] Factor

USE: math sequences ;
 
: sum-of-squares ( seq -- n ) [ sq ] map-sum ;
 
{ 1.0 2.0 4.0 8.0 16.0 } sum-of-squares

[edit] 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.

[edit] 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

[edit] F#

[1 .. 10] |> List.fold (fun a x -> a + x * x) 0 
[|1 .. 10|] |> Array.fold (fun a x -> a + x * x) 0

[edit] Groovy

def array = 1..3
 
// square via multiplication
def sumSq = array.collect { it * it }.sum()
println sumSq
 
// square via exponentiation
sumSq = array.collect { it ** 2 }.sum()
 
println sumSq

Output:

14
14

[edit] Haskell

sumOfSquares = sum . map (^ 2)
 
> sumOfSquares [3,1,4,1,5,9]
133

[edit] IDL

print,total(array^2)

[edit] Icon and Unicon

[edit] Icon

procedure main()
local lst
lst := []
#Construct a simple list and pass it to getsum
every put(lst,seq()\2)
write(getsum(lst))
end
 
procedure getsum(lst)
local total
total := 0
every total +:= !lst ^ 2
return total
end

[edit] Unicon

This Icon solution works in Unicon.

[edit] Io

list(3,1,4,1,5,9) map(squared) sum

[edit] 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

[edit] 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);
...

[edit] 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

Library: Functional

Functional.reduce("x+y*y", 0, [1,2,3,4,5])   // 55

[edit] Logo

print apply "sum map [? * ?] [1 2 3 4 5]  ; 55

[edit] Lua

function squaresum(a, ...) return a and a^2 + squaresum(...) or 0 end
function squaresumt(t) return squaresum(unpack(t)) end
 
print(squaresumt{3, 5, 4, 1, 7})

[edit] Mathematica

As a function 1:

SumOfSquares[x_]:=Total[x^2]
SumOfSquares[{1,2,3,4,5}]

As a function 2:

SumOfSquares[x_]:=x.x
SumOfSquares[{1,2,3,4,5}]

Pure function 1: (postfix operator in the following examples)

{1,2,3,4,5} // Total[#^2] &

Pure function 2:

{1, 2, 3, 4, 5} // #^2 & // Total

Pure function 3:

{1, 2, 3, 4, 5} // #.#&

[edit] MATLAB

function [squaredSum] = sumofsquares(inputVector)
squaredSum = sum( inputVector.^2 );

[edit] Maxima

nums : [3,1,4,1,5,9];
sum(nums[i]^2,i,1,length(nums));

[edit] Modula-3

MODULE SumSquares EXPORTS Main;
 
IMPORT IO, Fmt;
 
TYPE RealArray = ARRAY OF REAL;
 
PROCEDURE SumOfSquares(x: RealArray): REAL =
VAR sum := 0.0;
BEGIN
FOR i := FIRST(x) TO LAST(x) DO
sum := sum + x[i] * x[i];
END;
RETURN sum;
END SumOfSquares;
 
BEGIN
IO.Put(Fmt.Real(SumOfSquares(RealArray{3.0, 1.0, 4.0, 1.0, 5.0, 9.0})));
IO.Put("\n");
END SumSquares.

[edit] OCaml

List.fold_left (fun sum a -> sum + a * a) 0 ints
List.fold_left (fun sum a -> sum +. a *. a) 0. floats

[edit] Octave

a = [1:10];
sumsq = sum(a .^ 2);

[edit] Oz

declare
fun {SumOfSquares Xs}
for X in Xs sum:S do
{S X*X}
end
end
in
{Show {SumOfSquares [3 1 4 1 5 9]}}

[edit] Perl

sub sum_of_squares {
my $sum = 0;
$sum += $_**2 foreach @_;
return $sum;
}
 
print sum_of_squares(3, 1, 4, 1, 5, 9), "\n";

or

use List::Util qw(reduce);
sub sum_of_squares {
reduce { $a + $b **2 } 0, @_;
}
 
print sum_of_squares(3, 1, 4, 1, 5, 9), "\n";

[edit] Perl 6

Works with: Rakudo version #21 "Seattle"

say [+] map * ** 2, 3, 1, 4, 1, 5, 9;

If this expression seems puzzling, note that * ** 2 is equivalent to {$^x ** 2}— the leftmost asterisk is not the multiplication operator but the Whatever star.

[edit] PHP

 
function sum_squares(array $args) {
return array_reduce(
$args, create_function('$x, $y', 'return $x+$y*$y;'), 0
);
}
 

In PHP5.3 support for anonymous functions was reworked. While the above code would still work, it is suggested to use

 
function sum_squares(array $args) {
return array_reduce($args, function($x, $y) {
return $x+$y*$y;
}, 0);
}
 

Usage for both examples: sum_squares(array(1,2,3,4,5)); // 55

[edit] PicoLisp

: (sum '((N) (* N N)) (3 1 4 1 5 9))
-> 133
: (sum '((N) (* N N)) ())
-> 0

[edit] PL/I

 
declare A(10) float initial (10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
 
put (sum(A**2));
 

[edit] 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}) =>

[edit] PowerShell

function Get-SquareSum ($a) {
if ($a.Length -eq 0) {
return 0
} else {
$x = $a `
| ForEach-Object { $_ * $_ } `
| Measure-Object -Sum
return $x.Sum
}
}

[edit] PureBasic

Procedure SumOfSquares(List base())
ForEach base()
Sum + base()*base()
Next
ProcedureReturn Sum
EndProcedure

[edit] Python

sum(x*x for x in [1, 2, 3, 4, 5])

[edit] Prolog

   sum([],0).
   sum([H|T],S) :- sum(T, S1), S is S1 + (H * H).

[edit] R

arr <- c(1,2,3,4,5)
result <- sum(arr^2)

[edit] Ruby

[3,1,4,1,5,9].inject(0) { |sum,x| sum += x*x }

In 1.9.1

[3,1,4,1,5,9].map { |x| x*x }.reduce(:+)

[edit] Sather

class MAIN is
 
sqsum(s, e:FLT):FLT is
return s + e*e;
end;
 
sum_of_squares(v :ARRAY{FLT}):FLT is
return (#ARRAY{FLT}(|0.0|).append(v)).reduce(bind(sqsum(_,_)));
end;
 
main is
v :ARRAY{FLT} := |3.0, 1.0, 4.0, 1.0, 5.0, 9.0|;
#OUT + sum_of_squares(v) + "\n";
end;
 
end;

[edit] Scala

Unfortunately there is no common "Numeric" class that Int and Double both extend, since Scala's number representation maps closely to Java's. Those concerned about precision can define a similar procedure for integers.

def sum_of_squares(xs: Seq[Double]) = xs.foldLeft(0) {(a,x) => a + x*x}

[edit] Scheme

(define (sum-of-squares l)
(apply + (map * l l)))
> (sum-of-squares (list 3 1 4 1 5 9))
133

[edit] Slate

{1. 2. 3} reduce: [|:x :y| y squared + x].
{} reduce: [|:x :y| y squared + x] ifEmpty: [0].

[edit] Smalltalk

#(3 1 4 1 5 9) inject: 0 into: [:sum :aNumber | sum + aNumber squared]

[edit] SNOBOL4

Works with: Macro Spitbol Works with: Snobol4+ Works with: CSnobol

        define('ssq(a)i') :(ssq_end)
ssq i = i + 1; ssq = ssq + (a<i> * a<i>) :s(sumsq)f(return)
ssq_end
 
* # Fill array, test and display
str = '1 2 3 5 7 11 13 17 19 23'; a = array(10)
loop i = i + 1; str len(p) span('0123456789') . a<i> @p :s(loop)
output = str ' -> ' sumsq(a)
end

Output:

 1 2 3 5 7 11 13 17 19 23 -> 1557

[edit] Standard ML

foldl (fn (a, sum) => sum + a * a) 0 ints
foldl (fn (a, sum) => sum + a * a) 0.0 reals

[edit] Tcl

proc sumOfSquares {nums} {
set sum 0
foreach num $nums {
set sum [expr {$sum + $num**2}]
}
return $sum
}
sumOfSquares {1 2 3 4 5} ;# ==> 55
sumOfSquares {} ;# ==> 0

Using the struct::list package from Library: tcllib

package require struct::list
 
proc square x {expr {$x * $x}}
proc + {a b} {expr {$a + $b}}
proc sumOfSquares {nums} {
struct::list fold [struct::list map $nums square] 0 +
}
sumOfSquares {1 2 3 4 5} ;# ==> 55
sumOfSquares {} ;# ==> 0

Generic "sum of function"

package require Tcl 8.5
package require struct::list
namespace path ::tcl::mathop
 
proc sum_of {lambda nums} {
struct::list fold [struct::list map $nums [list apply $lambda]] 0 +
}
 
sum_of {x {* $x $x}} {1 2 3 4 5} ;# ==> 55

[edit] Trith

[3 1 4 1 5 9] 0 [dup * +] foldl

[edit] 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

[edit] Ursala

The ssq function defined below zips two copies of its argument together, maps the product function to all pairs, and then sums the result by way of the reduction operator, -:.

#import nat
 
ssq = sum:-0+ product*iip
 
#cast %n
 
main = ssq <21,12,77,0,94,23,96,93,72,72,79,24,8,50,9,93>

output:

62223

[edit] V

[sumsq [dup *] map 0 [+] fold].
 
[] sumsq
=0
[1 2 3] sumsq
=14

[edit] Visual Basic .NET

 
Private Shared Function sumsq(ByVal i As ICollection(Of Integer)) As Integer
If i Is Nothing OrElse i.Count = 0 Then
Return 0
End If
Return i.[Select](Function(x) x * x).Sum()
End Function
 
Private Shared Sub Main()
Dim a As Integer() = New Integer() {1, 2, 3, 4, 5}
' 55
Console.WriteLine(sumsq(a))
 
For K As Integer = 0 To 16
Console.WriteLine("SumOfSquares({0}) = {1}", K, SumOfSquares(K))
Next
End Sub
Function SumOfSquares(ByVal Max As Integer)
Dim Square As Integer = 0
Dim Add As Integer = 1
Dim Sum As Integer = 0
For J As Integer = 0 To Max - 1
Square += Add
Add += 2
Sum += Square
Next
Return Sum
End Function
 
Function SumOfSquaresByMult(ByVal Max As Integer)
Dim Sum As Integer = 0
For J As Integer = 1 To Max
Sum += J * J
Next
Return Sum
End Function
 
 

output:

55
SumOfSquares(0) = 0
SumOfSquares(1) = 1
SumOfSquares(2) = 5
SumOfSquares(3) = 14
SumOfSquares(4) = 30
SumOfSquares(5) = 55
SumOfSquares(6) = 91
SumOfSquares(7) = 140
SumOfSquares(8) = 204
SumOfSquares(9) = 285
SumOfSquares(10) = 385
SumOfSquares(11) = 506
SumOfSquares(12) = 650
SumOfSquares(13) = 819
SumOfSquares(14) = 1015
SumOfSquares(15) = 1240
SumOfSquares(16) = 1496
Personal tools