Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

 | 

2011-10-15

[]『思想の中の数学的構造』の「生成の概念」をPythonプログラミングしてみる 00:58

中国思想の場合

老子の場合

 本書はまず『老子』の第42章「道は一を生じ、一は二を生じ、二は三を生じ、三は万物を生ず」という言葉を引き、「仮に自然数をつきづきと作り出すプロセスを述べているのだ」と考えている。この解釈が正しいかどうかはともかくとして、そのようなものとして、「道はゼロ、万物は4以下のすべての自然数」だと考える。すると、次のように翻訳することができる、としている。

  1. N→0
  2. N→N+1

 これを愚直に考えるならば、次のようにプログラムはできる。

def number_factory(x):
    x = 0
    while True:
        print x
        x = x + 1

 こうすることによって、無限に数は表示されていく。たた、「生じる」という言葉に少しこだわってみるのならば、次のように考えることも可能だ。

  1. 各Numberは自分自身のvalueを持つ。
  2. 各Numberは自分自身に1を加えたValueを持つオブジェクトを生み出す機能を持つ。

 例えば、自分で自分自身を吐き出すClassというのを考えてみる。

class myself:
    def __init__(self,x):
        self.value = x + 1

    def born(self):
        return myself(self.value)

 Pythonの場合、"class"や"def"で行われた定義は、そのまま自分の関数の内部でも使うことが可能になる。従って

>>> one = myself(0)
>>> one.value
1
>>> two = one.born()
>>> two.value
2
>>> three = two.born()
>>> three.value
3

 といったようになる。これだと、老子の言葉のようにどんどん生成していく。

 もう少しこだわってみる。例えば、このクラスの構造は、次のようにアクセスが可能である。

0           1          2          3          4          5          6  
0.born() -> .born() -> .born() -> .born() -> .born() -> .born() -> ...

 実際に、pythonだと、次のようにアクセスすることが可能だ。

>>> one.born().born().value
3

 言い方は難しいが、

  • two = one.born()
  • three = two.born()
  • three = one.born().born() # two を one.born()で置き換えた場合

 といったように考えることができる。

八卦の構造

 八卦の構造はよく言われているとおり、二進法の考え方に非常に近い、と言われている。事実、ライプニッツは易を見て非常に驚いた、と解説がされている。本書に紹介されている『易経』の話を「易に対極あり。これ、両義を生ず。両義、四象を生じ、四象八卦を生ず」と述べている。それをかいつまんでいうなら、「1が2を生じ、2が4を生じ、4が8を生じる、としている。従って

  • N → 0
  • N → N + N

 と書き記すことができる。

 しかし、八卦は次のように書き記すことが可能である。

f:id:nisemono_san:20111014233751p:image

 wikipedia八卦のページから転載した。この図を見ると、それぞれ二つの枝分かれをしていて、それぞれ別物になっている。また面白いことに、桁数によって、その呼び名が変わっている。

 さて、細かい話は置いておき、八卦と数が1対1で対応していると仮定するとして、それぞれの数字を取り出すためには、どのように考えるべきだろうか。

 そのままの構造を残すとするならば……

class myself:
    def __init__(self,z = False,y = 1,x = 0):
        self.deep = y
        self.value = x + y if z else x
    def born(self,z):
        return myself(z,self.deep * 2,self.value)

 となる(と思う)。このようにすると、以下のように記述ができる。

>>> myself(False).value
0
>>> myself(False).born(True).value
2
>>> myself(False).born(True).born(True).value
6
>>> myself(True).born(True).born(True).value
7

 これは、二進法でいうならば"0"、"10"、"110"、"111"に対応していると考えることが可能になる。

MaryladaMarylada2011/10/28 07:26You get a lot of respect from me for witring these helpful articles.

jnvdhwnennjnvdhwnenn2011/10/28 23:18Et1L4A <a href="http://kjoybwijdfxu.com/">kjoybwijdfxu</a>

ebdkkihebdkkih2011/11/04 03:31IYnmrI <a href="http://npdjpykeeebx.com/">npdjpykeeebx</a>

sqafhzsfsqafhzsf2011/11/06 04:30NHK3bf , [url=http://qrfclwmgxlqb.com/]qrfclwmgxlqb[/url], [link=http://cqqhlmukvvsm.com/]cqqhlmukvvsm[/link], http://ambjqwgsanrp.com/

 |