Young

Summary

Young は主に組合せ論を目的とした Python 用の数学ライブラリです。

INSTALL

Young は次の URL からダウンロードできます。

[Young project page]

インストールするには大きく分けて2通りあります。

binary

Windows 用のバイナリファイルの場合、ファイルをダブルクリックして 画面に従って操作すれば無事インストールは終了です。

現在はバイナリからのインストールは Windows からしか対応していません。

source

ソースからインストールするには、アーカイブをダウンロード後、コマンドラインから次のようにします。($VER は Young のバージョンです)

$ tar zxfv young-$VER.tar.gz
$ cd young-$VER
$ python setup.py install

Usage

Python のインタープリターから使う場合、まず young モジュールをインポートします。

>>> import young
>>> from young import *     # 手を抜く

上のスタイルでモジュールをインポートした場合、関数を呼び出すときに 毎回モジュールの名前を明示的に指定する必要があります。

>>> young.partition(10)
>>> young.factorial(5)

Python のことはあまり知らず、young モジュールしか使わないなら下の方が楽でいいと思います。

Basics

まずは、基本的な計算から

>>> factorial(5)     # 5 x 4 x 3 x 2 x 1
120
>>> factorial(5,3)   # 5 x 4 x 3
60

>>> permutation(1,2,3)   # (1,2,3) の順列
[[3, 1, 2], [2, 1, 3], [1, 3, 2], [2, 3, 1], [1, 2, 3], [3, 2, 1]]
>>> permutation('xyz')   # 'x', 'y', 'z' の順列
[['z', 'x', 'y'], ['y', 'x', 'z'], ['x', 'z', 'y'], ['y', 'z', 'x'], ['x', 'y',
'z'], ['z', 'y', 'x']]
>>> combination(4, 2)
6
>>> combination('python', 2)   # 文字列 "python" から2文字選ぶ
[['p', 'y'], ['p', 't'], ['p', 'h'], ['p', 'o'], ['p', 'n'], ['y', 't'], ['y', '
h'], ['y', 'o'], ['y', 'n'], ['t', 'h'], ['t', 'o'], ['t', 'n'], ['h', 'o'], ['h
', 'n'], ['o', 'n']]

カタラン数を少し。

>>> catalan(20)
6564120420L
>>> for i in range(1, 10):       # 1 から 9 までのカタラン数を表示 
...     print i, catalan(i)
...
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862

Partition

次に自然数 N に対して分割を与えます。

>>> partition(5)
(5)
(4,1)
(3,2)
(3,1,1)
(2,2,1)
(2,1,1,1)
(1,1,1,1,1)
>>> p = partition(10)
>>> p.size()      # 10 の分割はどれだけあるのか
42
>>> p.take(5)     # 10 の分割のうち、最初の 5 個を表示
(10)
(9,1)
(8,2)
(8,1,1)
(7,3)
>>> p.drop(37)    # 最後の 5 個を表示(42 - 37 = 5)
(2,2,2,2,1,1)
(2,2,2,1,1,1,1)
(2,2,1,1,1,1,1,1)
(2,1,1,1,1,1,1,1,1)
(1,1,1,1,1,1,1,1,1,1)
>>> p.last(5)     # drop(37) と同じ
(2,2,2,2,1,1)
(2,2,2,1,1,1,1)
(2,2,1,1,1,1,1,1)
(2,1,1,1,1,1,1,1,1)
(1,1,1,1,1,1,1,1,1,1)

Young

次がメインのヤング図形です。

>>> y = young(4)
>>> y
(4)
1 2 3 4

(3,1)
1 2 3
4

1 2 4
3

1 3 4
2

(2,2)
1 2
3 4

1 3
2 4

(2,1,1)
1 2
3
4

1 3
2
4

1 4
2
3

(1,1,1,1)
1
2
3
4

>>> y.report()      # 各分割に対して、どれだけ標準盤があるか
partition             number  square
----------------------------------------
(4)                        1       1
(3,1)                      3       9
(2,2)                      2       4
(2,1,1)                    3       9
(1,1,1,1)                  1       1
----------------------------------------
total                     10      24

>>> factorial(4)    # チェック
24

>>> young(3,1,1)    # 分割が (3,1,1) の標準盤
(3, 1, 1)
1 2 3
4
5

1 2 4
3
5

1 2 5
3
4

1 3 4
2
5

1 3 5
2
4

1 4 5
2
3

>>> y = young(6)
>>> y.size()       # 6 の分割を元にした標準盤がどれだけあるか
76
>>> y.take(4)      # 6 を元にした標準盤から4個を表示
1 2 3
4 5 6

1 2 4
3 5 6

1 2 5
3 4 6

1 3 4
2 5 6

注意点

young の take/drop/last は partition の take/drop/last とは異なり、 表示順序がきれいにソートされていません。

サンプル

>>> y = young(4)
>>> y.take(6)
1
2
3
4

1 2 3
4

1 2 4
3

1 3 4
2

1 2 3 4

1 2
3 4

ただし、これは将来的にはかわる可能性があります。

MEMO

Young について書き残したことなど

GOOD

  • ファイルサイズが小さい
  • 対象をかなり絞っているので、波長が合えば楽しめる
  • Python が動くプラットフォームなら、どこでも実行できる
  • itertools など Python2.3 で追加された新機能をいち早く体験できる
  • フリーソフトウェア

BAD

  • 計算が遅い (young(100) などとすると、、、)
  • ツボにはまらないと使い道がない
  • まだ Python 2.3 が正式にはリリースされていない

今後の方向

しばらくは分割数の方をメインにライブラリを充実させていく予定です。