```Issue #10354 has been updated by Marc-Andre Lafortune.

Oups, it would help if I gave the right implementation for Bignum#prime? See below

Here are some benchmarks:

Benchmark over 1..1_000_000
Current prime lib: 15.54
Fixed prime lib:    7.13
Nick's:             2.49

Benchmark for ((1 << 65) + 5).prime?:
Current prime lib: 11.83
Fixed prime lib:    6.82
Nick's:             5.32
Mine:               4.91

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 = 3
(5..(self**0.5).floor).step(2) { |i|
if (skip_division -= 1) == 0
skip_division = 3
next
end
return false if self % i == 0
}
true
end
end

----------------------------------------
Feature #10354: Optimize Integer#prime?
https://bugs.ruby-lang.org/issues/10354#change-49332

* 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/
```