Last active
August 29, 2015 14:15
-
-
Save jzakiya/f13e8e5e57a295a5c7b3 to your computer and use it in GitHub Desktop.
RBX 2.5.2 regression test code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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