Left factorials: Difference between revisions
Content added Content deleted
(Added Bracmat example) |
(Added Perl Implementation) |
||
Line 331: | Line 331: | ||
%2 = [128425485935180314, 9157958657951075573395300940314, 20935051082417771847631371547939998232420940314, 620960027832821612639424806694551108812720525606160920420940314, 141074930726669571000530822087000522211656242116439949000980378746128920420940314, 173639511802987526699717162409282876065556519849603157850853034644815111221599509216528920420940314, 906089587987695346534516804650290637694024830011956365184327674619752094289696314882008531991840922336528920420940314, 16695570072624210767034167688394623360733515163575864136345910335924039962404869510225723072235842668787507993136908442336528920420940314, 942786239765826579160595268206839381354754349601050974345395410407078230249590414458830117442618180732911203520208889371641659121356556442336528920420940314, 145722981061585297004706728001906071948635199234860720988658042536179281328615541936083296163475394237524337422204397431927131629058103519228197429698252556442336528920420940314] |
%2 = [128425485935180314, 9157958657951075573395300940314, 20935051082417771847631371547939998232420940314, 620960027832821612639424806694551108812720525606160920420940314, 141074930726669571000530822087000522211656242116439949000980378746128920420940314, 173639511802987526699717162409282876065556519849603157850853034644815111221599509216528920420940314, 906089587987695346534516804650290637694024830011956365184327674619752094289696314882008531991840922336528920420940314, 16695570072624210767034167688394623360733515163575864136345910335924039962404869510225723072235842668787507993136908442336528920420940314, 942786239765826579160595268206839381354754349601050974345395410407078230249590414458830117442618180732911203520208889371641659121356556442336528920420940314, 145722981061585297004706728001906071948635199234860720988658042536179281328615541936083296163475394237524337422204397431927131629058103519228197429698252556442336528920420940314] |
||
2565, 5733, 9128, 12670, 16322, 20062, 23875, 27749, 31678, 35656, </pre> |
2565, 5733, 9128, 12670, 16322, 20062, 23875, 27749, 31678, 35656, </pre> |
||
=={{header|Perl}}== |
|||
By caching the last used factorial and left factorial values, I avoid needless recomputation. By only retaining the most recently used values, instead of all past values, I avoid the need to store twenty thousand enormous numbers. |
|||
<lang perl>#!perl |
|||
use 5.010; |
|||
use strict; |
|||
use warnings; |
|||
use bigint; |
|||
sub leftfact { |
|||
my ($n) = @_; |
|||
state $cached = 0; |
|||
state $factorial = 1; |
|||
state $leftfact = 0; |
|||
if( $n < $cached ) { |
|||
($cached, $factorial, $leftfact) = (0, 1, 0); |
|||
} |
|||
while( $n > $cached ) { |
|||
$leftfact += $factorial; |
|||
$factorial *= ++$cached; |
|||
} |
|||
return $leftfact; |
|||
} |
|||
printf "!%d = %s\n", $_, leftfact($_) for 0 .. 10, map $_*10, 2..11; |
|||
printf "!%d has %d digits.\n", $_, length leftfact($_) for map $_*1000, 1..10; |
|||
</lang> |
|||
Since I copied the printf format strings from the perl6 implementation, the output from the code above is identical to the output of the perl6 code. |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |