Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コンピュータと数学
Search
Shohei Yamasaki
November 07, 2015
Programming
0
1.5k
コンピュータと数学
2015/11/6 プログラマのための数学勉強会@福岡#2で発表したスライドです。
目次
* 位取り基数法
* 基数変換
* データの表現方法
* コンピュータが行う演算
Shohei Yamasaki
November 07, 2015
Tweet
Share
More Decks by Shohei Yamasaki
See All by Shohei Yamasaki
AMPで爆速WEBサイト
shoyan
0
170
ハフマン木の作成
shoyan
0
14k
PHPコーディング規約とサポートするツール
shoyan
2
3.4k
暗号技術を支える素数
shoyan
2
3k
Other Decks in Programming
See All in Programming
SpringBoot3.4の構造化ログ #kanjava
irof
2
990
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
150
定理証明プラットフォーム lapisla.net
abap34
1
1.8k
さいきょうのレイヤードアーキテクチャについて考えてみた
yahiru
3
750
技術を根付かせる / How to make technology take root
kubode
1
250
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.8k
PHPカンファレンス名古屋2025 タスク分解の試行錯誤〜レビュー負荷を下げるために〜
soichi
1
190
CI改善もDatadogとともに
taumu
0
120
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
10
3.6k
クリーンアーキテクチャから見る依存の向きの大切さ
shimabox
2
280
仕様変更に耐えるための"今の"DRY原則を考える / Rethinking the "Don't repeat yourself" for resilience to specification changes
mkmk884
0
160
Grafana Loki によるサーバログのコスト削減
mot_techtalk
1
130
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
40
2.5k
Practical Orchestrator
shlominoach
186
10k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
A Modern Web Designer's Workflow
chriscoyier
693
190k
A designer walks into a library…
pauljervisheath
205
24k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Rails Girls Zürich Keynote
gr2m
94
13k
Building Adaptive Systems
keathley
40
2.4k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Being A Developer After 40
akosma
89
590k
Music & Morning Musume
bryan
46
6.3k
How to train your dragon (web standard)
notwaldorf
91
5.8k
Transcript
コンピュータと数学 プログラマのための数学勉強会@福岡#2 2015.11.06 @shoyan
4IPIFJ:BNBTBLJ !TIPZBO • プログラマー (週末は農夫) • 2児の⽗父 •
GMOペパボ
࣍ • 位取り基数法 • 基数変換 • データの表現⽅方法
• コンピュータが⾏行行う演算
ͱ͍͍ͬͨͳΜͰ͠ΐ͏ʁ • 「ひゃくじゅう」 • 2進数の「いち、いち、ぜろ」で「6」 • 警察呼ぶ番号
ͲΕਖ਼ղͰ͢
༩͑ΒΕͨใΛͲ͏ѻ͏͔ʹΑͬ ͯղऍ͕มΘΓ·͢
ਓؒͱίϯϐϡʔλͷҧ͍
ਓؒ ⼈人間は数値や⽂文字、画像、⾳音楽などを別のもの として扱う
ίϯϐϡʔλ コンピュータは数値や⽂文字、画像、⾳音楽などを 「0」と「1」に置き換える
ਐ • 「0」と「1」しか使わない。「2」になった ら位があがる • 例例えば12は 「1110」 •
コンピュータにとって扱いやすい • 英語でバイナリ(binary)と呼ぶ
ਐ • 私たちにとって最も馴染み深い • ⼈人間の指は10本あるので10進数が使われる • ⼈人間にとって扱いやすい
ҐऔΓه๏ • 決められた種類の数字を使って、その数字を 各桁に配置して数を表す⽅方法 • 2進法 • 10進法
• 16進法
ਓؒͱίϯϐϡʔλͷڮ͠ • コンピュータは「0」と「1」しか扱えない • ⼈人間は10進法が得意(2進法?なにそれ、お いしいの?) • 変換が必要
جม
جม • 表記されている数値を別の位取り基数法に変 換すること • 2進法→10進法 • 10進法→2進法
ܻͷ࣋ͭҙຯ 10進数の「1532」という値。 1000が1つ 100が5つ 10が3つ 1が2つ これらを全部⾜足したもの。1000や100、10や1は各
桁に意味を持たせている重要な値で重みと呼ぶ
Λࣜʹ͢Δͱ (1000 × 1) + (100 × 5) + (10
× 3) + (1 × 2) = (10×10×10×1) + (10×10×5) + (10×3)+(1×2) = (10 × 1) + (10 × 5) + (10 × 3) + (10 × 2) 3 2 1 0
Λࣜʹ͢Δͱ • ͯ͢ͷܻͷॏΈ͕ʮ10ͷnʯͰද͞ΕΔ • ܻ͕܁Γ্͕Δ͝ͱʹॏΈͷେ͖͘ͳΔ
ج • ॏΈͷجຊʹͳΔΛجɺ·ͨఈʢ͍ͯʣ ͱݺͿ • 10進数なら基数は10 • 2進数なら基数は2
ਐ͔Βਐม͢Δ • mਐ๏ͷʮmʯ͕جʹͳΔ • ֤ܻͷॏΈʮmͷnʯͱͳΓɺnӈͷܻ ͔Βॱʹ0, 1, 2, 3 …
ͱͳΔ
ਐ͔Βਐม͢Δ 2進数「10100」という値を10進数に変換 (2 × 1) + (2 × 0)
+ (2 × 1) + (2 × 0) + (2 × 0) = (16×1) + (8×0) + (4×1) + (2×0) + (1×0) = 16 + 0 + 4 + 0 + 0 = 20 4 3 2 1 0
ਐ͔Βਐม • 10進数「1530」を 2進数に変換 • その前に ちょっとした⼩小話をします
ਐ͔Βਐม 「1530」を基数10で割ってみると 1530 ÷ 10 = 153 … 0
153 ÷ 10 = 15 … 3 15 ÷ 10 = 1 … 5 1 ÷ 10 = 0 … 1
ਐ͔Βਐม 基数で繰り返して割り算したときの余りが 「1530」なのです。 このことを⽇日本⼈人は昔から知っていました。
ຊޠ େݴ༿ w IUUQTKBXJLJQFEJBPSHXJLJ&%&#&# ⽇日本語では「あまり」と して呼ばれている
ਐ͔Βਐม • もとの値を2進法の基数である「2」で割り算する • その商を再び「2」で割り算する • 商が0になるまで繰り返す
ਐ͔Βਐม 10進数の「20」を2進数に変換すると 20 ÷ 2 = 10 … 0
10 ÷ 2 = 5 … 0 5 ÷ 2 = 2 … 1 2 ÷ 2 = 1 … 0 1 ÷ 2 = 0 … 1 「10101」になる
Ҏ֎ͷද͠ํ
Ҏ֎ͷจࣈͷද͠ํ • コンピュータの世界では⽂文字や写真なども 「0」と「1」で表現します
จࣈ • ⽂文字コード表を使って、その⽂文字に対応する コードを8桁(1バイト)の2進数に置き換え て表現している
"4$**ίʔυ
"4$**ίʔυ • 例例えば「A」であれば、⽂文字コードは「65」 • 基数変換して2進数にすると「01000001」
จࣈίʔυ • ASCIIコード以外に、⽂文字を2バイトで扱う、 JISコードやシフトJISコード、EUCコード、 Unicodeなどがある • ⽂文字化けは⽂文字を記録するときに使った⽂文字 コード表とそれを解釈するための⽂文字コード 表が異異なるときに起こる
จࣈίʔυ • ⽂文字コード表によって数値データに変換され た⽂文字は⾯面⽩白い使い⽅方ができる • ⽂文字コード表のAは「65」、aは「97」 • 32を⾜足すと、⼤大⽂文字→⼩小⽂文字に変換できる
৭ • コンピュータは画像データを⼩小さな点の並び として扱う • この点をピクセル(pixel)と呼び、各ピクセル の⾊色情報を数値にして画像を記録している
৭ • コンピュータ上に表⽰示される⾊色は、⾚赤と緑、 ⻘青の3⾊色の光の組み合わせでできている • ⾚赤と緑を混ぜると⻩黄⾊色、⾚赤と⻘青を混ぜると紫 になる •
⾊色を混ぜるには光の強さで調節する
৭ • 光の強さは0 〜~ 255の範囲で指定する • 0はまったく発光していない状態 •
255はいちばん強い光
৭ ৭ ͷڧ͞ ͷڧ͞ ੨ͷڧ͞ ࠇ
੨ ԫ ࢵ ਫ৭ ന
৭ • 0 〜~ 255は2進数の8桁(8ビット)で表現でき る • ⾚赤、緑、⻘青にそれぞれ8ビットずつ使って1ピ クセルの⾊色を表現する
• この⽅方式を24ビットカラーと呼ぶ
ίϯϐϡʔλʹͰ͖Δ͜ͱ
ίϯϐϡʔλʹͰ͖Δ͜ͱ ೖྗ ԋࢉ ग़ྗ ใΛड͚औͬͯɺԋࢉͯ͠ɺ݁ՌΛग़ྗ͢Δ͜ͱ ͜ͷ͔ͭ͠Ͱ͖ͳ͍
ԋࢉ コンピュータが⾏行行う演算には、その内容ごとに呼び 名が付けられている w ࢉज़ԋࢉ w γϑτԋࢉ w Ϗοτԋࢉ w
ؔԋࢉ w ཧԋࢉ
ࢉज़ԋࢉ 数値データを使って四則演算(⾜足し算、引き 算、掛け算、割り算)を⾏行行うこと
ࢉज़ԋࢉ ࢉज़ԋࢉࢠ ҙຯ ͠ࢉ Ҿ͖ࢉ ֻ͚ࢉ ׂΓࢉ
γϑτԋࢉ • シフト演算とは2進数のビットパターンを右ま たは左にずらす演算である • 掛け算、割り算と同じ結果を得ることができ る
γϑτԋࢉ コンピュータの演算では以下の2通りのシフト演 算がある • ཧγϑτʢର: ූ߸ͳ͠σʔλʣ • ࢉज़γϑτʢର: ූ߸͖σʔλʣ
γϑτԋࢉ わかりやすくするために10進数で説明します もとの数値 左に1桁移動 左に3桁移動
γϑτԋࢉ • 左に1つ移動すれば10倍される • 左に1つ移動すれば • これを2進数で⾏行行う
1 10 倍される
ཧγϑτ • 2ਐΛࠨʹSϏοτγϑτ͢Δͱɺ2 ഒ͢Δ ͜ͱʹ૬͢Δ s kccn.konan-‐‑‒u.ac.jp/information/cs/cyber03/cy3_̲shc.htm
ཧγϑτ • 2ਐΛӈʹSϏοτγϑτ͢Δͱɺ2 ഒ͢Δ ͜ͱʢ2 ͰׂΔ͜ͱʣʹ૬͢Δ s -‐‑‒s kccn.konan-‐‑‒u.ac.jp/information/cs/cyber03/cy3_̲shc.htm
ࢉज़γϑτ • 負の数でも掛け算や割り算ができる • 符号付き 2進数を左にSビット算術シフトする と、2 倍することに相当する
kccn.konan-‐‑‒u.ac.jp/information/cs/cyber03/cy3_̲shc.htm s
ࢉज़γϑτ • 符号付き2進数を右にSビット算術シフトする と、2 倍すること(2 で割ること)に相当 http://kccn.konan-‐‑‒u.ac.jp/information/cs/cyber03/cy3_̲shc.htm
-‐‑‒s s
Ϗοτԋࢉ • 2進数のビットを使った演算 • 特定の桁が1かどうかを調べたり、指定した桁 の値だけを取り出したりするときに使う
৭ͷΛऔΓग़͢
⾚赤 緑 ⻘青 ⻘青の成分が欲しい時は、右側の8ビットを1、他を 0としてAND演算を⾏行行う 11111111 11011100 00011001 00000000 00000000 11111111 AND ) 00000000 00000000 00011001
৭ͷΛऔΓग़͢ • 緑の成分を取り出したいときは、同じように 緑の成分の部分のビットを1にして AND演算 する。 • 演算結果を8ビット論論理理右シフトする
ϚεΫ • コンピュータの世界では、「マスクをかけ る」と表現することがある • マスクをかけるとは「0と1のビットの並びに 覆いを被せて、必要な箇所だけ取り出す」こ と
ؔԋࢉ • 2つの値を⽐比較してその関係が正しいか、正し くないかを調べるための演算 • ⽐比較演算とも呼ばれる
ؔԋࢉ ؔԋࢉࢠ ҙຯ ͍͠ ͘͠ͳ͍ ΑΓେ͖͍
ΑΓখ͍͞ Ҏ্ ҎԼ
ཧԋࢉ • 与えられた命題が正しいか正しくないかを判 断する演算 • 論論理理演算が取り扱うデータは真(True)、偽 (False)のみ •
命題とは「正しい」か「正しくない」かを判 断できる⽂文のこと
ཧੵ "/%ԋࢉ 「変数aの値が0以上である」かつ「変数aの値 が100以下」である というように関係演算を複数組み合わせて使う
ཧ 03ԋࢉ 「変数aの値がʼ’Aʼ’と等しい」または「変数aの値 がʼ’aʼ’と等しい」である どちらかの条件がTrueであればTrue
ຊͷհ • ⽂文系プログラマーの数学知識識 基礎の基礎 • http://www.amazon.co.jp/dp/ 4774139947
ຊͷհʢʣ • The Zombie Book • 電⼦子書籍を配布しています(私が執筆しまし た。数学とは関係ないです)。 •
http://balloonbros.cc/zombie-book/
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