/*
Sum of a series (Rosetta code) in Picat.
http://rosettacode.org/wiki/Sum_of_a_series
"""
Compute the n-th term of a series, i.e. the sum of the n first terms of the corresponding sequence.
Informally this value, or its limit when n tends to infinity, is also called the sum of the series,
thus the title of this task.
For this task, use:
S_n = \sum_{k=1}^n \frac{1}{k^2}
and compute S1000.
This approximates the zeta function for s=2, whose exact value
\zeta(2) = {\pi^2\over 6}
is the solution of the Basel problem.
"""
This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com
See also my Picat page: http://www.hakank.org/picat/
*/
% import util.
% import cp.
main => go.
go =>
println(s(1000)),
Pi2_6 = math.pi**2/6,
println(Pi2_6='math.pi**2/6'),
nl,
foreach(I in 1..6)
S = s(10**I),
printf("%f (diff: %w)\n", S,Pi2_6-S)
end,
nl.
go2 =>
println(s2(1000)),
Pi2_6 = math.pi**2/6,
println(Pi2_6='math.pi**2/6'),
nl,
foreach(I in 1..6)
S = s2(10**I),
printf("%f (diff: %w)\n", S,Pi2_6-S)
end,
nl.
go3 =>
println(s3(1000)),
Pi2_6 = math.pi**2/6,
println(Pi2_6='math.pi**2/6'),
nl,
foreach(I in 1..6)
S = s3(10**I),
printf("%f (diff: %w)\n", S,Pi2_6-S)
end,
nl.
go4 =>
println(s4(1000)),
Pi2_6 = math.pi**2/6,
println(Pi2_6='math.pi**2/6'),
nl,
foreach(I in 1..6)
S = s4(10**I),
printf("%f (diff: %w)\n", S,Pi2_6-S)
end,
nl.
s(N) = sum([1.0/K**2 : K in 1..N]).
s2(N) = Sum =>
K = 1,
Sum1 = 0,
while(K <= N)
Sum1 := Sum1 + 1/K**2,
K := K + 1
end,
Sum = Sum1.
s3(N) = Sum =>
Sum1 = 0,
foreach(K in 1..N)
Sum1 := Sum1 + 1/K**2
end,
Sum = Sum1.
% using reduce/2: much slower
f4(K1,K) = K1 + 1.0/K**2.
s4(N) = reduce(f4,1..N).