Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで素数の配列の積が完全平方数かどうかを判定する方法

すべての要素が素数である配列 nums が与えられたとします。このとき、配列内の全要素の積が完全平方数(平方数)であるかどうかを判定する必要があります。

たとえば、入力が nums = [3,3,7,7] の場合、出力は True になります。すべての要素の積は 441 となり、21² = 441 であるため、441 は完全平方数だからです。

解法のアプローチ

この問題は、素因数分解の性質を使うことで効率的に解けます。ある数が完全平方数であるためには、その素因数の指数がすべて偶数でなければなりません。つまり、配列内の各素数の出現回数を数え、1つでも奇数回現れる素数が存在すれば、その積は完全平方数にはなりません。

手順は以下の通りです。

  • m := 配列 nums 内の各要素とその出現頻度を保持するマップ(辞書)を作成します。
  • nums の各キーについて次を繰り返します。
    • m[key] が奇数であれば False を返します。
  • すべてのキーが偶数回出現していれば True を返します。

この方法では、実際に大きな積を計算する必要がないため、桁あふれや多倍長整数演算のコストを避けられます。計算量は時間・空間ともに O(n) と効率的です。

実装例

以下の実装を見ると、より理解しやすくなります。

from collections import defaultdict
def solve(nums) :
    m = defaultdict(int)
    for key in nums :
        m[key] += 1
    for key in nums :
        if m[key] % 2 == 1 :
            return False
    return True

nums = [3,3,7,7]
print(solve(nums))

入力

[3,3,7,7]

出力

True
  1. 【C++】配列内のすべての素数の積を求める方法

    整数型配列 arr[] が与えられたとき、その配列に含まれるすべての素数を見つけ出し、それらの積を計算するのが本記事のテーマです。素数とは、1とその数自身でしか割り切れない正の整数のことです。たとえば、2、3、5、7、11などが素数に該当します。それでは、次の配列を例に解を求めてみましょう。入力: arr[] = { 11, 20, 31, 4, 5, 6, 70 }出力: 1705説明: 配列内の素数は 11、31、5 の3つであり、その積は 11 × 31 × 5 = 1705 となります。入力: arr[] = { 1, 2, 3, 4, 5, 6, 7 }出力: 210説明: 配列内の

  2. 【Python】自身を除く配列要素の積を除算なしで求める方法

    問題の概要 n > 1 を満たす n 個の整数からなる配列 nums があるとします。ここで、output[i] が nums[i] 以外のすべての要素の積と等しくなるような配列 output を求めます。 例えば、入力配列が [1,2,3,4] の場合、出力は [24,12,8,6] となります。重要な制約として、この問題は除算演算子を使用せずに解く必要があります。 解法のアプローチ この問題は「右側からの累積積」と「左側からの累積積(プレフィックス)」を組み合わせることで効率的に解けます。各位置 i に対して、「左側の要素の積 × 右側の要素の積」を計算すればよいのです。 アルゴ