diff options
author | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-20 00:36:55 +0000 |
---|---|---|
committer | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-20 00:36:55 +0000 |
commit | 68354c350a278a565bc3b2b3ba793b8a9dcd2712 (patch) | |
tree | 7a35a520c4c6ca5a6661357d6a3668b8769d7e59 | |
parent | 825a1e939bd85e19d5a3de0411aa1fa6f23e0e99 (diff) | |
download | ruby-68354c350a278a565bc3b2b3ba793b8a9dcd2712.tar.gz |
lib/prime: Fix primality of some large integers [#13492].
* lib/prime.rb: Use accurate sqrt to insure all factors are tested.
Patch by Marcus Stollsteimer.
* test/test_prime.rb: Adapt test for timeout
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58809 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | lib/prime.rb | 4 | ||||
-rw-r--r-- | test/test_prime.rb | 15 |
2 files changed, 10 insertions, 9 deletions
diff --git a/lib/prime.rb b/lib/prime.rb index ab9e05b2fe..86db1957a3 100644 --- a/lib/prime.rb +++ b/lib/prime.rb @@ -35,7 +35,7 @@ class Integer return self >= 2 if self <= 3 return true if self == 5 return false unless 30.gcd(self) == 1 - (7..Math.sqrt(self).to_i).step(30) do |p| + (7..Integer.sqrt(self)).step(30) do |p| return false if self%(p) == 0 || self%(p+4) == 0 || self%(p+6) == 0 || self%(p+10) == 0 || self%(p+12) == 0 || self%(p+16) == 0 || self%(p+22) == 0 || self%(p+24) == 0 @@ -445,7 +445,7 @@ class Prime segment_min = @max_checked segment_max = [segment_min + max_segment_size, max_cached_prime * 2].min - root = Integer(Math.sqrt(segment_max).floor) + root = Integer.sqrt(segment_max) segment = ((segment_min + 1) .. segment_max).step(2).to_a diff --git a/test/test_prime.rb b/test/test_prime.rb index fc769c54d7..fe847eb832 100644 --- a/test/test_prime.rb +++ b/test/test_prime.rb @@ -174,20 +174,21 @@ class TestPrime < Test::Unit::TestCase def test_eratosthenes_works_fine_after_timeout sieve = Prime::EratosthenesSieve.instance sieve.send(:initialize) + # simulates that Timeout.timeout interrupts Prime::EratosthenesSieve#compute_primes + class << Integer + alias_method :org_sqrt, :sqrt + end begin - # simulates that Timeout.timeout interrupts Prime::EratosthenesSieve#compute_primes - def sieve.Integer(n) - n = super(n) + def Integer.sqrt(n) sleep 10 if /compute_primes/ =~ caller.first - return n + org_sqrt(n) end - assert_raise(Timeout::Error) do Timeout.timeout(0.5) { Prime.each(7*37){} } end ensure - class << sieve - remove_method :Integer + class << Integer + alias_method :sqrt, :org_sqrt end end |