Bell numbers: Difference between revisions

added =={{header|Pascal}}== forgot to insert in Feb. 2020
(added =={{header|Pascal}}== forgot to insert in Feb. 2020)
Line 2,050:
4140 5017 6097 7432 9089 11155 13744 17007 21147
21147 25287 30304 36401 43833 52922 64077 77821 94828 115975</pre>
=={{header|Pascal}}==
{{Works with|Free Pascal}}
Using bell's triangle. TIO.RUN up to 5000.See talk for more.
<lang pascal>program BellNumbers;
{$Ifdef FPC}
{$optimization on,all}
{$ElseIf}
{Apptype console}
{$EndIf}
uses
sysutils,gmp;
var
T0 :TDateTime;
procedure BellNumbersUint64(OnlyBellNumbers:Boolean);
var
BList : array[0..24] of Uint64;
BellNum : Uint64;
BListLenght,i :nativeUInt;
begin
IF OnlyBellNUmbers then
Begin
writeln('Bell triangles ');
writeln(' 1 = 1');
end
else
Begin
writeln('Bell numbers');
writeln(' 1 = 1');
writeln(' 2 = 1');
end;
 
BList[0]:= 1;
BListLenght := 1;
BellNum := 1;
repeat
// For i := BListLenght downto 1 do BList[i] := BList[i-1]; or
move(Blist[0],Blist[1],BListLenght*SizeOf(Blist[0]));
BList[0] := BellNum;
For i := 1 to BListLenght do
Begin
BellNum += BList[i];
BList[i] := BellNum;
end;
 
// Output
IF OnlyBellNUmbers then
Begin
IF BListLenght<=9 then
Begin
write(BListLenght+1:3,' = ');
For i := 0 to BListLenght do
write(BList[i]:7);
writeln;
end
ELSE
BREAK;
end
else
writeln(BListLenght+2:3,' = ',BellNum);
 
inc(BListLenght);
until BListLenght >= 25;
writeln;
end;
 
procedure BellNumbersMPInteger;
const
MaxIndex = 5000;//must be > 0
var
//MPInteger as alternative to mpz_t -> selfcleaning
BList : array[0..MaxIndex] of MPInteger;
BellNum : MPInteger;
BListLenght,i :nativeUInt;
BellNumStr : AnsiString;
Begin
BellNumStr := '';
z_init(BellNum);
z_ui_pow_ui(BellNum,10,32767);
BListLenght := z_size(BellNum);
writeln('init length ',BListLenght);
For i := 0 to MaxIndex do
Begin
// z_init2_set(BList[i],BListLenght);
z_add_ui( BList[i],i);
end;
writeln('init length ',z_size(BList[0]));
 
T0 := now;
BListLenght := 1;
z_set_ui(BList[0],1);
z_set_ui(BellNum,1);
repeat
//Move does not fit moving interfaces // call fpc_intf_assign
For i := BListLenght downto 1 do BList[i] := BList[i-1];
z_set(BList[0],BellNum);
For i := 1 to BListLenght do
Begin
BellNum := z_add(BellNum,BList[i]);
z_set(BList[i],BellNum);
end;
inc(BListLenght);
if (BListLenght+1) MOD 100 = 0 then
Begin
BellNumStr:= z_get_str(10,BellNum);
//z_sizeinbase (BellNum, 10) is not exact :-(
write('Bell(',(IntToStr(BListLenght)):6,') has ',
(IntToStr(Length(BellNumStr))):6,' decimal digits');
writeln(FormatDateTime(' NN:SS.ZZZ',now-T0),'s');
end;
until BListLenght>=MaxIndex;
BellNumStr:= z_get_str(10,BellNum);
writeln(BListLenght:6,'.th ',Length(BellNumStr):8);
 
//clean up ;-)
BellNumStr := '';
z_clear(BellNum);
For i := MaxIndex downto 0 do
z_clear(BList[i]);
end;
 
BEGIN
BellNumbersUint64(True);BellNumbersUint64(False);
BellNumbersMPInteger;
END.</lang>
{{out}}
<pre style="height:180px">
TIO.RUN
Real time: 22.818 s User time: 22.283 s Sys. time: 0.109 s CPU share: 98.13 %
 
