/* Sum of divisors in Picat. This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ main => go. go => foreach(N in 1..60) printf("%d,%d\n",N,sum_divisors(N)) end, nl. go2 => foreach(N in 1..60) printf("%d,%d\n",N,sum_divisors2(N)) end, nl. % Including 1 and N sum_divisors2(1) = 1. sum_divisors2(N) = sum_divisors(N)+N. % This recursive version is slightly faster than sum_divisors2/1. % Not including N table sum_divisors(N) = Sum => sum_divisors(2,N,1,Sum). sum_divisors(I,N,Sum0,Sum), I > floor(sqrt(N)) => Sum = Sum0. % I is a divisor of N sum_divisors(I,N,Sum0,Sum), N mod I == 0 => Sum1 = Sum0 + I, (I != N div I -> Sum2 = Sum1 + N div I ; Sum2 = Sum1 ), sum_divisors(I+1,N,Sum2,Sum). % I is no divisor of N. sum_divisors(I,N,Sum0,Sum) => sum_divisors(I+1,N,Sum0,Sum).