Skip to content

Instantly share code, notes, and snippets.

@jzakiya
Last active August 29, 2015 14:15
Show Gist options
  • Select an option

  • Save jzakiya/f13e8e5e57a295a5c7b3 to your computer and use it in GitHub Desktop.

Select an option

Save jzakiya/f13e8e5e57a295a5c7b3 to your computer and use it in GitHub Desktop.
RBX 2.5.2 regression test code
class Integer
def primzpa?(p=13) # P13 is default prime generator here
seeds = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
return 'PRIME OPTION NOT A SEEDS PRIME' if !seeds.include? p
n = self.abs
# find primes <= Pn, compute modPn then Prime Gen residues for Pn
primes = seeds[0..seeds.index(p)]; mod = primes.inject {|a,b| a*b }
mod = 30 if p > 5 and n < mod+2 # for Pp > P5 and n within Pp residues
residues=[1]; 3.step(mod,2) {|i| residues << i if mod.gcd(i) == 1}
residues << mod+1; rescnt = residues.size-1
return true if primes.include? n
return false if not residues.include?(n%mod) || n == 1
sqrtN = Math.sqrt(n).to_i
modk = 0; p=residues[1] # first prime candidate pj
res = residues[1..-1].map {|r| r-p } # residues distance from first prime
while p <= sqrtN
return false if res.map {|r| n%(r+p)}.include? 0 # <----- test code
p += mod # first prime candidate for next residues group
end
return true
end
def primzpb?(p=13) # P13 is default prime generator here
seeds = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
return 'PRIME OPTION NOT A SEEDS PRIME' if !seeds.include? p
n = self.abs
# find primes <= Pn, compute modPn then Prime Gen residues for Pn
primes = seeds[0..seeds.index(p)]; mod = primes.inject {|a,b| a*b }
mod = 30 if p > 5 and n < mod+2 # for Pp > P5 and n within Pp residues
residues=[1]; 3.step(mod,2) {|i| residues << i if mod.gcd(i) == 1}
residues << mod+1; rescnt = residues.size-1
return true if primes.include? n
return false if not residues.include?(n%mod) || n == 1
sqrtN = Math.sqrt(n).to_i
modk = 0; p=residues[1] # first prime candidate pj
res = residues[1..-1].map {|r| r-p } # residues distance from first prime
while p <= sqrtN
return false if res.any? {|r| n%(r+p) == 0} # <----- test code
p += mod # first prime candidate for next residues group
end
return true
end
end
require 'benchmark/ips'
prime1 = 20_000_000_000_000_003 # 17 digits
prime2 = 200_000_000_000_000_003 # 18 digits
def primetests(prime1,prime2)
Benchmark.ips do |x|
x.report("primzpa? for P = #{prime1}") { prime1.primzpa?}
x.report("primzpb? for P = #{prime1}") { prime1.primzpb?}
x.report("primzpa? for P = #{prime2}") { prime2.primzpa?}
x.report("primzpb? for P = #{prime2}") { prime2.primzpb?}
x.compare
end
end
primetests(prime1,prime2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment