コンテンツにスキップ

仮題 プログラミングのための中学数学

0010 イントロダクション

他の講座との関係

これは次の講座の姉妹編です.

前者は式抜きで中高数学の先, 特に何の役に立つのか, その応用をいろいろ紹介する講座です. 後者は高校数学のハイライトである微分積分をテーマに, やはり応用を先に見てもらう講座です. 具体的なプログラムを紹介しつつ, そのプログラムでいろいろな図を描いてイメージ豊かに応用の姿を眺めてもらうのが目的です.

この講座のテーマ

私の活動自体が理系のためのリベラルアーツ・総合語学です. ここでいう語学は英語のようないわゆる語学だけではなく, 自然とコミュニケーションを取るための語学としての物理, その言語学としての数学, コンピューターを使って計算するためにコンピューターとコミュニケーションを取るための語学としてのプログラミング言語も含めています.

この大方針に沿って, プログラミングと強く絡めた数学の話をします. 先に紹介したプログラミング連携講座は単に応用の現実を伝えただけで, プログラミング自身は詳しく解説していません. いろいろな理由があってプログラミングはなかなか解説が大変です. かといって何もしないわけにもいきません.

そこで, ここでは実際にプログラミングを使って簡単な計算をしつつ, 中学数学の世界を簡単に眺める講座を展開します.

全体像や応用は上記二講座でいろいろな形で解説しているので, もうここでは詳しく触れません. 算数・数学の話に集中します.

一つの壁: 変数の処理

あなたは学生時代数学が苦手だったのだと思います. そうでなければわざわざこの中学数学の復習講座を受講しようとは思わないでしょう. 中学数学の一つの壁は変数だと思います. つまり $x$ やら $y$ やらの文字です.

先程書いたように, なぜ文字や文字式が必要かは他の講座で語っているので詳しくは触れません. あえてここで改めて語るとすれば, プログラムとの連携です.

残念ながら数学とプログラムで「変数」という言葉は出てくるものの, 完全に一致する概念ではありません. しかし, 完全に一致しないだけで一部重なる部分はあります. つまりプログラムを書くためにも変数という概念が重要なのです.

これ以外にもいろいろな形で陰に陽に変数とそれに関連する概念が大事です. それは数学でもプログラミングでも同じです. 詳しくは追々語っていきます. まずは数学でもプログラミングでも, 変数の理解と応用が重要なことを改めておさえてください.

アンケート

細かい質問や要望がある場合はこちらにどうぞ.

アンケートは匿名なので気楽にコメントしてください. 直接返事してほしいことがあれば, メールやお問い合わせなど適当な手段で連絡してください. 返事は確約できませんが, 適当な手段でコンテンツに反映させていきます.

0020 大目標: 文字利用と関数の理解

復習

前回, 変数の処理という「壁」の話をしました. なぜ変数が大事かというと, 関数を理解・応用する上で大事な概念だからです.

となると, そもそもなぜ関数が大事なのかという話が出てきます. 詳しい話, 特に応用の話は前回紹介した二講座にまかせることにして, ここではまず中学数学の視点・プログラミングの視点から, 関数を簡単に紹介します.

高校数学の視点を簡単に

関数は高校数学でも大事です. 明らかに高校数学のハイライトは三角関数・指数関数・対数関数などの関数であり, それらの微分積分だからです. そしてこれらの関数は大学の数学, もっと言えば統計学のように役に立つ数学でも大事です.

もちろんここでは中学数学がメインなので, 上の話は範囲外ではあります. ただ, 大事なことではあるので, ぜひ簡単にでも頭の中に置いておいてください.

関数とは何か?

さて, 関数です. これらは中学でも一次関数・二次関数として出てきます. 他にもいろいろな形で陰に陽に出てきます. 特にプログラミングと絡めることまで考えれば, その中で中学・高校ではふつう関数とはみなさない対象が, プログラミングの中で関数として出てきます.

関数が何か, 一言で言えば次のように書けます.

  • 何かと何かを対応させること.
  • 特にある入力に対して何かを出力すること.

何かしらの対応があるなら, その時点でそれは何であっても関数です. プログラミングでも同じです.

一次関数と直線

