高校数学: 集合 (3数の集合) 4: Python3: functools.reduce() で畳み込み、または畳み込む。 Numpy: intersect1d(), union1d()

Python3 コード

sets_cap_cup_complement4.py

#!/usr/bin/env python3


"""(docstring)
"""


import functools
import numpy as np


def print_math_problem():
    """(docstring)
    """
    print("""1 から 600 までの整数の中で、2 の倍数の集合を A,
3 の倍数の集合を B, 5 の倍数の集合を C とする。
このとき、以下のものを求めよ。

(1). 集合 A の要素の個数 n(A)
(2). 集合 B の要素の個数 n(B)
(3). 集合 C の要素の個数 n(C)
(4). 集合 A cap B の要素の個数 n(A cap B)
(5). 集合 B cap C の要素の個数 n(B cap C)
(6). 集合 C cap A の要素の個数 n(C cap A)
(7). 集合 A cap B cap C の要素の個数 n(A cap B cap C)
(8). 集合 A cup B cup C の要素の個数 n(A cup B cup C)
(9). 集合 (A cap B) cup C の要素の個数 n((A cap B) cup C)
(10) 集合 A cap (B cup C) の要素の個数 n(A cap (B cup C))
""")


def s_c_c_c4():
    """(docstring)
    """
    # 全体集合を U として作成しておく。
    U = list(range(1, 601))

    # 集合 A
    A = [i for i in U if i%2 == 0]
    print('(1): n(A) = {0} (個)'.format(len(A)))

    # 集合 B
    B = [j for j in U if j%3 == 0]
    print('(2): n(B) = {0} (個)'.format(len(B)))

    # 集合 C
    C = [k for k in U if k%5 == 0]
    print('(3): n(C) = {0} (個)'.format(len(C)))

    # 集合 A cap B
    A_cap_B = np.intersect1d(A, B)
    print('(4): n(A cap B) = {0} (個)'.format(len(A_cap_B)))
    # or
    # 集合 A cap B は 6 の倍数なのでリスト内包表記で以下のように書くこともできる。
    # A_cap_B = [l for l in U if l%6 == 0]
    # or
    # A_cap_B = [l for l in U if l%2 == 0 and l%3 == 0]
    #
    # 以下の集合でも同様に倍数で求めることができるが、Numpy の関数を使用していく。

    # 集合 B cap C
    B_cap_C = np.intersect1d(B, C)
    print('(5): n(B cap C) = {0} (個)'.format(len(B_cap_C)))

    # 集合 C cap A
    C_cap_A = np.intersect1d(C, A)
    print('(6): n(C cap A) = {0} (個)'.format(len(C_cap_A)))

    # 集合 A cap B cap C
    # intersect1d() は基本的に2引数しか取れないので、functools.reduce() で畳み込む。
    A_cap_B_cap_C = functools.reduce(np.intersect1d, [A, B, C])
    print('(7): n(A cap B cap C) = {0} (個)'.format(len(A_cap_B_cap_C)))

    # 集合 A cup B cup C
    A_cup_B_cup_C = functools.reduce(np.union1d, [A, B, C])
    print('(8): n(A cup B cup C) = {0} (個)'.format(len(A_cup_B_cup_C)))

    # 集合 (A cap B) cup C
    print('(9): n((A cap B) cup C) = {0} (個)'.format(len(np.union1d(A_cap_B, C))))

    # 集合 A cap (B cup C)
    B_cup_C = np.union1d(B, C)
    print('(10): n(A cap (B cup C)) = {0} (個)'.format(len(np.intersect1d(A, B_cup_C))))


if __name__ == '__main__':
    print_math_problem()
    print('-'*79)
    s_c_c_c4()

出力

$ python3 sets_cap_cup_complement4.py
1 から 600 までの整数の中で、2 の倍数の集合を A,
3 の倍数の集合を B, 5 の倍数の集合を C とする。
このとき、以下のものを求めよ。

(1). 集合 A の要素の個数 n(A)
(2). 集合 B の要素の個数 n(B)
(3). 集合 C の要素の個数 n(C)
(4). 集合 A cap B の要素の個数 n(A cap B)
(5). 集合 B cap C の要素の個数 n(B cap C)
(6). 集合 C cap A の要素の個数 n(C cap A)
(7). 集合 A cap B cap C の要素の個数 n(A cap B cap C)
(8). 集合 A cup B cup C の要素の個数 n(A cup B cup C)
(9). 集合 (A cap B) cup C の要素の個数 n((A cap B) cup C)
(10) 集合 A cap (B cup C) の要素の個数 n(A cap (B cup C))

-------------------------------------------------------------------------------
(1): n(A) = 300 (個)
(2): n(B) = 200 (個)
(3): n(C) = 120 (個)
(4): n(A cap B) = 100 (個)
(5): n(B cap C) = 40 (個)
(6): n(C cap A) = 60 (個)
(7): n(A cap B cap C) = 20 (個)
(8): n(A cup B cup C) = 440 (個)
(9): n((A cap B) cup C) = 200 (個)
(10): n(A cap (B cup C)) = 140 (個)

参考文献 (数式を参考)