Skip to content

Commit 3d9721b

Browse files
committed
Implement Integer.sqrt for large integers
Implement Integer.sqrt algorithm used in CRuby (Newton's method) ruby/ruby#10274
1 parent a65bde3 commit 3d9721b

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

spec/tags/core/integer/sqrt_tags.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/main/ruby/truffleruby/core/integer.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,17 @@ def self.try_convert(obj)
350350
def self.sqrt(n)
351351
n = Primitive.rb_to_int(n)
352352
raise Math::DomainError if n.negative?
353-
Math.sqrt(n).floor
353+
return Math.sqrt(n).floor if n < 0xfffffffffffff
354+
355+
shift = n.bit_length / 4
356+
x = sqrt(n >> (2 * shift)) << shift
357+
x = (x + n / x) / 2
358+
xx = x * x
359+
while xx > n
360+
xx -= 2 * x - 1
361+
x -= 1
362+
end
363+
x
354364
end
355365

356366
private def upto_internal(val)

0 commit comments

Comments
 (0)