読者です 読者をやめる 読者になる 読者になる

kkana's blog

新米コーダーの忘れそうなことメモ

読書メモ:プログラマの数学(5)

順列・組み合わせ

数えることは整数との対応づけ

  • 数えることは 数えたいものを整数に対応づけすること
  • 数えるときはもれ・ダブりに注意する
  • 数えるルールをつくるために、数えたいものがどんな構造をしているか・どんな性質を持っているか理解する。

数え上げの法則

法則自体は丸暗記するひつようはなくて、各法則がどのようにして「もれなく」「だぶりなく」を実現しているかに注目するのが大事。

植木算

植木算

  • 0のことを忘れない。
  • 数が小さいときは数えても確かめられるが、大事なのは一般的なルールとするとどうなるか、を考えること。
  • k個目はk-1

和の法則

  • 2つの集合にわかれているものを数えるときに使える
  • 和の法則が成り立つのは、集合の要素にダブりがない場合のみ
  • 素数と要素数を合わせてから、ダブった要素数を引く
  • 包含と排除の原理

積の法則

  • 「それぞれに対して」というフレーズがあるときは掛け算すると数えたい数が求まることが多い

置換

  • n個のものを順序を考えて並べることを置換という
  • たとえば・・3枚のカードの並べ方は1枚めの選び方は3通り、2枚めの選び方は1枚め以外のカード2枚から選ぶので、1枚めの選び方ぞれぞれに対して2通り、3枚めは残り1枚を1枚めと二枚めの選び方ぞれぞれに対して1通り・・なので321
  • 1こづつ減っていく掛け算を階乗という
  • 表記は n!
  • 0の階乗は1と定義されている(最初?だったけれど、1章ででてきた0の用途がこれ)

順列

  • たとえば・・・5枚のカードから3枚を選んで順番を考えて並べるとき、1枚めの選び方は5通り、そのそれぞれに対して2枚めの選び方は4通り、そのそれぞれに対して3枚めの選び方は3通りある。
  • 一般化するとn枚のカードからk枚を選んで並べるとき、k枚目の選び方はk-1までの選び方ぞれぞれに対してn-k+1通りある。→(n-0),(n-1),(n-2)・・(n-(k-1))までを全て掛け算している
  • 5枚から0枚選ぶ順列の総数(どうやって表記したらいいのかわからない・・5P0というやつ)は1と定義されている

樹形図

「3枚のカードから3枚を並べる順列」と、「3種類のカードから重複を許して3枚を並べる順列」は樹形図を書くと違いが一目瞭然。 樹形図は数えるものの性質を見抜く道具として使える。

組み合わせ

順序を考えずに選び出す

  • 数え方 順列と同様に「順序を考えて」数え、そのあとに重複してしまった分(重複度)を割り算する。
  • 重複度は順序を考えて重複してる分なので、置換の総数のこと

置換と順列と組み合わせの関係の図がめちゃわかりやすい
「3枚の置換」×「5枚から3枚を選ぶ組み合わせ」= 「5枚から3枚を選ぶ順列」

プログラマの数学

プログラマの数学

読書メモ:プログラマの数学(4)

数学的帰納法

