# Young

# Summary

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

# INSTALL

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

> [Young project page]

CVS を使って最新のソースコードを入手するには次のようにします。

    $ cvs -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/young login
    Logging in to :pserver:anonymous@cvs.sourceforge.jp:2401/cvsroot/young
    CVS password:<ENTER>      # パスワードを聞かれますが、何も入力せずに <ENTER> を入力
    $ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/young co young

CVS のレポジトリをウェブから閲覧することも出来ます。
  http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/young/

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

## binary

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

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

## source

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

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

# Document

epydoc で作成されたAPIドキュメント(英語風?)があります。

> API

# 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)    # 4個から2個を選ぶ組合せの数
    6
    >>> combination('python', 2)   # 文字列 "python" から２文字選ぶ
    [['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 盤の up/down など
    >>> y = young(2,1)        # 最初に標準盤を与える
    >>> y.seq_of_partition    # チェック
    [(2, 1)]
    >>> y.up()                # up
    >>> y.seq_of_partition
    [(3,1), (2,2), (2,1,1)]
    >>> for i in range(3):
    ...     y.up()
    ...     y.seq_of_partition
    ...
    [(4,1), (3,2), (3,1,1), (2,2,1), (2,1,1,1)]
    [(5,1), (4,2), (4,1,1), (3,3), (3,2,1), (3,1,1,1), (2,2,2), (2,2,1,1), (2,1,1,1, 1)]
    [(6,1), (5,2), (5,1,1), (4,3), (4,2,1), (4,1,1,1), (3,3,1), (3,2,2), (3,2,1,1),
    (3,1,1,1,1), (2,2,2,1), (2,2,1,1,1), (2,1,1,1,1,1)]

    >>> y = young(2,1,1)       # 最初に標準盤を与える
    >>> y.seq_of_partition     # チェック
    [(2, 1, 1)]
    >>> for i in range(4):
    ...     y.down()
    ...     y.seq_of_partition
    ...
    [(2,1), (1,1,1)]
    [(2), (1,1)]
    [(1)]
    [()]
    >>>

## 注意点

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 について書き残したことなど

## Young の特徴

### GOOD

- 一部の数学ソフトにしか実装されていないような計算を手軽に出来てしまう。
- 対象をかなり絞っているので、ファイルサイズが小さい(light weight)
- スクリプト言語で書かれているので、インタープリターで直接実験できる。(当然、コンパイルの必要もない)
- Python が動くプラットフォームなら、どこでも実行できる
- itertools など Python2.3 で追加された新機能をいち早く体験できる
- フリーソフトウェア(Mathematica/Maple のような商用ソフトではない)

### BAD

- 計算が遅い (young(100) などとすると、、、)
- 手でやっていることをそのままコンピューターにやらせているので、計算量が多く、 アルゴリズムなどにかなり改善の余地がある。
- ツボにはまらないと使い道がない

## 分割はどのくらいあるのか

50 の分割(partition(50).size()) は 204226, 100 の分割は 190569292 あります。 自分がこのモジュールでテストした範囲では、partition(50) くらいまでは 正しく(時間内に)計算出来ています。

また、分割の近似値を与えるものとして、Hardy-Ramanujan(-Rademacher) による公式も知られています。

## jeu de taquin

Young 図形の本を読んでいると、たまに "jeu de taquin" という言葉を目にすることがあります。 初めて目にすると一体どんなものなのか想像もつきませんが、taquin は 数字並べゲーム(のフランス名)のことです。 Python で書かれた taquin のスクリプトを見つけたので、興味のある方は一度遊んでみてください。

young/samples/taquin/ 以下のディレクトリにスクリプトはあります。
  http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/young/young/samples/taquin/taquin.py

## 今後の方向

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

# Bibligraphy

下に挙げるもの以外にもヤング図形や分割数に関する本は多数あります。

[1] | 寺田至, ヤング図形のはなし, 日本評論社, 2002.

[2] | 堀田良之, 加群十話, 朝倉書店, 1988.

# Link

Python Language Website
  http://www.python.org/
Young Project Page
  http://sourceforge.jp/projects/young/
Partition(mathworld.wolfram.com)
  http://mathworld.wolfram.com/Partition.html
Partition Function P(mathworld.wolfram.com)
  http://mathworld.wolfram.com/PartitionFunctionP.html
Young Tableaux(mathworld.wolfram.com)

  http://mathworld.wolfram.com/YoungTableau.html

  mathworld ではヤング図形が上で示しているものとは上下逆に並んでいます。 堀田良之さんによると、大陸(フランス、ドイツなど)では mathworld のように 上向きに並べる習慣があるそうです。

Alfred Young(ヤング図形の創始者)
  http://www-gap.dcs.st-and.ac.uk/~history/Mathematicians/Young_Alfred.html
epydoc
  epydoc API ドキュメントの作成に使っています。

Contact: | <etale @ users.sourceforge.jp>
Date: | $Date: 2003/08/15 12:53:12 $