(Ruby)与えられた値が平方数であるか確認する

AtCoderの次の問題を解いていて、与えられた数が平方数であるか確認するにはどうすればいいのだろうと色々調べた結果をまとめる。

平方数とは?

平方数 - Wikipedia

平方数(へいほうすう、square number)とは、整数の自乗(二乗)で表される非負整数のことである。

  • 4=2^ 2
  • 16=2^ 4=(2^ 2)^ 2
  • 144=2^ 4\times3^ 2=(2^ 2\times3)^ 2

どうやって平方数であるかチェックするか?

素因数分解を利用する。

素因数分解とは?

素因数分解 - Wikipedia

素因数分解 (そいんすうぶんかい、英: prime factorization) とは、ある正の整数を素数の積の形で表すことである。ただし、1 に対する素因数分解は 1 と定義する[注 1]。

  • 48=2^ 4\times3
Ruby素因数分解する

Integer#prime_division (Ruby 3.3 リファレンスマニュアル) を利用する。

require 'prime'

12.prime_division #=> [[2,2], [3,1]]
10.prime_division #=> [[2,1], [5,1]]
144.prime_division #=> [[2, 4], [3, 2]]

平方数であるか確認するメソッドを実装する

require 'prime'

def square?(n)
  n.prime_division.all? {|v| (v[1] % 2).zero? }
end

prime_divisionの結果の各要素の1番目の要素がすべて2で割り切れたら2乗でくくり出せるので、それが可能であるか確認する。

※間違っていたらご指摘ください。

追記

別解 https://www.codewars.com/kata/54c27a33fb7da0db0100040e/ruby

def square?(n)
   (Math.sqrt(x) % 1).zero?
end