Python 3 で数学を。

Python 3 とライブラリで数学の問題を解いていきます。統計学や機械学習はときどき。

Python (Python 3) で数学をやるにはどうしたらいいか。その20. 組合せ。"3コードで世界を変えることができた時代があったなんて信じられないぜ!"

このシリーズの過去記事は以下にまとめてある

py3math.hatenablog.com

当記事について

当ブログ筆者も、Python で数学をやるにはどうしたらいいか悩んでいた時期があるから、昔の自分に向けて書いたような記事。

対象とする読者

Python の入門書を一冊か二冊、一通りやった人で、Python の基本的な構文や基本的な用語がだいたいわかっている人。

そして、公式サイトを読む努力をちゃんとする人。

組合せをやってみよう

前回記事では、順列をやった。

今回は、組合せの基本的なことを SymPy でやってみよう (簡単に使用したら自作関数を作成する)。

では、早速、Python の対話モードから、

>>> from sympy.functions.combinatorial.numbers import nC

と打ち込んでみよう。

これで SymPy の nC() をすぐに使用できる準備ができた。

nC() を使用する前に、組合せの数式を書いておく。

nCr = nPr / r! = n! / r!(n - r)! だ。

それでは、10C3nC() で求めてみよう。

>>> nC(10, 3)
120

前回記事と同様、1 つわかれば後は一括処理だ。10C312C4 をリストにし、リスト内包表記で処理する。

>>> c_list = [[10, 3], [12, 4]]
>>> res1 = [nC(*i) for i in c_list]
>>> res1
[120, 495]
>>> print(*res1)
120 495

では、自作関数として、my_nC() を作成してみよう。

さきに書いた数式を読むと、まず nPr から作成したほうがよさそうにも思えるし、それはスキップできるようにも思える。あるいは、SymPy の nP() を組み込んでみるのもよさそうに思える。

ここでは練習のためにも nPr の関数から自作してみよう (前回記事でも自作した)。

ただし、階乗は、SciPy の factorial() を使用することにする。

インポートして、簡単に試してみよう。

>>> from scipy.special import factorial
>>> factorial(10)
array(3628800.)
>>> print(factorial(10))
3628800.0

まず、my_nP() を作成し、それを my_nC1() 内で使用する。

順列の数式は、nPr = n! / (n - r)! だ。

>>> def my_nP(n, r):
...     return factorial(n) / (factorial(n-r))
...
>>> def my_nC1(n, r):
...     return my_nP(n, r) / factorial(r)
...
>>> my_nC1(10, 3)
120.0

リスト内包表記で一括処理する。

>>> res2 = [my_nC1(*i) for i in c_list]
>>> res2
[120.0, 495.0]
>>> print(*res2)
120.0 495.0

次は、my_nP() を使用しないパターンを作成してみよう。

>>> def my_nC2(n, r):
...     return factorial(n) / (factorial(r)*(factorial(n-r)))
...
>>> my_nC2(10, 3)
120.0

これもリスト内包表記で一括処理する。

>>> res3 = [my_nC2(*i) for i in c_list]
>>> res3
[120.0, 495.0]
>>> print(*res3)
120.0 495.0

for 文も試してみようか。

>>> for i in c_list:
...     my_nC2(*i)
...
120.0
495.0

以上で、前回記事を含め、順列と組合せの基本的なことは終わりにする。

(つづく)。

参考文献 (数式を参考)