IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

スーパーエンジニアの独り言

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第93回 数学ガール (藤江一博) 2019年12月

「ナンバー(数字)」と来れば「数学」となります。
前回「ナンバーガール」の次は「数学ガール」です。

正直、数学は苦手ですがどうしても避けられないので、今回は無理にでも行ってみたいと思います。
プログラマに国語と英語と数学は必須科目です。

 
 
 

『数学ガール』:

「数学ガール」は「結城浩」氏が執筆されている書籍です。

様々な数学の理論を解き明かす内容としてシリーズ化されて何冊も刊行されています。
登場人物である「ユーリ(中学生)」、「テトラちゃん」、「ミルカちゃん」と「僕(高校生)」が数学トークを繰り広げるという会話仕立てのストーリーになっています。
難解な理論を分かりやすく解説してくれている書籍です。

「数学ガール」シリーズとして刊行されている本では、以前に「数学ガール ポアンカレ予想」を買い求めていました。
かなり以前に「グリゴリー・ヤコヴレヴィチ・ペレルマン」"Grigori Yakovlevich Perelman" という変わった人のドキュメンタリー番組をテレビで観たのです。
「ペレルマン」を切っ掛けに「ポアンカレ予想」に興味が沸いたため「数学ガール ポアンカレ予想」を購入したのですが、分厚い本を未だに開いておりません。

ただページを開くだけの行為に過ぎないのですが、やっぱりちょっとどころか相当敷居高い感じを払拭できません。

そこで「数学苦手なんです」(筆者)という方々向けに「数学ガールの秘密ノート」シリーズもあります。

迷うことなく「数学ガールの秘密ノート」から拝読することに決めました。
「数学ガールの秘密ノート」シリーズの中から、すぐに必要となるであろう「やさしい統計」から買いました。
なにせ「統計が最強の学問である」とおっしゃる方(ベストセラー本)もあるくらいです。

ですが購入しただけで安心してしまったのでしょうか、本棚に飾ったままになっております。
しっかり「統計」勉強しなければという強い思いを、忘れたら何度も思い出して本を開くようにするつもりです。

それすらも「忘却の空」になりそうで怖いです。
(過去コラム「第35回 忘却の空」を併せてご覧くださいませ。)

 
 
 

『プログラマの数学』:

「結城浩」氏は、コンピュータ関連など数多くの書籍を執筆されています。
「数学ガール」シリーズ以外での数学関連の書籍として「プログラマの数学」があります。

二〇〇五年に初版が刊行されて以来、ロングセラーになっており、第二版が昨年の二〇一八年に上梓されています。

昨今の「ディープラーニング」等の「AI」ブームが加熱していますが、その基礎理論は「統計」です。
「統計」つまりは「数学」の素養ないと全く歯が立ちません。
「AI」が必要なのだと息巻いても、「数学」なくしては「プログラミング」に辿り着くこともなく、門前払いとなります。

それ以前に「プログラミング」は「数学」です。
プログラムの「アルゴリズム」は「数学」です。
「コンピュータサイエンス」は「数学」であるからです。

「数学」は絶対に必要である、と帰結します。

 
 
 

『再帰』:

「再帰」"Recursion" というのは「自分で自分を定義する」という意味です。

なんだか哲学的な雰囲気がそこはかとなく漂いますが、紛れもなく数学の用語です。

再帰とは、
「記述しているものそれ自身の参照が、その記述中にあらわれること」
です。

この文言だけでは余計に分からないのですが、百聞は一見に如かずで再帰で記述されたものをみれば分かります。
例えば、企業や組織名称に再帰的単語を見ることがあります。

「VISA」(ビザ)という決済サービスを提供するカード会社があります。
"VISA" は、 "Visa International Service Association" という名称の略称です。

「GNU」(グヌー)という過激な思想家「リチャード・ストールマン」"Richard Matthew Stallman; aka RMS" を始祖とするするフリーソフトウェアを提供する団体があります。
"GNU" は、 "GNU is Not Unix" という名称の略称です。

つまり、「略称」を説明すべき記述である「正式名称」の中に再び「略称」が含まれているのです。
これが「再帰」という構造です。
意味を探ろうとすると無限に堂々巡りを繰り返すということになります。

プログラミングでは、本来再帰的構造を持つアルゴリズムを記述するときに「再帰的アルゴリズム」"Recursive algorithms" が有効となります。
階乗計算やフィボナッチ数列などの解を求めるのが代表例です。
ですから「再帰」はプログラミングで多用されるのですが、「再帰」を関数でつかう技法が「再帰呼出し」"Recursive call" です。

前述の書籍「プログラマの数学」では、この「再帰」の例題として「ハノイの塔」"Tower of Hanoi" が紹介されています。
「プログラマの数学」を開いて最初に目が付いたのが、この「ハノイの塔」でした。
「ハノイ」"Hanoi" と聴けば「ハノイ・ロックス」"HANOI ROCKS" と反応する筆者であります。
いつもの様に「ハノイ」"Hanoi" という語感(音)だけに惹かれて、「ハノイの塔」"Tower of Hanoi" の章から読み始めることにしました。

 
 
 

『ハノイの塔』:

「インドの山奥で修行をして、ダイバダッタの魂宿し」(「愛の戦士レインボーマン」の主題歌)ではなくて、
「インドのガンジス河の畔のヴァラナシに、世界の中心を表すという巨大な寺院がある。」という「ハノイの塔の伝説」があります。

これは「エドゥアール・リュカ」"Édouard Lucas" というフランス人の著名な数学者が考えたプロローグ(作り話)で、彼が一八八三年に発売したゲーム「ハノイの塔」"Tower of Hanoi, Lucas' Tower" のパッケージの箱に書かれた創作(設定)です。

「ハノイの塔」"Tower of Hanoi" は、パズルゲームです。
ゲームのルールは、以下になります。

1. 3本の杭と、中央に穴の開いた大きさの異なる複数の円盤から構成される。
2. 最初はすべての円盤が左端の杭に小さいものが上になるように順に積み重ねられている。
3. 円盤を一回に一枚ずつどれかの杭に移動させることができるが、小さな円盤の上に大きな円盤を乗せることはできない。
(Wikipedia より引用)

上記のルールに従ってすべての円盤を右端の杭に移動させられれば完成です。
ルールが分かりずらければですが、「ハノイの塔」は木製の知育玩具として販売していますのでこの数学パズルゲームの写真などを見ていただくと何をするのかがすぐに理解できます。

上記のルールに従って最小「何手」で実施できるのか、というのがポイントになります。

まずは、少ない枚数の円盤(小さいハノイ)で考えるところから始めます。
枚数が多いと混乱するだけで解を見いだせないからです。
少ない枚数で試して、原理を解き明かす(パターンを見つける)のが狙いです。

まず、一枚(1ハノイ)から始めてみますが、これは考えることもなく瞬間で「 1手 」が最小です。
では、二枚(2ハノイ)では、ちょっと考えれば「 3手 」が最小と分かります。
次が、三枚(3ハノイ)です。

(中略。解法の手順は図解されている「プログラマの数学」にてご確認ください。)

試行錯誤してやっとパターンが見つかりました。
「 3ハノイ 」では、「 7手 」が最小です。

パターンは、「 2ハノイ 」動かして「一番下の円盤を移動」その後に「2ハノイ」で移動が完成します。
この時の最小手数パターンを振り返ると、「 2ハノイ 」を2回繰り返していることに気が付きます。

「 2ハノイ 」は、「3手」ですから、「 3 + 1 + 3 = 7手 」が最小移動回数です。

そこで先ほどの「 2ハノイ 」を顧みると「 1ハノイ 」を2回繰り返していた事にも気が付きます。
「 1ハノイ 」は、「1手」ですから、「 1 + 1 + 1 = 3手 」が最小移動回数です。

このパターンを整理します。

三枚の円盤での最小手は、一枚少ない二枚の円盤の最小手から計算して求められます。
二枚の円盤での最小手は、一枚少ない一枚の円盤の最小手から計算して求められます。
一枚の円盤での最小手は、一手です。

