【Python】数珠順列を計算する関数を作成し、異なる色の玉で数珠を作る場合の数を求める

■概要

場合の数のうち、数珠順列について、
机上計算とPythonを使用した計算処理の2種類の解答方法を示す。

■数珠順列

下図のように、人以外のモノが円形に繋がっている場合は、ひっくり返すことが可能であり、このような順列を「数珠順列」と呼ぶ。

▼数珠順列の公式

n個の異なる玉を繋いで円形に並べる場合は、「円順列 ÷ 2」で算出することができる。

・参考:円順列の求め方

■例題

▼問1

6色の異なる玉で数珠を作成するときの場合の数を数を求める。

▼問2

8色の異なる玉から6個選び、数珠を作成するときの場合の数を求める。

■机上計算

▼問1

以下の図のように、6色の異なる玉で数珠を作る場合の数は、
(6!/ 6)/ 2
=(5!) / 2
= (5・4・3・2・1)/ 2
= 60(通り)

▼問2

以下の図のように、8色の異なる玉から6個選び、数珠を作る場合の数は、
①8個から6個選ぶ場合の数
8P6 通り
②円順列の計算(重複分の除去)
8P6 / 6 通り
③数珠順列の計算(ひっくり返し分の除去)
8P6 / 6)/ 2
={(8・7・6・5・4・3・2・1)/ 6 } /2
=1680(通り)

■ Pythonによる実装

▼フローチャート

▼プログラム仕様

<処理名:数珠順列を計算する関数>

・引数と戻り値

項目内容
第1引数nn P r のうち、「n」
第2引数rn P r のうち、「r」
戻り値計算結果数珠順列の計算結果

・処理概要

入力処理内容出力
戻り値用の初期値をセットする。
初期値:1
計算用の一時変数を用意する。
初期値:第一引数(n)
n P r のうち、「r」の回数分ループ
|戻り値用の値に「n」をかける。
|「n」を-1する。
円順列として、重複分を削除する。
数珠順列として、ひっくり返し分を削除する。
戻り値として、計算結果を返す。【戻り値】
計算結果

▼サンプルコード

# 数珠順列を算出する関数
def CalPrayerBeadsPermutation(n: int, r: int) -> int:
    # 戻り値の初期値をセット
    cal_data = 1
    # 計算用一時変数
    cal_tmp = n

    # nPrのうち、r回数分ループする
    for _ in range(r):
        # nPrのうち、n(cal_tmp)で掛け算
        cal_data = cal_data * cal_tmp

        # デクリメント処理
        cal_tmp = cal_tmp - 1

    # 重複分を削除
    cal_data = cal_data / r

    # 円順列から重複分を削除
    cal_data = cal_data / 2

    # 戻り値を返す
    return int(cal_data)


if __name__ == '__main__':
    print('問1:', CalPrayerBeadsPermutation(7, 7), '通り')
    print('問2:', CalPrayerBeadsPermutation(8, 6), '通り')

▼実行結果

問1: 360 通り
問2: 1680 通り
タイトルとURLをコピーしました