• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

Rubyには、最大公約数を求めるInteger#gcd と Integer#gcd2がある。
「gcd"2"ってなんやねん!」と気になったので、実装を見てみた。

ruby>>

File lib/mathn.rb, line 19

def gcd2(int)
a = self.abs
b = int.abs
a, b = b, a if a < b

pd_a = a.prime_division
pd_b = b.prime_division

gcd = 1
for pair in pd_a
  as = pd_b.assoc(pair[0])
  if as
    gcd *= as[0] ** [as[1], pair[1]].min
  end
end
return gcd

end
<<ruby

2数を因数分解し、どちらにもある数をかけていくと言う強引なものだった。

ついでにInteger#gcdのほうも見てみた。
ruby>>

File lib/rational.rb, line 438

def gcd(other)
min = self.abs
max = other.abs
while min > 0
tmp = min
min = max % min
max = tmp
end
max
end
<<ruby

コチラは、ユークリッドの互除法。
シンプルだ。

参考までに、この2つに関してベンチマークしてみた。

  • コード
    ruby>>
    require 'mathn'
    require 'benchmark'

Benchmark.bm do |x|
x.report("Integer#gcd :"){ 12345.gcd(123456789) }
x.report("Integer#gcd2:"){ 12345.gcd2(123456789) }
end
<<ruby

  • 結果
    ruby>>
    user system total real

Integer#gcd : 0.000000 0.000000 0.000000 ( 0.000000)
Integer#gcd2: 0.516000 0.000000 0.516000 ( 0.516000)
<<ruby

結果は当たり前といったら当たり前なんやけども、Integer#gcd2のほうが遅かった。

何でInteger#gcdとInteger#gcd2の2つが存在するんやろ・・・。

というか、Integer#gcd2が何で存在しているのかが不思議!!

何かメリットでもあるんやろか・・・?

posted by y_tsuda y_tsuda on Thu 14 Aug 2008 at 01:06 with 0 comments
Contents rssrss
Xperiaにインストールして1週間生き残ったアプリたち
gem serverをIE8から見るとヒドイことになる現象を解決
gem serverをIE8から見るとヒドイことに
Twitter, Account Suspended
GentooにRuby1.9をインストールした
GentooにScalaをインストールしてみた
多面ディスプレイ環境を手作りしてみた
lower-camel caseな文字列とアンダースコア区切りな文字列の相互変換をRubyで
topコマンドでのCPUコア毎の表示
Fedora11 (on VirtualBox) 速効レビュー
Tags
rubyGentooDIYFedoralinuxmemoScalatwitterunixvirtualboxweb
Comments rssrss
Aleksey Aleksey: The uname check is only due to a somewhat sloppy t... 02/02 07:03
Yu Tsuda Yu Tsuda: あぁ、そうですね、、syncすると戻ってしまいますね・・・。 ご指摘ありがとうございます!! 07/11 15:38
ursm ursm: /usr/portage 以下のファイルは更新のたび元に戻ってしまうので、/etc/portage/... 07/11 13:46
Yu Tsuda Yu Tsuda: 見た目だけでも、わざわざGentooをこういうリストに入れてるのがすごいなぁと思ったりしたのです(笑... 03/31 19:49
Leonard Chin (レオ) Leonard Chin (レオ): ただし、VirtualBoxで「Gentoo」などを選択しても、別にどのOSを入れても大丈夫だ。あく... 03/31 13:00
Yu Tsuda Yu Tsuda: この機能、結構便利なんですよねー。 またEmacsで便利な機能を見つけたらブログに書きまーす。 11/27 23:46
Services from s21g
YOMU Web小説リーダー
Web小説を音声で楽しむ読み上げリーダー
補助探
公開されている補助金・助成金情報を集約し、条件に合う制度を探しやすくするサービスです。
jotter.me
個人開発者のためのホスティング一体型ノートサービス
ハンドミラー
iPhone向けの手鏡アプリ
ツイプロ(twpro)
Twitterプロフィールの高速検索エンジン