院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

素数を求める

## エラトステネスのふるいを用いて素数を求める
def getPrime(num)
  return [2] if num == 2
  return [2, 3] if num == 3

  rootPrime = getPrime(Math.sqrt(num).floor)
  eratosu(rootPrime, num)
end

## エラトステネスのふるい
## rootPrime:numの平方根より小さい素数
## num:求めたい素数の最大
def eratosu(rootPrime, num)
  # idxがふるいにかける数、val=1が素数、val=0が素数じゃない
  # 0と1は素数じゃない
  primeCand = Array.new(num, 1)
  primeCand[0] = 0 
  primeCand[1] = 0

  # 素数の定数倍を削除
  rootPrime.each do |el|
    i = el
    while el * i < num
      primeCand[el * i] = 0
      i += 1
    end
  end

  primeCand.each_index.select { |i| primeCand[i] == 1 }
end