proc log_factorial {n} {
if {$n < 0} {
error "Invalid input" $n
} elseif {$n > 254} {
set x [expr $n + 1]
set pi [expr 4 * atan(1)]
return [expr ($x - 0.5)*log($x) - $x + 0.5*log(2*$pi) + 1.0/(12.0*$x)]
} else {
set lf [list \
0.000000000000000 \
0.000000000000000 \
0.693147180559945 \
1.791759469228055 \
3.178053830347946 \
4.787491742782046 \
6.579251212010101 \
8.525161361065415 \
10.604602902745251 \
12.801827480081469 \
15.104412573075516 \
17.502307845873887 \
19.987214495661885 \
22.552163853123421 \
25.191221182738683 \
27.899271383840894 \
30.671860106080675 \
33.505073450136891 \
36.395445208033053 \
39.339884187199495 \
42.335616460753485 \
45.380138898476908 \
48.471181351835227 \
51.606675567764377 \
54.784729398112319 \
58.003605222980518 \
61.261701761002001 \
64.557538627006323 \
67.889743137181526 \
71.257038967168000 \
74.658236348830158 \
78.092223553315307 \
81.557959456115029 \
85.054467017581516 \
88.580827542197682 \
92.136175603687079 \
95.719694542143202 \
99.330612454787428 \
102.968198614513810 \
106.631760260643450 \
110.320639714757390 \
114.034211781461690 \
117.771881399745060 \
121.533081515438640 \
125.317271149356880 \
129.123933639127240 \
132.952575035616290 \
136.802722637326350 \
140.673923648234250 \
144.565743946344900 \
148.477766951773020 \
152.409592584497350 \
156.360836303078800 \
160.331128216630930 \
164.320112263195170 \
168.327445448427650 \
172.352797139162820 \
176.395848406997370 \
180.456291417543780 \
184.533828861449510 \
188.628173423671600 \
192.739047287844900 \
196.866181672889980 \
201.009316399281570 \
205.168199482641200 \
209.342586752536820 \
213.532241494563270 \
217.736934113954250 \
221.956441819130360 \
226.190548323727570 \
230.439043565776930 \
234.701723442818260 \
238.978389561834350 \
243.268849002982730 \
247.572914096186910 \
251.890402209723190 \
256.221135550009480 \
260.564940971863220 \
264.921649798552780 \
269.291097651019810 \
273.673124285693690 \
278.067573440366120 \
282.474292687630400 \
286.893133295426990 \
291.323950094270290 \
295.766601350760600 \
300.220948647014100 \
304.686856765668720 \
309.164193580146900 \
313.652829949878990 \
318.152639620209300 \
322.663499126726210 \
327.185287703775200 \
331.717887196928470 \
336.261181979198450 \
340.815058870798960 \
345.379407062266860 \
349.954118040770250 \
354.539085519440790 \
359.134205369575340 \
363.739375555563470 \
368.354496072404690 \
372.979468885689020 \
377.614197873918670 \
382.258588773060010 \
386.912549123217560 \
391.575988217329610 \
396.248817051791490 \
400.930948278915760 \
405.622296161144900 \
410.322776526937280 \
415.032306728249580 \
419.750805599544780 \
424.478193418257090 \
429.214391866651570 \
433.959323995014870 \
438.712914186121170 \
443.475088120918940 \
448.245772745384610 \
453.024896238496130 \
457.812387981278110 \
462.608178526874890 \
467.412199571608080 \
472.224383926980520 \
477.044665492585580 \
481.872979229887900 \
486.709261136839360 \
491.553448223298010 \
496.405478487217580 \
501.265290891579240 \
506.132825342034830 \
511.008022665236070 \
515.890824587822520 \
520.781173716044240 \
525.679013515995050 \
530.584288294433580 \
535.496943180169520 \
540.416924105997740 \
545.344177791154950 \
550.278651724285620 \
555.220294146894960 \
560.169054037273100 \
565.124881094874350 \
570.087725725134190 \
575.057539024710200 \
580.034272767130800 \
585.017879388839220 \
590.008311975617860 \
595.005524249382010 \
600.009470555327430 \
605.020105849423770 \
610.037385686238740 \
615.061266207084940 \
620.091704128477430 \
625.128656730891070 \
630.172081847810200 \
635.221937855059760 \
640.278183660408100 \
645.340778693435030 \
650.409682895655240 \
655.484856710889060 \
660.566261075873510 \
665.653857411105950 \
670.747607611912710 \
675.847474039736880 \
680.953419513637530 \
686.065407301994010 \
691.183401114410800 \
696.307365093814040 \
701.437263808737160 \
706.573062245787470 \
711.714725802289990 \
716.862220279103440 \
722.015511873601330 \
727.174567172815840 \
732.339353146739310 \
737.509837141777440 \
742.685986874351220 \
747.867770424643370 \
753.055156230484160 \
758.248113081374300 \
763.446610112640200 \
768.650616799717000 \
773.860102952558460 \
779.075038710167410 \
784.295394535245690 \
789.521141208958970 \
794.752249825813460 \
799.988691788643450 \
805.230438803703120 \
810.477462875863580 \
815.729736303910160 \
820.987231675937890 \
826.249921864842800 \
831.517780023906310 \
836.790779582469900 \
842.068894241700490 \
847.352097970438420 \
852.640365001133090 \
857.933669825857460 \
863.231987192405430 \
868.535292100464630 \
873.843559797865740 \
879.156765776907600 \
884.474885770751830 \
889.797895749890240 \
895.125771918679900 \
900.458490711945270 \
905.796028791646340 \
911.138363043611210 \
916.485470574328820 \
921.837328707804890 \
927.193914982476710 \
932.555207148186240 \
937.921183163208070 \
943.291821191335660 \
948.667099599019820 \
954.046996952560450 \
959.431492015349480 \
964.820563745165940 \
970.214191291518320 \
975.612353993036210 \
981.015031374908400 \
986.422203146368590 \
991.833849198223450 \
997.249949600427840 \
1002.670484599700300 \
1008.095434617181700 \
1013.524780246136200 \
1018.958502249690200 \
1024.396581558613400 \
1029.838999269135500 \
1035.285736640801600 \
1040.736775094367400 \
1046.192096209724900 \
1051.651681723869200 \
1057.115513528895000 \
1062.583573670030100 \
1068.055844343701400 \
1073.532307895632800 \
1079.012946818975000 \
1084.497743752465600 \
1089.986681478622400 \
1095.479742921962700 \
1100.976911147256000 \
1106.478169357800900 \
1111.983500893733000 \
1117.492889230361000 \
1123.006317976526100 \
1128.523770872990800 \
1134.045231790853000 \
1139.570684729984800 \
1145.100113817496100 \
1150.633503306223700 \
1156.170837573242400 \
]
return [lindex $lf $n]
}
}