Bell triangles
1 = 1
2 = 1 2
3 = 2 3 5
4 = 5 7 10 15
5 = 15 20 27 37 52
6 = 52 67 87 114 151 203
7 = 203 255 322 409 523 674 877
8 = 877 1080 1335 1657 2066 2589 3263 4140
9 = 4140 5017 6097 7432 9089 11155 13744 17007 21147
10 = 21147 25287 30304 36401 43833 52922 64077 77821 94828 115975
 
Bell numbers
1 = 1
2 = 1
3 = 2
4 = 5
5 = 15
6 = 52
7 = 203
8 = 877
9 = 4140
10 = 21147
11 = 115975
12 = 678570
13 = 4213597
14 = 27644437
15 = 190899322
16 = 1382958545
17 = 10480142147
18 = 82864869804
19 = 682076806159
20 = 5832742205057
21 = 51724158235372
22 = 474869816156751
23 = 4506715738447323
24 = 44152005855084346
25 = 445958869294805289
26 = 4638590332229999353
 
init length 1701
init length 0
Bell( 99) has 115 decimal digits 00:00.001s
Bell( 199) has 275 decimal digits 00:00.005s
Bell( 299) has 453 decimal digits 00:00.013s
Bell( 399) has 643 decimal digits 00:00.022s
Bell( 499) has 842 decimal digits 00:00.035s
Bell( 599) has 1048 decimal digits 00:00.051s
Bell( 699) has 1260 decimal digits 00:00.071s
Bell( 799) has 1478 decimal digits 00:00.098s
Bell( 899) has 1700 decimal digits 00:00.128s
Bell( 999) has 1926 decimal digits 00:00.167s
Bell( 1099) has 2155 decimal digits 00:00.208s
Bell( 1199) has 2388 decimal digits 00:00.256s
Bell( 1299) has 2625 decimal digits 00:00.310s
Bell( 1399) has 2864 decimal digits 00:00.366s
Bell( 1499) has 3105 decimal digits 00:00.440s
Bell( 1599) has 3349 decimal digits 00:00.517s
Bell( 1699) has 3595 decimal digits 00:00.608s
Bell( 1799) has 3844 decimal digits 00:00.711s
Bell( 1899) has 4095 decimal digits 00:00.808s
Bell( 1999) has 4347 decimal digits 00:00.959s
Bell( 2099) has 4601 decimal digits 00:01.189s
Bell( 2199) has 4858 decimal digits 00:01.373s
Bell( 2299) has 5115 decimal digits 00:01.560s
Bell( 2399) has 5375 decimal digits 00:01.816s
Bell( 2499) has 5636 decimal digits 00:02.065s
Bell( 2599) has 5898 decimal digits 00:02.304s
Bell( 2699) has 6162 decimal digits 00:02.669s
Bell( 2799) has 6428 decimal digits 00:02.962s
Bell( 2899) has 6694 decimal digits 00:03.366s
Bell( 2999) has 6962 decimal digits 00:03.720s
Bell( 3099) has 7231 decimal digits 00:04.145s
Bell( 3199) has 7502 decimal digits 00:04.554s
Bell( 3299) has 7773 decimal digits 00:05.198s
Bell( 3399) has 8046 decimal digits 00:05.657s
Bell( 3499) has 8320 decimal digits 00:06.270s
Bell( 3599) has 8595 decimal digits 00:06.804s
Bell( 3699) has 8871 decimal digits 00:07.475s
Bell( 3799) has 9148 decimal digits 00:08.189s
Bell( 3899) has 9426 decimal digits 00:08.773s
Bell( 3999) has 9704 decimal digits 00:09.563s
Bell( 4099) has 9984 decimal digits 00:10.411s
Bell( 4199) has 10265 decimal digits 00:11.301s
Bell( 4299) has 10547 decimal digits 00:12.230s
Bell( 4399) has 10829 decimal digits 00:13.415s
Bell( 4499) has 11112 decimal digits 00:14.830s
Bell( 4599) has 11397 decimal digits 00:16.630s
Bell( 4699) has 11682 decimal digits 00:18.210s
Bell( 4799) has 11968 decimal digits 00:19.964s
Bell( 4899) has 12254 decimal digits 00:21.332s
Bell( 4999) has 12542 decimal digits 00:22.445s
5000.th 12544
</pre>
=={{header|Perl}}==
{{trans|Raku}}
Anonymous user