Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.71 KB | None | 0 0
  1. class Sieve
  2.     def flip prime_ind
  3.         if prime_ind.eql?("non-prime")
  4.             return "prime"
  5.         else
  6.             return "non-prime"
  7.         end
  8.     end
  9.  
  10.     def atkinssieve(line)
  11.         @results_list = Array.new
  12.         @results_list << 2 << 3 << 5
  13.         @sieve_list = Hash.new
  14.         (1...line).each {|number| @sieve_list[number] = "non-prime" }
  15.        
  16.         @sieve_list.each_key {|number|
  17.             number_rooted = Math.sqrt(number).ceil
  18.             case number%60
  19.             when 1, 13, 17, 29, 37, 41, 49, 53
  20.                 z=0
  21.                 (1..number_rooted).each {|x|
  22.                     (1..number_rooted).each {|y|
  23.  
  24.                         if 4 * x**2 + y**2 - number == 0
  25.                             z = (z+1)%2
  26.                         end
  27.                     }
  28.                 }
  29.                 if z > 0
  30.                     @sieve_list[number] = flip @sieve_list[number]
  31.                 end
  32.             when 7, 19, 31, 43
  33.                 z=0
  34.                 (1..number_rooted).each {|x|
  35.                     (1..number_rooted).each {|y|
  36.                         if 3 * x**2 + y**2 - number == 0
  37.                             z = (z+1)%2
  38.                         end
  39.                     }
  40.                 }
  41.                 if z > 0
  42.                     @sieve_list[number] = flip @sieve_list[number]
  43.                 end
  44.             when 11, 23, 47, 59
  45.                 z=0
  46.                 (1..number_rooted).each {|x|
  47.                     (1..number_rooted).each {|y|
  48.                         while x > y
  49.                             if 3 * x**2 - y**2 - number == 0
  50.                                 z = (z+1)%2
  51.                             end
  52.                         end
  53.                         break
  54.                     }
  55.                 }
  56.                 if z > 0
  57.                     @sieve_list[number] = flip @sieve_list[number]
  58.                 end
  59.             end
  60.         }
  61.  
  62.         @sieve_list.each_key {|key|
  63.             if @sieve_list[key] == "prime"
  64.                 @results_list << key
  65.                 (key..@sieve_list.length).each {|ky|
  66.                     if ky % (key**2) == 0
  67.                         @sieve_list[ky] = "non-prime"
  68.                     end
  69.                 }
  70.             end
  71.         }
  72.         return @results_list
  73.     end
  74.  
  75. end
  76.  
  77. File.open(ARGV[0]).each { |line|
  78.     siv = Sieve.new
  79.     rst_list = siv.atkinssieve(line.to_i)
  80.     rst_list.slice!(0,rst_list.length-1).each {|result| printf "#{result}," }
  81.     puts rst_list.last
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement