From: ruby-core@... Date: 2014-10-29T03:02:51+00:00 Subject: [ruby-core:65975] [ruby-trunk - Feature #10354] Optimize Integer#prime? Issue #10354 has been updated by Marc-Andre Lafortune. Dear Yugui, Do you have an objection that I commit my fixes (which are really bug fixes) while you decide if you want to go in the direction of Nick's optimization? Thanks ---------------------------------------- Feature #10354: Optimize Integer#prime? https://bugs.ruby-lang.org/issues/10354#change-49711 * Author: Marc-Andre Lafortune * Status: Open * Priority: Normal * Assignee: Yuki Sonoda * Category: lib * Target version: current: 2.2.0 ---------------------------------------- Nick Slocum shows in https://github.com/ruby/ruby/pull/736 that Integer#prime? can be optimized quite a bit. First, that's because there are some basic things to avoid in the current lib, like needlessly capturing blocks and there's a useless `loop do` too. I'm attaching a patch that fixes many of these things. Even after these fixes applied, Nick's version is still faster and I don't see why we would not use it for Fixnum#prime? For Bignum#prime?, since division costs more, we can go slightly faster with the following implementation: class Integer # Returns true if +self+ is a prime number, else returns false. def prime? return true if self == 2 return false if self % 2 == 0 || self % 3 == 0 || self < 2 skip_division = true (5..(self**0.5).floor).step(2) do |i| return false if skip_division && self % i == 0 skip_division = !skip_division end true end end ---Files-------------------------------- prime_opt.patch (1.55 KB) -- https://bugs.ruby-lang.org/