Miller–Rabin primality test: Difference between revisions

Content added Content deleted
Line 1,070: Line 1,070:


require "big"
require "big"
require "random"


module Primes
module Primes
Line 1,075: Line 1,076:


# Returns true if +self+ is a prime number, else returns false.
# Returns true if +self+ is a prime number, else returns false.
def primemr?
def primemr?(k = 10)
primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47}
primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47}
return primes.includes? self if self <= primes.last
return primes.includes? self if self <= primes.last
Line 1,082: Line 1,083:
# Choose input witness bases: wits = [range, [wit_bases]] or nil
# Choose input witness bases: wits = [range, [wit_bases]] or nil
wits = WITNESS_RANGES.find { |range, wits| range > self }
wits = WITNESS_RANGES.find { |range, wits| range > self }
witnesses = wits && wits[1] || primes
witnesses = wits && wits[1] || k.times.map{ 2 + rand(self - 4) }
miller_rabin_test(witnesses)
miller_rabin_test(witnesses)
end
end