Bell numbers: Difference between revisions

Line 2,607:
21147 25287 30304 36401 43833 52922 64077 77821 94828 115975
</pre>
 
=={{header|Picat}}==
'''First 18 Bell numbers and b(50).'''
(Port of the Sage solution at the OEIS A000110 page.)
<lang Picat>main =>
B50=b(50),
println(B50[1..18]),
println(b50=B50.last),
nl.
 
b(M) = R =>
A = new_array(M-1),
bind_vars(A,0),
A[1] := 1,
R = [1, 1],
foreach(N in 2..M-1)
A[N] := A[1],
foreach(K in N..-1..2)
A[K-1] := A[K-1] + A[K],
end,
R := R ++ [A[1]]
end.</lang>
 
{{out}}
<pre>[1,1,2,5,15,52,203,877,4140,21147,115975,678570,4213597,27644437,190899322,1382958545,10480142147,82864869804]
b50 = 10726137154573358400342215518590002633917247281</pre>
 
'''Bell's Triangle (and the 50th Bell number)'''
{{trans|D}}
<lang Picat>main =>
Tri = tri(50),
foreach(I in 1..10)
println(Tri[I].to_list)
end,
nl,
println(tri50=Tri.last.first),
nl.
 
% Adjustments for base-1.
tri(N) = Tri[2..N+1] =>
Tri = new_array(N+1),
foreach(I in 1..N+1)
Tri[I] := new_array(I-1),
bind_vars(Tri[I],0)
end,
Tri[2,1] := 1,
foreach(I in 3..N+1)
Tri[I,1] := Tri[I-1,I-2],
foreach(J in 2..I-1)
Tri[I,J] := Tri[I,J-1] + Tri[I-1,J-1]
end
end.</lang>
 
{{out}}
<pre>[1]
[1,2]
[2,3,5]
[5,7,10,15]
[15,20,27,37,52]
[52,67,87,114,151,203]
[203,255,322,409,523,674,877]
[877,1080,1335,1657,2066,2589,3263,4140]
[4140,5017,6097,7432,9089,11155,13744,17007,21147]
[21147,25287,30304,36401,43833,52922,64077,77821,94828,115975]
 
tri50 = 10726137154573358400342215518590002633917247281</pre>
 
{{trans|Prolog}}
<lang Picat>main :-
bell(49, Bell),
printf("First 15 Bell numbers:\n"),
print_bell_numbers(Bell, 15),
Number=Bell.last.first,
printf("\n50th Bell number: %w\n", Number),
printf("\nFirst 10 rows of Bell triangle:\n"),
print_bell_rows(Bell, 10).
 
bell(N, Bell):-
bell(N, Bell, [], _).
bell(0, [[1]|T], T, [1]):-!.
bell(N, Bell, B, Row):-
N1 is N - 1,
bell(N1, Bell, [Row|B], Last),
next_row(Row, Last).
next_row([Last|Bell], Bell1):-
Last=last(Bell1),
next_row1(Last, Bell, Bell1).
next_row1(_, [], []):-!.
next_row1(X, [Y|Rest], [B|Bell]):-
Y is X + B,
next_row1(Y, Rest, Bell).
print_bell_numbers(_, 0):-!.
print_bell_numbers([[Number|_]|Bell], N):-
printf("%w\n", Number),
N1 is N - 1,
print_bell_numbers(Bell, N1).
print_bell_rows(_, 0):-!.
print_bell_rows([Row|Rows], N):-
print_bell_row(Row),
N1 is N - 1,
print_bell_rows(Rows, N1).
print_bell_row([Number]):-
!,
printf("%w\n", Number).
print_bell_row([Number|Numbers]):-
printf("%w ", Number),
print_bell_row(Numbers).</lang>
 
{{out}}
<pre>First 15 Bell numbers:
1
1
2
5
15
52
203
877
4140
21147
115975
678570
4213597
27644437
190899322
 
50th Bell number: 10726137154573358400342215518590002633917247281
 
First 10 rows of Bell triangle:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
52 67 87 114 151 203
203 255 322 409 523 674 877
877 1080 1335 1657 2066 2589 3263 4140
4140 5017 6097 7432 9089 11155 13744 17007 21147
21147 25287 30304 36401 43833 52922 64077 77821 94828 115975</pre>
 
=={{header|PicoLisp}}==
495

edits