ある主張が成り立つことを0以上のすべての整数について証明する方法。
数学的帰納法は2つのステップで行う

  1. P(0)が成り立つ ことを証明する(基底)
  2. 0以上のどんな整数kを選んでも、P(k)が成り立つならばP(k+1)も成り立つことを証明する(帰納

ドミノだおしに例えると

  1. 最初のドミノが倒れることを保証する
  2. k番目のドミノが倒れたならばk+1番目のドミノも倒れることを保証する

プログラムで書くと

prove(3);
function prove(n){
    console.log(`いまからP(${n})が成り立つことを証明します`);
    let k = 0;
    console.log(`ステップ1により、P(${n})が成り立ちます`);
    while(k < n){
        console.log(`ステップ2によりP(${n})が成り立つならP(${n+1})も成り立つと言えます`);
        console.log(`従って、P(${n+1})が成り立つといえます`);
        k++;
    }
    console.log(`証明終わり`);
}

印象的だったのは、著者が昔、数学的帰納法がわからなかったというエピソードのところで
「p(k)はいまから証明しようとしている式なのに、それを仮定してしまったら証明にならないはずだ」←そうだった、わたしもそう思ったことある、わかる!
「いま思えばproveの引数n(目標にしている数)とproveのローカル変数kを混同してしたのですね」←ほんとだ〜〜!
という感じで、10年越しくらいにもやっとしていたことがわかってすっきりした〜 プログラムがちょっとでもかけるようになってよかったなぁ

ループ不変条件

ループを構成するときにはループの各回で成り立っている論理式をみつけることが重要! この論理式のことを「ループ不変条件」という。 ループを作るときにはこのループの不変条件はなにか?を考えて作ると誤りが少なくなる

プログラマの数学

プログラマの数学

読書メモ:プログラマの数学(3)

剰余

剰余は周期性をみつける道具

  • 剰余を使って考えると周期性をみつけることができる。
  • 周期性を見つけると、大きな数の問題を扱いやすくなる。(一億日後は何曜日か?とか)
  • 10の100乗みたいに解く数がとても大きくなっても、同じように位をあげながらあまりを書き出していくと周期性を見つけることができる。
  • 「物事を詳しく調べよう」というときに、「こまかいところまで正確に把握しよう」ではなく、「的確な分類」の方が役に立つときもある。

周期性の見抜き方

  • あんまりにも大きな数を調べたい時・・・今調べる必要があるのはどの位の数なのか?を考える。
  • パリティチェックだとたくさんの並べ方があるけれど、奇数と偶数の2グループに分けて考える。(最後の1ビットがどちらに所属するかを示している。)

プログラマの数学

プログラマの数学

読書メモ:プログラマの数学(2)

理論

なぜ理論が必要なのか

  • 自然言語のあいまいな部分をなくす。理論式で仕様書を表現しようとするとあいまいなところを見つけることができる。
  • シンプルで理解しやすい式に変換することができる

理論の言葉

命題・真偽

  • 命題:正しいか正しくないかを判断できる式
  • 真:命題が正しいとき「真である(true)」という
  • 偽:命題が正しくないとき「偽である(false)」という

もれ・だぶり

  • もれがないこと(網羅的であること)→ そのルールがどんな場合にも適応できる
  • ダブりがないこと(排他的であること) → そのルールに矛盾がない
  • もれ・だぶりがないことは数直線を書くとわかりやすい 

withdom.jukendou.jp

  • 網羅的で排他的な分割をすると大きな問題を解きやすく分解することができるようになる。
  • 問題の分割はプログラムの中でいうとif文の部分。一つ一つは単純でも組み合わせると複雑になりバグが生まれやすい。if文を書くときは「網羅的で排他的である」のを意識する必要が有る。

命題を組み合わせて新しい命題を作る

  • 否定:「〜ではない」という命題を作る演算。
  • 二重否定は元に戻る
  • 論理積:「AかつB」という命題を作る演算
  • 理論和:「AまたはB」
  • 排他的論理和:「AまたはB(でも両方ではない)」
  • 等値:「AとBは等しい」
  • 含意:「AならばB」

論理包含 - Wikipedia

ド・モルガンの法則

ド・モルガンの法則 - Wikipedia

  • 理論式の相対性:理論式の中のtrueとfalse、Aと¬Aと、またはとかつを交換すると論理式全体を否定した式ができる。

カルノー

複雑な理論式を整理するための図

カルノー図 - Wikipedia

  1. 命題の取り得るすべての真偽値の組み合わせに対応した図を書く
  2. チェックをつける
  3. 隣接するチェックマークを囲うグループをつくる(できるだけ大きく・重なっていてもOK
  4. 作ったグループをあわらす式をつくる

未定義

  • true/falseのどちらも得られないとき undefined(未定義)
  • 3値論理での論理積(条件付き論理積)→ &&
  • 3値論理での論理和(条件付き論理和)→ ||
  • 3値論理での否定→ !

読書メモ:プログラマの数学(1)

数え方と0の役割

数が大きくなってくると扱うのがむづかしいのでいろいろ数え方が生まれた

大きくなってきたら 小さな「まとまり」に分けて解く

位取り記数法(くらいどりきすうほう)

位取り記数法 - Wikipedia

2進法・16進法など

  • 普段使っているのは10進法(10で位が上がる)
  • 2進法はコンピュータで使われる(桁数は多くなるが数字の種類は少ない・コンピュータでは10進数より扱いやすい)
  • コンピュータを使って計算するとき10進法を2進法に変換し、2進法を使って計算して10進法にしている
  • 記数法ではない数え方もある(ローマ数字)

指数法則

指数法則

10の0乗は1の考え方

10の0乗→10を0回かけた数と考えずに、10の3乗・10の2乗・10の1乗は・・と考えていくときルールがシンプルになるには10の0条がなんであれば妥当か と考える

0の役割

  • 場所の確保(100 1の位には何もない)
  • パターンを作ってルールをシンプルにする

プログラマの数学

プログラマの数学

letとconstを覚えた

最近N予備校を受け始めたんですが、javascriptの入門編ではすでにES2015で学ぶのが前提のカリキュラムになってるんですね(当たり前か・・)

letとconstと 今まで使っていたvarの違い

有効範囲が違う

letとconstはif forなどの{}のブロックの中で有効になる

'use strict';
if (true) {
  let a = 1;
}
console.log(a);//a is not defined
for (let i = 0; i < 10; i++) {
  console.log(i); // => 0, 1, 2, ... 9
}
console.log(i);//i is not defined

巻き上げがない

var のときは

'use strict';
function aaa() {
  console.log(hoge); //undefined
  var hoge = 1;
}
aaa();

「var foo」の部分が関数の先頭に巻き上げられていたのでエラーにならないが

'use strict';
function aaa() {
  console.log(hoge); //エラー
  let hoge = 1;
}
aaa();

letやconstだと巻き上げがないのでエラーになる。

letとconstの違い

let → 変化する変数

再宣言 不可

'use strict';
let hoge = 1;
let hoge = 2;//Identifier 'hoge' has already been declared

再代入 可

'use strict';
let hoge = 1;
hoge = 2;

const → 変化しない変数(定数)

再宣言 不可

'use strict';
const hoge = 1;
const hoge = 2;//Identifier 'hoge' has already been declared

再代入 不可

'use strict';
const hoge = 1;
hoge = 2;//Identifier 'hoge' has already been declared

オブジェクトや配列の中身の編集はできる

'use strict';
const obj = {a : 1};
obj.a = 2;
obj.b = 3;
console.log(obj);//Object {a: 2, b: 3}

the nature of code を読み終えて

1年と半年かかった「the nature of code」の最後の課題が終わったところで、(正確には終わってないんですが・・最終課題の生態系プロジェクトがまだノータッチ)、
いままで書いたブログ記事へのリンク、課題を作って知って楽しかったこと・さっぱりわからなかったことなどまとめておこうと思います。

英語版はこちら

The Nature of Code

で読めます。

日本語版はこれ

Nature of Code -Processingではじめる自然現象のシミュレーション-

Nature of Code -Processingではじめる自然現象のシミュレーション-

私はどちらも読みつつやりました。

はぁ楽しい本だった! すごくすごく! 帯に「一番簡単な世界の作り方」と書いてあるんですが、言いえて妙。
canvas(sketch)の中で自分の書いたルールが、いきいきと、動く!

そしてシフマン先生が大好きになりました。
↓シフマン先生(この動画の最初で拾い上げているのがthe nature of codeです)

次はcoding rainbowやろうかなぁ。 ・・今見たらcoding[Undefined]になってる!商標権の問題だそうな。笑ってしまった

読んでいた時の自分なりのルール

  • 本を読んで、そのあとprocessingのサンプルコードを読んで、課題はjavascriptで書く、p5.jsは使わない。

これは単に「書いたことがあるのがjavascriptしかないから」という理由なので特に大した意味はない縛りだったのですが、 おかげでprocessingは描画に特化した言語なんだと気づいたり・processingにある機能を使いたいなぁ〜と思ったら自分で書くしかなく、その結果ES2015を知ったりするきっかけになったりして振り返ると結構よかったかも。

  • わからなかったらやめる・脱線する

「高校生や大学生はお休み中にさくっとやってしまってもいいですね」的な紹介をどこかでされていたため、さくっとできるかと思ったら、 全然そんなことはなく・・・。特に序盤よくつまずき、もう軽い気持ちでやることにしました。

課題のリンクとメモ

1~4章をやっていた頃はブログを書いてなかったので課題のリンクなしです。

無生物編

物体が動くのをシュミレートできるようになる

Chapter 0 はじめに

  • アニメーションはパラパラ漫画みたいにちょっと動かして・消してを繰り返すと作れる
  • 「ちょっと動かして」のルールをどう定義するかが大事
  • random()に頼ることは有機的なデザインの解決にはならない。
  • 擬似ランダムに偏りを持たせる方法
    • 格率を高くしたい数値を多めに用意してそこから選ぶ
    • 最初に選択肢を決めるランダム値の範囲を偏りのある状態で定義しておく
    • ランダム値を2つ使う(1つ目はただのランダム値・二つ目は1つ目を使うか破棄するかの判別用)
  • 平均値付近に多く分布させたい時はガウス分布が使える
  • より自然なランダム値を生成するパーリンノイズというものがある

Chapter 1 ベクトル

Chapter 2 力

  • オブジェクトに力を適用(積算・すべての力を合計)するには 質量で割って、加速度のベクトルに力を加算する。 このときの加速度は瞬間ごとなので、フレームを次に進める前に0にする必要がある
  • 物理の公式を使ってシミュレーションしたいとき
    • 力の方向をどう計算するか?
    • 力の大きさをどう計算するか? のふたつに分けて考えてコードに書き直す。
    • 扱っている対象がベクトルなのか・スカラー浮動小数点数)なのかに注意する。
  • 2章では摩擦や抵抗や重力をやってみた
  • 重力の課題でオブジェクト間の対話についてでてくる。どっちに力を計算する機能をもたせるか?で結構迷った。
  • 割り算の記号(/)を見たら0で割ることがないように注意する

Chapter 3 振動

  • radian(孤の長さ = 半径のときの角度) = 2 * PI * (度数 / 360)
  • 角度 = 角度 + 角速度
  • 三角関数をつかってベクトルの大きさや方向などを調べたりできる
  • 極座標デカルト座標の変換は結構でてくる
  • 単振動などは三角関数を使うと簡単に再現できる
  • 波は単振動をずらしてアニメーションさせると作れる
  • 波は足すことができる

Chapter 4 粒子系

Chapter 5 物理ライブラリ

・・・の途中で脱落。

あとで読む


生物編

環境に応じて動きを決められるようになる

Chapter 6 自律エージェント

複雑系のルールベースの技法を学んで、複雑な動きをつくれるようになる

  • 自律エージェント = 環境ないでどう行動するかをリーダーや全般的な計画を受けずに自分で選択すること
  • 自律エージェントの構成要素
    • 環境を認識する「限られた」能力がある
    • 環境からの情報を処理して行動を計算する
    • リーダーを持たない
  • 課題ででてくる「vehicle」は「模型は心を持ちうるか」という論文から。

模型は心を持ちうるか―人工知能・認知科学・脳生理学の焦点

模型は心を持ちうるか―人工知能・認知科学・脳生理学の焦点

Chapter 7 セル・オートマトン

Chapter 8 フラクタル


知能編

生物の進化の法則を使ってオブジェクトを進化させる

Chapter 9 遺伝と進化

Chapter 10 ニューラルネットワーク


脱線して読んだ(読むつもり)の本

形の美とは何か (NHKブックス)

形の美とは何か (NHKブックス)

自然物の美しさはフラクタルの美しさだった・・・!おまけに黄金比フラクタルの美しさ。ああフラクタル

読書メモ:形の美とは何か(5) - kkana's blog

[普及版]ジェネラティブ・アート―Processingによる実践ガイド

[普及版]ジェネラティブ・アート―Processingによる実践ガイド

  • 作者: マット・ピアソン,Matt Pearson,久保田晃弘,沖啓介
  • 出版社/メーカー: ビー・エヌ・エヌ新社
  • 発売日: 2014/11/21
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (1件) を見る
the nature of code の前に読んで、nature of code読むきっかけになった本。これはいつかメモに起こしたい

複雑系入門―知のフロンティアへの冒険

複雑系入門―知のフロンティアへの冒険

複雑系のところを読んでいて、こんなことどうやって思いつくのかなと気になって。でもまだ未読。

プログラマの数学

プログラマの数学

1章をやっているときに高校数学の記憶がきれいさっぱり消えてることに気づいてあわてて読むことにした。読み途中。

波紋と螺旋とフィボナッチ

波紋と螺旋とフィボナッチ

この本はめっちゃおもしろかった・・!
アンモナイトも、結晶の螺旋も、しましま模様も、なんでできるか解説がわかりやすく書かれててスッキリとした気持ちに。 植物の茎の先端の「中央部分の連続した拡大と周囲の相似形の構造」が黄金比の長方形そのものだ! コッホ曲線を単なる座標を再帰関数で扱う書き方からクラスを使う書き方へ変換する課題をやっていたときに、この本を思い出したりした。 あと後ろの方の自伝が胸熱。

www.google.com

私は美術館とかにいったら絵画の細部を眺めるのが好きで、 直線を描いてる部分だったらマスキングテープの剥がれる部分のちょっと絵の具が引っ張られて固まった感じとかすごく綺麗だなって見てしまうんですが、 それって8章に出てきた自己相似性のある形が好きとも言える。 このサイトはかなり高解像度の作品が収容されてるので信じられないくらい拡大できて細部が眺められる。あぁ欲が満たされる・・。