先に数学の例を挙げましょう. 一次関数のグラフは直線です. これが何を言っているかというと, 一次関数は数を入力すると数を出力してくれます.

特にこの数と数の対応を平面上に描くと直線になります. この場合の関数は対応の様子を絵に描けます. 二次関数も同じです.

絵に描けない関数

中学・高校での関数はふつうそのグラフが絵に描けます. しかし一般的な関数, 特にプログラミングの意味での関数は必ずしも絵に描けませんし, 絵に描ける場合でも描いたからといって何かわかりやすくなるわけでもありません.

絵に描けない場合

純粋なプログラミング上の事情で言うと例えば占いの結果です. よく占いのアプリなどがあり, 例えば誕生日を入れるとその日の運勢を教えてくれます. これをこう見立てましょう.

  • 入力: 誕生日と日付
  • 出力: 運勢を説明する文章

こう思えばまさに占いは関数です. ここで入力は誕生日と日付なので数値とは思えますが, 運勢やそれを説明した文章はふつう数値とは思わないでしょう. 数学でいうグラフにはなりません.

絵に描いてもわかりやすくなるとは限らない場合

まずは占いの例をもう少し突っ込みます. 実はコンピューターの内部では, 文章も適当な意味で数値として表現します. こう思えば中学以来の数と数の対応にはできます. しかしわざわざそれを持ち出す人もいないでしょう. そんなことをしてもむしろ分かりにくくなるだけです.

もう一つ中学で出てくる「関数」から例を出します. 例えば順列・組み合わせの ${}_n P_r$ と ${}_n C_r$を考えましょう. 例えば組み合わせは $n$ 個のモノの中から $r$ 個取り出したときの組み合わせの場合の数を指します. つまり $n$ と $r$ を指定したときに一つ数が対応するわけで, $c(n,r)$ とも書けます. 実際プログラミングでは comm(n, r) のような関数が用意されていることもよくあります.

変数が二つなので, 組み合わせの関数は三次元グラフとして絵に描けます. しかし描いたところで別にわかりやすくなるわけではありません. 手で三次元グラフを描くのは大変ですし, プログラムではそれなりに簡単に描けはしますが, 実際問題何かわかるわけではありません. 高校で出てくるパスカルの三角形のような描き方をした方がまだわかります.

プログラミングだけを考えても, 中学数学へのプログラミングの応用を考えても, 関数 (のグラフ) はいつでも絵に描けるわけではなく, 描いたからといってわかりやすくなるわけでもないのです.

0030 関数を大まかに

数学の関数とは何か

一言で言えば次のようにまとまります.

  • 関数とは「ある入力に対して必ず一定の出力 (値) を返す」モノである.

まずは身の回りにある「関数」の例を紹介します.

例 1: 自動販売機

ここでは「理想的な自動販売機」だけを考えます. つまりお金を入れた上でほしい飲み物のボタンを押せば, 常にその飲み物が出てきます. この「ボタンを押せば必ずその飲み物が出てくる」様子がまさに関数の動作です.

念のため注意: 読み飛ばしてよし

もしあなたが現実と言葉の定義を大事にする人なら, 次のような状況を心配するかもしれません.

  • ある飲み物のボタンを押したときに関係ない飲み物が出てきたら?
  • ほしい飲み物が売り切れているときは?
  • 必要な量のお金を入れないといけないのでは?
  • お釣りも出てくることがあるのはどう思えばいいのか?

こういうことを考えない・考えなくていいことにするのを「理想的な自動販売機」と書きました. 数学・物理・計算機科学などではこの手の理想化はよくあります. よくわからなければ飛ばして構いません.

例 2: 工場

工場はある材料をもとにして規格通りの製品を出荷するモノです. こういうモノも関数の一種とみなせます. これも自動販売機と同じような理想化した工場を考えましょう.

普通の関数: $f(x) = x + 40$

最後にふつうの数学の関数も紹介しておきます. この関数記号とその使い方自体, かなりのハードルになっていると思います. 実際, 私も高校で本格的に関数が出てきたとき, 記号自体はいいとしてその使い方に慣れるまで 1 ヶ月以上かかったように思います. 2 年くらいずっとやっていれば慣れると思うので, そのくらい大きく構えてください.

さて, $f(x) = x + 40$ は適当な数を入れるとその数に 40 を加えて返してくれる関数です. もしあなたが事務系の仕事をしていたり, Excel でいろいろな集計をやったことがあるなら, Excel の関数でよく似たような計算をしているでしょう. これも数学の意味での関数です.

つまりもしあなたが Excel に慣れているなら, それをそのまま数学の関数に対する感覚に持ち込んでしまって構いません. 特に if 文など少し凝った関数を使ったことがあるなら, それはもう完全にプログラミングです.

最後に: 数学の関数とプログラミングの関数

実はこの二つ, 厳密には別物です. プログラミング言語によってはその違いをはっきり表現するために, 関数の他に手続きという言葉・概念を持ち出すこともあります.

簡単に定義だけ書いておきましょう.

  • (プログラミングでの) 関数: 入力に対して何かしら出力を返すこと.
  • 副作用: 値を返す以外にも何かする.
  • 手続き: 副作用を持つ関数.

これが問題になるとき, もっと言えばプログラミングに慣れてから考え直せば十分です.

数学では入力が決まれば出力は常に一通りに決まりますが, 乱数を返す関数のように, プログラミングでは出力がランダムな場合もあります.

0040 関数が欲しくなるとき

なぜ関数がほしいのか?

ここでは大人の高校という大きな括りで講座を組んでいるので, 「大人」向けに考えましょう. 前回触れたので特に Excel を例に挙げます. これなら文系・事務系の人であっても多少なりともイメージできると思うので.

一言でいえば処理をまとめたいからです. 何度も同じことを書きたくないからです.

なぜ同じことを何度も書きたくないのか?

一言で言えばミスが起きないようにするためです. Excel 本来の使い方をするとき, つまり表計算するときを考えましょう.

簡単な事務処理なら大して困りません. それこそ見積もりの項目の集計で, ある範囲の和が取りたい場合を考えれば単純に sum 関数を使えば十分です. しかし条件分岐, つまり if を使うような, ちょっと複雑な処理を書きたいとき, あの小さなセルに複雑な処理を書きたくはありません.

そして何かあって少し処理を変えないといけなくなったとき, その処理を書いたセルを全て書き換える必要があります. 漏れなく全てです. 一つだけ書き換え忘れたりしたら微妙に計算が合わなくなります. どこが問題か見つけるのは本当にやっかいです.

関数化のご利益

ここではじめから関数にしておいたらどうでしょうか. 複雑な処理に名前をつけておいて, つまり関数にしてその関数を呼び出すだけにするのです. おおもとの関数だけ直せば, 関数を呼んでいる全ての場所が一気に変わります.

変数と関数

合計を書きたいなら SUM 関数に和を取る範囲を与える必要があるように, Excel で関数を呼ぶとき, その関数に適切な値を食わせる必要があります. この和を取る範囲を指定する部分がまさに変数です. 実際にいろいろな値が関数に入ってきます. この「いろいろな値」を扱うための概念が必要で, それが変数なのです.

念のため注意: 変数は「数」とは限らない

よくわからなければ飛ばして構いません.

Excel では SUM 関数に範囲を与えないといけないように, 変数とは言いつつ, 変数は数学で言う「数」とは限りません. プログラミングからしても, 純粋に数学としても, です. 数学としては例えばベクトルを与えないといけない関数があります.

数学の場合のご利益は?

ここまでプログラミングの立場から見た関数のご利益を説明してきました. あなたは数学の立場からのご利益が何かが気になっているかもしれません.

上でも何度かコメントしたように, Excel にも SUM のような集計 (統計) 系の関数があります. これはまさに数学の関数でもあります. 数学の場合はシグマ記号などと呼ばれています. この意味ではプログラミングと共通の感覚があります. 記号や名前を準備して, それで処理を代表させるのです. もちろん慣れるまでは大変です. しかしいったん慣れると非常に便利です.

もしあなたが Excel 対応で関数の便利さを実感できているなら, そこから数学への関数の感覚を育ててもらうのも一手です. もちろんあなたは Excel でも関数に苦しめられているかもしれません. その場合はもうがんばって, としか言い様がありません. これから一緒にがんばりましょう.

