素因数分解

30分プログラム、その590。素因数分解をしてみる。
うわさによると、素因数分解をしてくれるUnixコマンドがあるらしいですよ。たしかfactorとかいう名前だったはずです。
教えてくれた人は、「ボクは必ずこれをインストールしとくんだ。2年に一度ぐらいの頻度で必要になるから」という分かるような分からないようなことをおっしゃってました。
というわけで、そんな重要なコマンドfactorを作ってみよう。

使い方

$ perl fact.pl 42
42 = 2 * 3 * 7

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# fact.pl -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/05/14 21:06:52
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;

sub sieve(@){
    my (@xs) = @_;
    if (@xs) {
	my ($hd,@tl) = @xs;
	($hd,&sieve(grep { $_ % $hd != 0} @tl));
    } else {
	();
    }
}

sub primes($){
    my ($n) = @_;
    sieve(2..$n);
}

sub prime_factor($){
    my ($n) = @_;

    my @primes = primes($n);
    grep { $n % $_ == 0 } @primes;
}
foreach my $n (@ARGV) {
    print $n," = ",join(' * ', prime_factor($n)), "\n";
}