作者: KAWAI,Takanori
日時: 2003/6/24(19:23)
川合孝典です。

ロジック的にはかわじさんの書かれている通りかなと思っています。
ただ結果を取っておくとすれば、81個と数が限られていて、ど多いというほど
のこともないですからハッシュより普通の配列のほうが効率的かなと思いますが。

で、今回の例では値が整数と限定してもいいでしょう。
そこでPerでuse integerをつけてみたところ、効率がアップしました。
#ついでに$i**2よりも$i*$iのほうが実はよっぽど効いてたりするようですが

[実験したコード]
use strict;
use Benchmark;
my $sSum =q {
  use constant CstRANGE => 9;
  use strict;
  sub get99($) {
      my($iObj) =@_;
      return wantarray? () : 0 if(($iObj < 1) || ($iObj >
CstRANGE*CstRANGE));
      my @aRes=();
      my $j;
      for(my $i=1; $iObj >= $i*$i;++$i){
          if(!($iObj % $i)) {
              $j = $iObj / $i;
              if($j <= CstRANGE) {
                  if($i == $j) {
                      push @aRes, "$i*$i";
                  }
                  else {
                      push @aRes, ("$i*$j", "$j*$i");
                  }
             }
          }
        }
        return want_array? @aRes: scalar(@aRes);
  }
  my $iObj;
  for(my $iObj=1;$iObj<=CstRANGE*CstRANGE;++$iObj) {
      get99($iObj);
  }
};
timethese(5000, {
   'INTEGER' => "use integer;\n". $sSum,
   'NON INT' => $sSum,
});

[実行結果]
Benchmark: timing 5000 iterations of INTEGER, NON INT...
   INTEGER:  5 wallclock secs ( 4.60 usr +  0.00 sys =  4.60 CPU) @
1087.90/s (n=5000)
   NON INT:  8 wallclock secs ( 7.96 usr +  0.00 sys =  7.96 CPU) @ 627.98/s
(n=5000)

===================================================
川合 孝典 (Hippo2000)
   DBI日本語メーリングリスト管理人、Kansai.pm所属
   kwitknr@... GCD00051@...
   http://member.nifty.ne.jp/hippo2000、http://www.hippo2000.info/
perldocの日本語情報ならperldocjp:翻訳してみませんか?
  http://perldocjp.sourceforge.jp/
===================================================