#!/usr/bin/perl -w
# factor - factor a number
# Written for the PPT initiative by Jonathan Feinberg.
# See docs for license.
use strict;
$|++;
my $VERSION = '1.0';
END {
close STDOUT || die "$0: can't close stdout: $!\n";
$? = 1 if $? == 255; # from die
}
if (@ARGV) {
for (@ARGV) { factor($_) }
}
else {
while (<>) {
chomp;
if (/^\s*(\S+)/) {
factor($1);
}
}
}
exit 0;
my @primes; # initialized in BEGIN block below
sub factor {
my $n = shift;
unless ($n =~ /^\+?\d{1,10}$/ && $n <= 2**32 - 1) {
warn "$0: `$_' is not a valid positive integer\n";
return;
}
exit 0 if $n == 0;
print "$n:";
if ($n == 1) { print "1\n"; return }
foreach my $prime (@primes) {
while ($n % $prime == 0) {
print " $prime";
$n /= $prime;
}
last if $n == 1;
}
if ($n > 1) { print "$n" }
print "\n";
}
BEGIN {
@primes = (
#
#PRIMES GO HERE
#
);
}
__END__
=head1 NAME
B - factor a number
=head1 SYNOPSIS
B [I]
=head1 DESCRIPTION
The factor utility will factor positive integers less than or equal to
C<2^32 - 1>. When a number is factored, it is printed, followed by a
``:'', and the list of factors on a single line. Factors are listed
in ascending order, and are preceded by a space. If a factor divides
a value more than once, it will be printed more than once.
When factor is invoked with one or more arguments, each argument will be
factored.
When factor is invoked with no arguments, factor reads numbers, one
per line, from standard input, until end of file or error. Leading
white-space and empty lines are ignored. Numbers may be preceded by a
single C<-> or C<+>. Numbers are terminated by a non-digit character
(such as a new-line). After a number is read, it is factored.
=head1 BUGS
I has no known bugs. This documentation corrects a bug in the
BSD implementation of I, which incorrectly states that
I will accept negative integers.
=head1 AUTHOR
The Perl implementation of I was written by Jonathan Feinberg,
I.
=head1 COPYRIGHT and LICENSE
This program is copyright (c) Jonathan Feinberg 1999.
This program is free and open software. You may use, modify, distribute,
and sell this program (and any modified variants) in any way you wish,
provided you do not restrict others from doing the same.