The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! /usr/bin/perl -w
#
# Perl Power Tools - factor
# Greg Hewgill <greg@hewgill.com> 1998-03-01

if (@ARGV) {
  foreach $n (@ARGV) {
    factor($n);
  }
} else {
  while (<>) {
    chomp;
    factor($_);
  }
}

sub factor {
  my $n = $_[0];
  if ($n < -2147483648 || $n > 2147483647) {
    print "'$n' is not a valid integer\n";
    return;
  }
  print "$n:";
  if ($n != 0) {
    $n = abs($n);
    if ($n == 1) {
      print " 1";
    } else {
      my $q = sqrt($n);
      foreach $p (primes($q)) {
        if ($n % $p == 0) {
          print " $p";
          $n /= $p;
          last if $n == 1;
          redo;
        }
      }
      if ($n > 1) {
        print " $n";
      }
    }
  }
  print "\n";
}

sub primes {
  my $n = $_[0];
  my @p = (0..$n);
  $p[1] = 0;
  foreach $p (@p) {
    if ($p[$p]) {
      $x = $p * 2;
      while ($x <= $n) {
        $p[$x] = 0;
        $x += $p;
      }
    }
  }
  return grep $_, @p;
}