稲葉です。 本論には口を出せないので、ちょっとしたところに口をはさみます。 EGUCHI Osamu wrote: > keiju> class Integer > keiju> def gcd(int) > keiju> a = self.abs > keiju> b = int.abs > keiju> > keiju> a, b = b, a if a < b > keiju> > keiju> while b != 0 > keiju> void, a = a.divmod(b) > keiju> a, b = b, a > keiju> end > keiju> return a > keiju> end > keiju> end > keiju> > keiju> コストがかかるのは, whileループですが, 小さい数で大きい数をdivmodしつ > keiju> づけるだけですから, ループの数はそんなに大きくないかと... > > そう言えば、これの再帰版の > > def gcd(int) > return self if int == 0 > int.gcd(self % int) > end > > ってテールリカージョンの典型で載ってますね^^;;;;;;; 石塚さんもえぐちさんもCはあまりお使いでないのでしょうか? 自分はCの予約語を変数に使われるといったん構文解析に失敗します:-> > あと、while に入る前に、 > > q = a | b > while (q & 1) == 0 > a >>= 1 > b >>= 1 > end q = a | b または q >>= 1をループに入れないと抜け出せないような。。。 while a[0] == 0 && b[0] == 0 の効率がいいと思います むかしどこかで読んだ割り算を使わないGCDです。 class Integer def gcd(n) m = self b = 0 while n[0]==0 && m[0]==0 b+=1; n>>=1; m>>=1 end m>>=1 while m[0]==0 n>>=1 while n[0]==0 while m!=n m, n = n, m if n > m m -= n; m>>=1 while m[0]==0 end m<<b end end -- 稲葉 浩人 <inaba / st.rim.or.jp>