AtCoderの次の問題を解いていて、与えられた数が平方数であるか確認するにはどうすればいいのだろうと色々調べた結果をまとめる。
平方数とは?
平方数(へいほうすう、square number)とは、整数の自乗(二乗)で表される非負整数のことである。
どうやって平方数であるかチェックするか?
素因数分解を利用する。
素因数分解とは?
素因数分解 (そいんすうぶんかい、英: prime factorization) とは、ある正の整数を素数の積の形で表すことである。ただし、1 に対する素因数分解は 1 と定義する[注 1]。
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