Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Sieve
- def flip prime_ind
- if prime_ind.eql?("non-prime")
- return "prime"
- else
- return "non-prime"
- end
- end
- def atkinssieve(line)
- @results_list = Array.new
- @results_list << 2 << 3 << 5
- @sieve_list = Hash.new
- (1...line).each {|number| @sieve_list[number] = "non-prime" }
- @sieve_list.each_key {|number|
- number_rooted = Math.sqrt(number).ceil
- case number%60
- when 1, 13, 17, 29, 37, 41, 49, 53
- z=0
- (1..number_rooted).each {|x|
- (1..number_rooted).each {|y|
- if 4 * x**2 + y**2 - number == 0
- z = (z+1)%2
- end
- }
- }
- if z > 0
- @sieve_list[number] = flip @sieve_list[number]
- end
- when 7, 19, 31, 43
- z=0
- (1..number_rooted).each {|x|
- (1..number_rooted).each {|y|
- if 3 * x**2 + y**2 - number == 0
- z = (z+1)%2
- end
- }
- }
- if z > 0
- @sieve_list[number] = flip @sieve_list[number]
- end
- when 11, 23, 47, 59
- z=0
- (1..number_rooted).each {|x|
- (1..number_rooted).each {|y|
- while x > y
- if 3 * x**2 - y**2 - number == 0
- z = (z+1)%2
- end
- end
- break
- }
- }
- if z > 0
- @sieve_list[number] = flip @sieve_list[number]
- end
- end
- }
- @sieve_list.each_key {|key|
- if @sieve_list[key] == "prime"
- @results_list << key
- (key..@sieve_list.length).each {|ky|
- if ky % (key**2) == 0
- @sieve_list[ky] = "non-prime"
- end
- }
- end
- }
- return @results_list
- end
- end
- File.open(ARGV[0]).each { |line|
- siv = Sieve.new
- rst_list = siv.atkinssieve(line.to_i)
- rst_list.slice!(0,rst_list.length-1).each {|result| printf "#{result}," }
- puts rst_list.last
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement