Pythonで与えられた数がd(2の累乗)の冪乗かどうかを判定する方法
ある数 n と別の値 x が与えられたとき、n が x の冪乗であるかどうかを判定します。ここで、x は必ず 2 の累乗(べき乗)であるものとします。
たとえば、入力が n = 32768、x = 32 の場合、32768 = 32^3 が成り立つため、出力は True になります。
解決のための手順
この問題は、次の手順で解くことができます。
- カウンタ
cntを 0 で初期化します。 nが 0 ではなく、かつ(n AND (n - 1))の結果が 0 である場合(つまりn自身が 2 の累乗である場合)は、以下の処理を行います。n > 1の間、nを 2 で割り続け、その回数をcntに加算します。- 最後に、
cnt mod (log₂ c)が 0 と等しいかどうかを返します。
- 条件を満たさない場合は
Falseを返します。
ポイントとなるのは (n & (n - 1)) == 0 という判定式です。これは「n が 2 の累乗かどうか」を確認する定番のビット演算テクニックです。2 の累乗は二進表現で 1 ビットだけが立っているため、1 を引くとすべての下位ビットが反転し、AND 演算の結果が 0 になります。
実装例
理解を深めるために、以下の実装を見てみましょう。
def find_pow_of_2(n):
return (1 + find_pow_of_2(n / 2)) if (n > 1) else 0
def solve(n, c):
cnt = 0
if n and (n & (n - 1)) == 0:
while n > 1:
n >>= 1
cnt += 1
return cnt % (find_pow_of_2(c)) == 0
return False
n = 32768
x = 32
print(solve(n, x))
入力
32768, 32
出力
True
コードの解説
補助関数 find_pow_of_2() は再帰的に呼び出され、引数として渡された数が 2 の何乗であるか(すなわち log₂ の値)を計算します。
メインの solve() 関数では、まず n が 2 の累乗であることを確認し、その後、右シフト演算子 >>= を使って n を繰り返し半分にしながら指数部分をカウントします。最後に、その指数が x の指数(log₂ x)で割り切れるかどうかを判定することで、n が x の冪乗であるかどうかが分かります。
-
Pythonで与えられた数値がフィボナッチ数かどうかを判定する方法
本記事では、与えられた数値がフィボナッチ数であるかどうかを判定する問題の解決策について解説します。 問題の定義 ある数値 n が与えられたとき、その数値がフィボナッチ数であるかどうかを判定します。 第 n 項のフィボナッチ数は、直前の2つのフィボナッチ数の和として定義されることは広く知られています。しかし、フィボナッチ数列には漸化式以外にも興味深い数学的性質があります。 フィボナッチ数の判定条件 ある数値 n がフィボナッチ数であるのは、「5×n² + 4」または「5×n² − 4」のいずれかが完全平方数であるとき、かつそのときに限る この性質を利用すれば、フィボナッチ数列を実際に生成しなくて
-
【Python】与えられた数がフィボナッチ数かどうかを判定する方法を解説
本記事では、以下の問題文に対する解決策について詳しく学んでいきます。 問題の定義 数値 n が与えられたとき、その数がフィボナッチ数であるかどうかを判定します。 ご存知のとおり、n番目のフィボナッチ数は「直前の2つのフィボナッチ数の和」として定義されます。しかし、この漸化式以外にも、フィボナッチ数には興味深い数学的な性質が存在します。 フィボナッチ数の判定に使える重要な性質 ある数 n がフィボナッチ数であるのは、次の条件が成り立つ場合、かつその場合に限られます。 5×n² + 4 が完全平方数である または 5×n² − 4 が完全平方数である つまり、上記のどちらか一方(または両方)が