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

Pythonでnの真の約数が偶数の完全平方数になる確率を求めるプログラム


整数 n が与えられたとき、その真の約数(n 自身を除く約数)の中から無作為に 1 つ選んだ際、それが「偶数の完全平方数」である確率を求める問題を考えます。

たとえば入力が n = 36 の場合、出力は 1/8 になります。これは、36 の真の約数が {1, 2, 3, 4, 6, 9, 12, 18} の 8 個あり、そのうち偶数かつ完全平方数に該当するのは 4 のみだからです。

解法のアプローチ

この問題は、次の手順に従って解くことができます。

  • n を 4 で割った余りが 0 でない場合は 0 を返します(2 の指数が不足しているため、条件を満たす約数が存在しない)。
  • それ以外の場合は、以下を実行します。
    • nc := n、ptr := 2 とし、空のリスト l を用意します。
    • ptr が nc の平方根以下である間、次を繰り返します。
      • a := 0 とします。
      • nc が ptr で割り切れる間、a を 1 増やし、nc を nc ÷ ptr の商(切り捨て)で更新します。
      • a > 0 の場合、a をリスト l に追加します。
      • ptr を 1 増やします。
    • nc > 1 の場合、1 をリスト l に追加します。
    • k := l[0]、d := k + 1、no := k ÷ 2 の切り捨てとします。
    • l の 2 番目以降の各要素 i について、d := d × (i + 1)、no := no × (i ÷ 2 の切り捨て + 1) とします。
    • d := d − 1 とします。
    • n 自身が完全平方数である場合、no := no − 1 とします。
    • d と no の最大公約数 g を求め、d := d ÷ g、no := no ÷ g として約分します。
    • no が 0 の場合は 0 を返し、そうでなければ分数 no/d を返します。

アルゴリズムのポイント

ある約数が偶数の完全平方数になるためには、素因数分解した際のすべての指数が偶数であり、かつ 2 の指数が 2 以上である必要があります。したがって、n = 2k × … と素因数分解できるとき、2 の指数としては {2, 4, …, k} の ⌊k/2⌋ 通り、その他の素因数 pi については {0, 2, …, i} の ⌊i/2⌋ + 1 通りが選べます。これらを掛け合わせることで、条件を満たす約数の個数が求まります。なお、n 自身が完全平方数の場合は「真の約数」の定義上 n を除外する必要があるため、1 を差し引きます。分母は全約数の個数から 1 を引いた値、つまり真の約数の総数です。

実装例

理解を深めるために、以下のPythonコードを見てみましょう。

from math import gcd

def solve(n):
    if n % 4 != 0:
        return 0
    else:
        nc = n
        ptr = 2
        l = []
        while ptr <= nc ** 0.5:
            a = 0
            while nc % ptr == 0:
                a += 1
                nc = nc / ptr
            if a > 0:
                l += [a]
            ptr += 1
        if nc > 1:
            l += [1]
        k = l[0]
        d = k + 1
        no = int(k / 2)
        for i in l[1:]:
            d = d * (i + 1)
            no *= int(i / 2) + 1
        d = d - 1
        if int(n ** 0.5) ** 2 == n:
            no -= 1
        g = gcd(d, no)
        d = d // g
        no = no // g
        if no == 0:
            return 0
        else:
            return str(no) + '/' + str(d)

n = 36
print(solve(n))

入力

n = 36

出力

1/8
  1. Pythonプログラムで数の偶数の約数の合計を求める方法

    この記事では、以下の問題文に対する解決策について詳しく解説します。 問題文:ある数が与えられたとき、その数のすべての偶数の約数(因子)の合計を求めて表示します。 アプローチ まず、与えられた数が奇数であるかどうかを確認します。奇数には偶数の約数が存在しないため、その場合は 0 を返します。 数が偶数である場合は、実際の計算に進みます。ここでのポイントは、20(つまり1)以外のすべての項を掛け合わせることで、偶数の約数の合計が得られるという点です。 偶数の約数からすべての奇数を取り除くために、20 に相当する「1」を無視します。この処理を行うことで、残るのは偶数の約数のみとなります。なお、2 は

  2. Pythonで数の偶数の約数の合計を求めるプログラムの実装方法

    本記事では、以下の問題文に対する解決策について学びます。問題文整数 n が与えられたとき、その数の偶数の約数(偶因子)の合計を求めることが課題です。この問題を解くには、まず奇数の約数をすべて除外する必要があります。入力された数が奇数の場合、偶数の約数は一つも存在しないため、直接 0 を返します。そうでない場合は、以下のコードで示すアプローチに従います。アルゴリズムの考え方このアプローチでは素因数分解を活用します。約数の合計は「各素因数の冪乗の和の積」として表せるという性質を利用します。偶数の約数のみを対象とするため、素因数 2 の部分については 20(つまり 1)を除外し、21 以降の項だけを