# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2058 # # 螺旋(正方形)の面積を a,一辺の長さを b として i周目 螺旋では # b = i * 2 - 1 # a = b * 2 # になる. # またb*b螺旋の右下対角線上の値は i周目の a と一致する. # i周目での対角線上の点は,b == 1 のとき # 1 # b > 1 かつ b が奇数のとき # 1. a # 2. (a - (b - 1)) # 3. (a - (b - 1) * 2) # 4. (a - (b - 1) * 3) # であり,1 は奇数平方数なので,素数になることはない. # 2,3, 4について素数か判定し,素数であるかカウントを増やす. # 全体の個数は, # 1 + (b - 1) / 2 * 4 # である. require 'prime' prime = 0 b = 3 loop do a = b * b prime += 1 if (a - (b - 1)).prime? prime += 1 if (a - (b - 1) * 2).prime? prime += 1 if (a - (b - 1) * 3).prime? if (prime.to_f / (1 + (b - 1) / 2 * 4) < 0.1) puts b break end b += 2 end