in reply to Challenge: Chasing Knuth's Conjecture

Here's a fairly straightforward sieve. It finds solutions by repeatedly applying the basic functions to the already-found solutions, so it finds solutions for some incredibly large numbers, but doesn't get 9 (for example), likely due to the limit I put on factorial (no inputs larger than 150). Output strings are effectively unary RPN.
use strict; use warnings; use bigint; # Each element of @formulas is an an op-string: # a string of Fs and Ss, indicating factorial # and square root, in order applied to get the # index my %formulas = (3 => '3'); my $found_new = 1; while ($found_new) { $found_new = 0; # Apply factorial to all formulas while (my ($v, $ops) = each %formulas) { if ($v < 150) { $v = fact($v); $ops .= 'F'; exists $formulas{$v} or $found_new = $formulas{$v} = $ops; } } # Apply sqrt to all formulas while (my ($v, $ops) = each %formulas) { $v = int(sqrt($v)); $ops .= 'S'; exists $formulas{$v} or $found_new = $formulas{$v} = $ops; } } for (sort { $a <=> $b } keys %formulas) { print "$_: $formulas{$_}\n"; } sub fact { my $f = 1; for (2..$_[0]) { $f *= $_ } $f; }
Update: instead of iterating a given number of times, iterates until no new solutions are found.

Caution: Contents may have been coded under pressure.