Doesn't use Math::Big::Factor
, isn't particularly dynamic, doesn't have exponential complexity, and could be much faster in C. With all those caveats, here you go...
print sqrt_factor(shift), "\n";
my $n = shift;
my $root = int(sqrt($n));
for (my $i=$root; $i>1; $i--)
if( ($n % $i) == 0 )
my $factor2 = int($n / $i);
return (($root - $i)<($factor2 - $root)) ? $i : $factor2
-- All code is 100% tested and functional unless otherwise noted.