# Math (Module)

In: | mathn.rb

## Methods

rsqrt sqrt

## Public Instance methods

sqrt(a)

[Source]

    # File mathn.rb, line 231
      def sqrt(a)
        if a.kind_of?(Complex)
          abs = sqrt(a.real*a.real + a.image*a.image)
    #      if not abs.kind_of?(Rational)

    #       return a**Rational(1,2)

    #      end

          x = sqrt((a.real + abs)/Rational(2))
          y = sqrt((-a.real + abs)/Rational(2))
    #      if !(x.kind_of?(Rational) and y.kind_of?(Rational))

    #       return a**Rational(1,2)

    #      end

          if a.image >= 0
            Complex(x, y)
          else
            Complex(x, -y)
          end
        elsif a >= 0
          rsqrt(a)
        else
          Complex(0,rsqrt(-a))
        end
      end

rsqrt(a)

[Source]

    # File mathn.rb, line 254
      def rsqrt(a)
        if a.kind_of?(Float)
          sqrt!(a)
        elsif a.kind_of?(Rational)
          rsqrt(a.numerator)/rsqrt(a.denominator)
        else
          src = a
          max = 2 ** 32
          byte_a = [src & 0xffffffff]
          # ruby's bug

          while (src >= max) and (src >>= 32)
            byte_a.unshift src & 0xffffffff
          end

          answer = 0
          main = 0
          side = 0
          for elm in byte_a
            main = (main << 32) + elm
            side <<= 16
            if answer != 0
              if main * 4  < side * side
                applo = main.div(side)
              else
                applo = ((sqrt!(side * side + 4 * main) - side)/2.0).to_i + 1
              end
            else
              applo = sqrt!(main).to_i + 1
            end

            while (x = (side + applo) * applo) > main
              applo -= 1
            end
            main -= x
            answer = (answer << 16) + applo
            side += applo * 2
          end
          if main == 0
            answer
          else
            sqrt!(a)
          end
        end
      end

[Validate]