use strict; use warnings; use List::Util qw[ reduce ]; use Algorithm::Loops 'NextPermuteNum'; sub closest{ my $exact = sqrt(shift); my $best = 1; do { my $guess = 1; for (@_) { $guess *= $_; $best = $guess if (abs($exact - $guess) < abs($exact - $best)); last if $guess > $exact; } } while NextPermuteNum(@_); $best; } my @pfs = (2,2,3,3,5,5,7); # Compute product of factors our ($a, $b); my $num = reduce { $a * $b } @pfs; my $root = sqrt $num; print "N=$num, R=$root\n"; print closest($num, @pfs), "\n";