これらの仮定を基にすると、任意の円盤枚数を n とした場合に、n ハノイ の最小移動回数を Hanoi ( n ) と記述すると、Hanoi ( n ) を求める式は下記になります。

Hanoi ( n ) = Hanoi ( n - 1 ) x 2 + 1 

このように(円盤の枚数から)パターンを導き出した関係性を表現した式を「漸化式」(ぜんかしき)と云います。
漸化式は、再帰的な等式になりました。

では、次にこの仮定が成立するのかを検証してみます。

円盤が四枚の「 4ハノイ 」の場合で考えてみましょう。
上記のパターンを適合すると、最小手は 「 3ハノイ x 2 + 1 」となる筈です。
「 3ハノイ 」は 「 7手 」 ですから、漸化式で求めると「 7 x 2 + 1 = 15手 」となり、正解に達しました。
これだけではあまりも早計かとも思いますが( 1ハノイ 以外に「特異点」が存在しなければ)、この「漸化式」(ぜんかしき)を使えば「 何ハノイ 」でも順番に求めることで最小手が分かる筈です。

「ハノイの塔」"Tower of Hanoi" の最小手を求める漸化式の処理を関数で記載すれば、プログラミング出来る筈です。

早速、Python で記述してみます。

# Tower of Hanoi
# 
# a recurrence formula is :
# n hanoi = n - 1 hanoi x 2 + 1
def hanoi(disk):
    if disk >= 2:
        hand = hanoi(disk -1)
        print(hand)
    elif disk == 1:
        hand = 0
    else:
        return 0
    return hand * 2 + 1
print('Welcome to Hanoi !') disk = int(input('please enter number of disks: ')) hand = hanoi(disk) print(disk, 'hanoi ===>', hand, 'hands')

上記のコードを実行して「 9ハノイ 」を求めてみます。

Welcome to Hanoi !
please enter number of disks: 9
3
7
15
31
63
127
255
9 hanoi ===> 511 hands

「 9ハノイ 」は「 511 手 」と計算できました。
どうやら上手く計算できているみたいです。

関数定義の中にその関数自身が定義として利用していることから、これが「再帰呼出し」なのだと分かりました。
先ほどの「再帰」の説明を再掲するとまさに

「記述しているものそれ自身の参照が、その記述中にあらわれること」

文言そのままの意味でした。

これが「再帰」であると理解できました。

また「再帰呼出し」の技法を利用するには、「漸化式」が重要になることも分かりました。
関数定義時に必要となるからです。
関係性のパターンを見つけ出す、これがコツだと思われます。

今回は「プログラマの数学」という指南書のお蔭で導き出すことができた「漸化式」ですが、指南書ではもう少し先まで突き詰めると更にスマートになるよと記載がありました。

ここから先は、ご興味ある方にだけお任せすることにさせていただきます。

 
 
 

 
 
 

『ガール』:

今回、少しだけシリーズ化をもくろむ「XXXX ガール」ですが、「ガール」と云えば、そんな名前を冠したロックバンドがありました。

英国グラムロック・バンド「ガール」"Girl" は、イケメンが集まったバンドで女子に人気でした。
イケメン・バンドの活動期間は短くて、一九七九年に結成されて二枚のアルバムをリリースして一九八三年には解散しています。

このバンド「ガール」"Girl" には、「フィル・ルイス」"Phil Lewis" や「フィル・コリン」"Phil Collen" が在籍していたことでも良く知られています。
「フィル・ルイス」"Phil Lewis" は、後に「L.A. ガンズ」"L.A. Guns" のボーカルの座を得ています。
方や「フィル・コリン」"Phil Collen" は、後釜ギタリストとして「デフ・レパード」"Def Leppard" に参加して現在に至ります。

彼らの原点となるロックバンド「ガール」"Girl" のヒット曲に、「マイナンバー」"My Number" があります。

「ガール」と云えば、どこまで行っても「ナンバー」が付き纏ってくるみたいです。

 
 
 

『マイナンバー』:

「マイナンバー」といえば、内閣府が付けた制度の名称です。
すっと反対していた「国民総背番号制」の別称と言えましょう。

