データサイエンス、機械学習、ブロックチェーンなど、数学理論に裏打ちされた技術に注目が集まっています。それに従い、エンジニアにも数学の知識がより必要になってきているのは、良く耳にするところ。そこで、高校数学を学び直せるクイズを用意!さあ、あなたは何問解ける!?
問題1.10進数と2進数の違い、分かりますか?【Pythonで学び直す高校数学】
これからのプログラミングには数学が大事――。そんなことを耳にする機会が最近増えてきました。その理由は人工知能(AI)。AIの領域では数学の知識が必須と言われています。ところが、AIを担える高スキル人材は不足しており、今後も人材不足は続いていくと予想されています。
でも、プログラマーには文系出身の人も増えています。高校で文系に進むことを選んだ人には、数学が苦手という人が多いのでは? これまでは「苦手だから」と敬遠してきた数学を将来に向けて学び直さないとならない時期に来ているのかもしれません。
だからといって、自分がどこまで分かっていて、どこから学び直さなければならないのかを探すのは簡単ではありません。そこで、この連載では高校数学のレベルに焦点を当て、自分がどれだけ数字を分かっているかどうかを判断できるようなクイズを用意しました。取り上げるのは、プログラマーにとって身に付けておきたい領域を中心に、2進数や方程式、ベクトルと行列、統計など。この連載で力試しをして、どのあたりから数学を勉強するか、見当を付けるのに役立ててください。
記事中、数学の理論や計算を解説するところがあります。それを実際に計算して確かめてみるのが、理解の早道です。本連載では、その確かめる作業をPythonを使ってやってみます。Pythonをすでに使っているという人はもちろんですが、これを機会に数理処理に強いとされるPythonを体験し、数学的な処理をするコーディングのカンどころを養うこともできるようにしました。
本連載ではPythonの環境としてAnacondaを利用します。そのインストールと使い方については、詳しく解説しているサイトがたくさんありますので、是非参考にしてみてください。
基数変換をPythonで実行
では、さっそく数学の世界を覗いてみましょう。今回のテーマは、「2進数のおさらい」です。
コンピューターの世界で使われる数である2進数は、
・0と1の2つの数字を使って表す
・並べた数字の桁は、右から順に20、21、22、23……を表す
という決まりで表す数のことです。でも、表し方を上のように書いてしまうと、ピンと来ないという人もいるかもしれません。
では、見慣れた10進数で同じように表し方を見てみましょう。決まりそのものは2進数と同じです。10進数は、
・数字には0、1、2、3、4、5、6、7、8、9の10種類を使う
・並べた数字の桁は、右から順に100、101、102、103……を表す
という決まりで表します。100は1、101は10です。だから一番右の桁を「1の位」、2番目の桁を「10の位」というわけです。
2進数の「2」や10進数の「10」のことを「基数(きすう)」または「底(てい)」といいます。コンピューターでは16進数が使われることをご存じの人もいると思います。16進数の場合、基数は16です。
もう少し、10進数を研究しておきましょう。例として、「2365」のそれぞれの桁がどうして「2」「3」「6」「5」になるかを計算して求めてみます。
10進数の各行の値
各桁の値は、「元の値を基数で繰り返し割ったときの余り」になります。まず「2365」を基数の10で割ります。すると、商が「236」で、余りは「5」になります。この余りが一番右の桁(1の位)の値になります。次に、最初の計算の商(この場合は「236」)を再び10で割って、余りを次の桁の値に。さらにその商を10で割って、余りを次の桁の値に……という計算を、商が「0」になるまで繰り返します。
【問題】10進数の26を2進数で表すと?
2進数に変換するときも、計算方法は同じです。基数である「2」で割り算をする点が違いです。では、問題です。まずは自分で考えてみてください。
「2365」から10進数の各桁を求めたときと同じ計算をしてみましょう。まず「26」を基数の「2」で割ります。すると、商が「13」、余りが「0」と求められます。この余りの「0」が一番右の20の位の値になります。次に、前の計算の商である「13」を「2」で割り、余りを求めます。これを商が「0」になるまで繰り返します。
10進数の「26」を2進数へ
これで、10進数の「26」を2進数に変換すると「11010」になることが分かりました。このように、10進数から2進数への変換は、変換後の基数である2で割り算することを繰り返す計算になります。
この計算をコンピューターにやってもらいましょう。ここでは、Anacondaのインストールにより利用できるJupyter Notebookを使ってプログラミングします。Jupyter Notebookを使ったことのない人は、まずスタートメニュー(Windows)やアプリケーションフォルダ(Mac)からJupyter Notebookを起動します。画面が開いたら右のほうにある「New」ボタンを押し、表示されたメニューから「Python3」を選びます。
Jupyter Notebookが起動したところ
画面右側にある「New」ボタンを押し、表示されたメニューから「Python3」を選ぶ
するとプログラム作成画面が開きます。「In [ ]:」という表示の右側にあるテキストボックスに、プログラムを入力していきます。入力し終えたら、ツールバーにある「Run」ボタンを押すと、プログラムを実行できます。
Jupyter Notebookのプログラム作成画面
ではここに、前述の計算をするプログラムを入力して、10進数を2進数に変換してみましょう。具体的なプログラムは以下のリストです。
※各行の先頭にある行番号は入力しません。
1: def dec2bin(target): 2: amari = [] # 余りを入れるリスト 3: 4: # 割り算の商が0 になるまで 5: while target != 0: 6: amari.append(target % 2) # 余り 7: target = target // 2 # 商 8: 9: # リストの要素を逆順にして返す 10: amari.reverse() 11: return amari
このリストでは10進数を2進数に変換する「dec2bin()」という関数を定義しています。基数変換をしているのが5~7行目です。このプログラムでは、targetという変数で、元の値を基数で割った商を判断しています。5行目の「while targe ! = 0:」は「商であるtargetがゼロになるまで、次の行からの処理を繰り返す」という意味です。
6行目で、2で割った余りを保存する処理をしています。amari.append()が、余りの計算結果を2行目で定義したamariに追加する関数です。その引数であるtarget % 2の%は、「targetを2で割った余りを求める」という演算子です。
7行目で、商を求めています。/は割り算の演算子ですが、//は商を求める演算子です。この行でtargetを新たに計算した商で書き換え、5行目に戻ります。ここでtargetがゼロになっていたら、10行目の処理に移るというわけです。
これを実行したのが下の図です。引数として26を入れた「dec2bin()」関数を書き足して実行すると、
10進数から2進数に変換する「dec2bin」
このように[1,1,0,1,0]が処理結果として表示されます。これは、26が2進数では「11010」であることを表しており、正しく処理できたことが分かります。
※この図では、上で紹介したリストからコメントや空き行を省略しています。
最後の行で実行しているdec2bin()関数の引数を変えて、10進数から2進数への変換をいろいろ試してみましょう。なお、基数変換をするだけならば、Pythonには「bin()」という関数が用意されています。PythonのシェルウィンドウもしくはAnacondaのPythonインタプリタなどで、「bin(26)」と入力すると、「'0b11010'」と表示されます。先頭の「0b」は、以下に続く数値が2進数であることを示しています。
文/仙石 誠(日経BP)
文系出身者でも分かりやすいと評判の数学【再】入門書。単に数学理論を解説するだけでなく、Pythonコードで確かめられるところが好評です。
著者:谷尻かおり(メディックエンジニアリング)
価格:2500円+税
RELATED関連記事
JOB BOARD編集部オススメ求人特集
RANKING人気記事ランキング
PC画面の数は“脳の可動域”と一緒!? 澤円が語る、視界と思考の深い関係
Ruby父 まつもとゆきひろ「出社させたがるのは、マネジャーの怠慢でしかない」
t-wadaが説く、今あえて“自分の手”でコードを書く理由「バイブコーディングは、エンジニアのためのものではない」
今のAIは限界? 日本発“第三のAI”の可能性をAI研究者・鹿子木宏明が提唱する理由
メルカリ・ハヤカワ五味が感じた生成AI推進を阻む三つの壁「個人で世界を変えようとしなくていい」
タグ