Bell numbers: Difference between revisions
Content added Content deleted
(added =={{header|Pascal}}== forgot to insert in Feb. 2020) |
|||
Line 2,050: | Line 2,050: | ||
4140 5017 6097 7432 9089 11155 13744 17007 21147 |
4140 5017 6097 7432 9089 11155 13744 17007 21147 |
||
21147 25287 30304 36401 43833 52922 64077 77821 94828 115975</pre> |
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}}== |
=={{header|Perl}}== |
||
{{trans|Raku}} |
{{trans|Raku}} |