「マイナンバー」本来趣旨は、行政の手続きを簡素化することで効率化を図り、処理を透明化することで行政を監視し不正を正し、国民に潤沢なサービスを還元するためが目的です。
裏の意図(真の目的)は、国民全員に「番号を付ける」ことで、一元管理するためであるのは明白です。

例えば、取りこぼしのないように税金徴収に利用されるでしょう。
勿論、皆が同意した枠組みにしたがって納税すべきは義務です。
たった独りきりで自給自足して生きているのではなく、社会の中でサービスを施して貰って相互に助け合って生活しているのですから、そのために有意義に使っているのであれば誰しもが理解できます。

ですが、集めた血税を無駄に使いすぎているのは、誰一人納得していないでしょう。
増税ばかり続ける以前に、集めたお金(税金)は、何を優先に、如何に有効に、と正すべきがありきの話の筈です。
それが「筋」です。

無駄に使わせないために、税金を配分する予算と何を救済するために使うのかという使途をきちんと明白に分かりやすく公開すべきです。
国が国民を管理するのではなく、国民が政治を監視するのが本来の姿です。
「マイナンバー」、「消費税増税」、「カジノ(統合型リゾート開発、IR)」を筆頭に国会では愚策を連発してそれをこっそりと法案通過させて無策で実現、或いは実行しようと画策しています。
国民が無関心のままでは社会が崩壊してしまいます。
ちゃんと監視しなければなりません。

税金については色々考えがあるかもしれませんが、消費税の様に一律で巻き上げるというのは「平等」では決してありません。
日々の暮らしに困窮するような貧しい人々から無理矢理取り上げて財源にするのはおかしな話です。
国や社会や経済圏という枠組みがあって商売して利益を得ている企業やその枠組みで何等かの恩恵を独り占めにした一握りの金持ちからガッツリ取り上げて社会に還元して頂く過激な累進課税をベースとした税制に改善にすべきが、本当の「平等」です。

「超金持ち」だけがさらに「金を稼ぐ」という仕組みになっているのですから、「持っている人」が「必要としている人」に分配するのが、税金の役割でもあるはずです。
対価や利益を得ることに無頓着で、黙々と社会に貢献してくださっている多くの方々もいらっしゃるのですし、不当な扱いを受けて或いは、不遇な境遇のために、寝る暇もなく、働いても、働いても、充分な収入を得ることもできない方々も少なからずいらっしゃるのです。

政治家に襟を正して頂きたいと願うのは、夢想なのかもしれません。
官僚の方々も政治家の言いなりにならないで、庶民の味方である行政として抗って欲しいというのも無理難題なのかもしれません。

兎に角、看板だけ掲げた謳い文句だけに終わらないようにしてもらいたいです。
「マイナンバー」に関しては、「普及」という名目で「マイナポイント」を付けようと画策しています。
「マイナポイント」は「キャッシュレス」で買い物すると「ポイント還元」しますよという消費税増税で冷え込む「消費活性化策」で、これを「マイナンバー」に「ポイント付与」しますという意味不明なものです。
謳い文句からも大きく逸脱しています。一体全体何をしたいのか、最早(もはや)意味不明です。
これまたいつものように政治家に圧力を掛けるプレイヤーが増えることで利害関係が交錯し迷走しているのがよくわかります。

義賊ではないですが、「弱きを助け強きを挫く」という明確な指針(精神)の基に「名も無き多くの民」、「困っている人」を救済するための行動(政治)を貫き通すことを、ここに切望いたします。

 
 
 

『ガールシリーズ 第三弾』:

いつものように話が彼方此方に霧散してしまいました。
いつも読んでくださりお付き合い頂き感謝しています。
そこで次回予告です。

前回「ナンバーガール」。
(前回コラム、「第92回 ナンバーガール」をご参照ください。)

今回「数学ガール」。
(本稿です。いつものように未完です。)

次回「ガール」を同じく冠(タイトル)にしつつ四方山を綴るご予定にさせていただきます。
(予定であり未定です。)

年の瀬を乗り越えて皆様がより良い新年が迎えられることを、心より願っております。

 
 
 

次回をお楽しみに。

 
 
 

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes