原です。

In message "[ruby-math:00675] Re: power"
    on 02/04/07, sinara / blade.nagaokaut.ac.jp <sinara / blade.nagaokaut.ac.jp> writes:
|
|原です。

||n = other
||while n & 1 == 0
||   x *= x
||   n >>= 1
||end
||z = x
||n >>= 1
||while n != 0
||   z *= x if n & 1 != 0
||   x *= x
||   n >>= 1
||end

|とは言え、このコードは、見ためは悪いけど「定石」と呼んで
|もいいかもしれませんね。

と、思ったのですが、これも [ruby-math:00671] のコードも最後
に一回余計な x *= x をさせていますね。

改良すると、other >= 0 バージョンでは

  def **(other) #other >= 0
    u = unity
    x = self
    while (other & 1 != 0 and u *= x; (other >>= 1) != 0)
      x *= x
    end
    u
  end

あるいは、

  def **(other) #other >= 0
    u = unity
    x = self
    while true
      other & 1 != 0 and u *= x
      (other >>= 1) != 0 and x *= x or return u
    end
  end

でしょうか。

そして後者を変形して対称性にこだわった other > 0
バージョンは、

  def **(other) #other > 0
    x = self
    while true
      (sw = (other & 1 != 0)) and u = x
      (other >>= 1) != 0 and x *= x or return u
      while sw
	(other & 1 != 0) and u *= x
	(other >>= 1) != 0 and x *= x or return u
      end
    end
  end

でしょうか。