まとめ: 変数のご利益

関数の話がメインになってしまったので改めて強調しましょう. この講座でまず何がしたかったかと言えば, 何の役に立つかもわからない状況でいきなり変数の処理をやらされるので, そこに対する補足をしようとしていたのでした.

変数を使う場面として方程式を立てて解く場面があります. これについては既に別コンテンツでも話をしていますし, これが役に立つ・楽しいと思えているならいいのですが, 必ずしもそうではないと思います. そこで, ここでは関数との関係から変数がほしくなる・実際に使う場面を紹介しました.

関数自体が中高数学のハイライトで難点とも言えるので, ここではプログラミングと絡めて話をしてみました.

世の中にはいろいろな人がいて, ある説明ではわからなくても, 別の説明をしてもらえればわかることがあります. まさにその別の説明の仕方として Excel から話を組み立ててみました. これでわかる人・わかった人はそれでよく, わからない人はそれはそれでいいのです. ぜひ自分の気に入る説明をあなた自身でも探してみてください.

最後に補足: Excel からの数学

Excel の SUM 関数は数学だといわゆるシグマ記号です. もしあなたが大人になって多少なりとも Excel に慣れていて, 特に SUM を使えているなら, そしてシグマ記号にコンプレックスを抱えているなら, あれは SUM なのだと思ってください. 本当にそうです.

Excel で数値計算してグラフを描いて遊んでみるという本もいくつか出ています. 興味があればそうした本も探して眺めてみてください.

0050 「負」の処理

変数の計算

中学数学で出てくる変数の役割・意義はいくつかあります. 関数に対して使うのはその意義の一つです. そして関数を考えるとき, 変数に対していろいろな計算考える必要が出てきます. 典型的なのは二次関数 $f(x) = ax^2 + bx + c$ で, 変数 $x$ の二乗と文字定数 $a$ の積である $ax^2$, 同じく変数 $x$ と文字定数 $b$ の積である $bx$, 文字定数 $c$ の和を考えています. 文字で表される数, つまり変数に対してもいろいろな計算をする必要があるのです.

特に変数に対して負の変数があります. これは少しあいまいさのある言葉で, 例えば次のような意味があります.

  • 変数$x$には負の数しか入らない.
  • $-x$ のような形で, 負の数と同じように計算する.

前者は前者で, 絶対値の処理を筆頭にやっかいです. しかしここでは後者の問題を考えましょう.

負の変数

上で書いたようにここでは $-x$ のような変数だとします. これをどう処理すればいいかと言うと気分的には負の数と同じです. つまり負の数の計算ができるようになる必要があります. そこで負の数とその計算を考えてみましょう.

負の数とは?

負の数はとても厄介です. 今回はこの厄介さについて考えましょう.

昔, 「人間は考える葦である」と言い, 物理や数学でも大きな業績がある万能の天才パスカルは次のように話したと言われています.

私は, 0から4を引いて0が残るということを理解できない人たちがいるのを知っている.

これは「0 が表すモノはであり, 無から何を引いても無でしかない」と理解する必要があるそうです. これは 0 の定義に関わる問題で難しく面倒な話です.

ふつう負の数は数直線上で, 0 をはさんで正の数の反対側にある数と定義されます. これ自体に問題があるわけではありません. ただ, これでさっと理解できる人ばかりではないのも事実でしょう.

「そういうものか」と思った人も, 負の数の計算に関する問題があります. これも有名なのは次の問題でしょう.

  • マイナス×マイナスがなぜプラスになるのか?

典型的なのは次のような反応です.

借金×借金がどうして財産になるのか!

スタンダールも自伝で書いているそうです. これは数学を現実に適用するときの間違いでもあって, 面倒な要素がたくさんあります.

まとめ

プログラムも考えるとやはり中学数学でも関数が一つのテーマです. 関数の処理を考えると変数をきちんと扱えるできるようになる必要があります. 中学数学としては $-x$ のような負の変数も出てきて, これの処理が必要です. そしてこれはふつうの負の数と同じように処理するので, やはり負の数の処理が大事です.

こうして中学数学の最初の, そして考えようによっては最大の山である負の数の処理が出てきました. 次回, これを改めて考えてみましょう.