魂の生命の領域

AWS とか Python とか本読んだ感想とか哲学とか書きます

子供のころ理解できずに恐怖していたニュートン算に大人が挑む

1. はじめに

私は中学受験をしたので、いわゆる〇〇算をたくさん勉強させられた。

今ググったら「特殊算」という総称があるらしい。

和差算、相当算、旅人算、過不足算、つるかめ算、等々である。

個人的には相当算が一番好きだった。

ディオファントスが何歳まで生きたかを求めるやつとかね。

中学生の兄弟がいるクラスメートは、つるかめ算連立方程式で解いていてカッコ良かった記憶がある。

そんな特殊算の中で、勝手に「ヤバい」と思っていたものがあった。それがニュートン算である。

小学生の当時は全く歯が立たなかったし、教えてもらって理解した記憶もなければ教えてもらった記憶すらない。でもきっと教えてもらったはずだ。

ニュートン」の名を冠していると言う存在感と、比較的長くなる傾向のある問題文にある種の畏怖のようなものを感じていて理解することすらも恐れていた。

なんでそんなに怯えていたのか、今考えると意味不明過ぎるのだが、とにかくあまりの異質さに理解しようとすらしなかった。

大人になっ(て云年経ってしまっ)た今、解けるのだろうか。

2. 例題

例題を見てみよう。以下のサイトを引用させていただく。

xn--fiqx1l37ge5k4ncxx0j.net

遊園地の入場券の発売開始時刻に400人の行列ができていて、その後も毎分20人の割合で人数が増えていきました。入場券発売口を4つ開くと、行列が20分でなくなりました。もし入場券発売口を6つにしていたら、発売開始から何分で行列はなくなりますか。

『中学受験の教材制作室』より引用

ニュートン算とはこういった問題である。

毎分流入があるタンクからパイプで排水して空にできるまでの時間を求めよ、と言うパターンもある。

当時は、例題に即して考えた場合、「400人を20分で捌くなら毎分20人捌けているわけだけど、その間にどんどん人は増えるから何も分からないのでは?」と言う感覚だった。

「てか人が毎分追加されたら永遠に終わらないのでは?」とすら感じていた。

頭の中で窓口の人になったところを想像して、最初にいた400人を頑張って処理しているのにどんどん人が追加されていってもうウワーーーっ!と思考停止してしまうのである。

今でも気持ちはわかる。でも改めて言葉にするともう少し考えれば当時でも十分分かっただろうと思う。

では、大人になった今、冷静に考えてみよう。

3. 冷静に考える

もう一度問題文を見てみよう。

遊園地の入場券の発売開始時刻に400人の行列ができていて、その後も毎分20人の割合で人数が増えていきました。入場券発売口を4つ開くと、行列が20分でなくなりました。もし入場券発売口を6つにしていたら、発売開始から何分で行列はなくなりますか。

『中学受験の教材制作室』より引用

3-1. 最初に考えたこと

最初に、「結局窓口が4つの時は合計で何人捌いたの?」というのが気になった。

その疑問の答えはすぐにわかる。

400[人] + 20[人/分] * 20[分] = 800[人]

だ。毎分20人増えて、20分かかったのだから、増えた分は 20 * 20 = 400人で、最初に400人いたのだから合計で800人処理したことになる。

うん。

3-2. 次に考えたこと

次に、この800人を4つの窓口で捌いたのだから、窓口1つあたりでは200人捌いている。

そして、窓口一つあたり200人を20分で捌いたのだから、窓口一つの処理能力は毎分10人だ。

うん。何も迷う要素はない。

3-3. おや?

そして問われているのは、窓口が6つの場合に合計何分で捌けるかだ。

「毎分10人を捌ける窓口」が6つあると、毎分60人を捌ける。

さて、毎分60人捌ける場合、何分で行列を全部捌けるだろうか?

ここで大人の自分は少し詰まった。方程式を使いそうになったからだ。

3-4. チート(方程式)を使う

中学受験で方程式を使うのは一応チート技とされている。高校物理で微積を使うようなものだ。

でも、一旦方程式を使ってみたい。後で方程式使わない場合を考えよう。

方程式を使うと、問題文の順序に沿って書き下して立式できるという利点がある。

先ほどの窓口あたりの処理能力を求めるまでの流れをなぞる形で立式してみよう。

400[人] + 20[人/分] * 20[分] = {窓口一つが毎分捌ける人数} * 4[窓口] * 20[分]

まずこうだ。その上で、 {窓口一つが毎分捌ける人数} が10だと分かったのだった。

そして窓口が6つのとき、t 分で全部捌けるとすると、上の関係式は次のように拡張できる。

400[人] + 20[人/分] * t[分] = 10[人/(窓口*分)] * 6[窓口] *t[分]

こうなると機械的に解ける。

400 + 20t = 60t
-> 40t = 400
-> t = 10

答えは 10 [分] だ。

3-5. 方程式を使わない

もちろんさっきので正解なのだが、方程式を使わない場合どんな風に説明するかを考えよう。

毎分10人を捌ける窓口が6つあると、毎分60人を捌ける。

ここまでは方程式を使っていないので、前提として使っても良い。

自分が思いついた説明はこうだ。

窓口が6つあると毎分60人捌けるが、毎分20人増えるので、実質的には毎分40人を捌くことができる。

これで400人を捌くことを考えると、400[人] / 40[人/分] = 10 分かかる。

明快だ。これなら小学生にも理解してもらえるのでは?

3-6. 解答を整理

ダラダラと思考をトレースしたので冗長になったが、整理すると以下の論理展開になる。

  1. 毎分20人増えて、合計20分かかったのだから、増えた分は 20[人/分] * 20[分] = 400人である。
  2. 最初に400人いたのだから合計で 400[人] + 400[人] = 800人処理したことになる。
  3. この800人を4つの窓口で捌いたのだから、窓口1つあたりでは200人捌いている。
  4. 窓口一つあたり200人を20分で捌いたのだから、窓口一つあたりで毎分10人捌くことができる。
  5. 窓口が6つあると毎分60人捌けるが、毎分20人増えるので、実質的には毎分40人を捌くことができる。
  6. これで400人を捌くことを考えると、400[人] / 40[人/分] = 10 分かかる。

分かってしまえばなんてことはないが、個人的には小学生以来の魔法が解けたような感覚がある。

4. どこに引っかかっていたのか

当時、どこに引っかかっていたかを振り返ってみたい。

もちろん自分が記憶を捏造している可能性もあるが、多分こうだったんだろうなというのはある。

上に述べた答案のステップごとに、自分がたどり着けたかどうかを考察する。

まず 1. と 2.だ。

1. 毎分20人増えて、合計20分かかったのだから、増えた分は 20[人/分] * 20[分] = 400人である。   
2. 最初に400人いたのだから合計で 400[人] + 400[人] = 800人処理したことになる。

当時は、「毎分n人増える」という情報から「ある瞬間について計算しても次の瞬間にはまた20人増えてもう違った状態になっている」という感覚を得てこの時点で何もできなくなっていた。

「最終的に何人処理したの?」という疑問がまず浮かばなかった記憶がある。

次に 3. と 4. である。

3. この800人を4つの窓口で捌いたのだから、窓口1つあたりでは200人捌いている。  
4. 窓口一つあたり200人を20分で捌いたのだから、窓口一つあたりで毎分10人捌くことができる。

今述べた通り1.と2.すら突破できていないのだが、そこを当時の自分に説明したとして、この 3. と 4. が理解できただろうか? 多分、自分はここでも引っかかったと思う。

そう思う理由は、この「窓口一つあたり200人捌いた」というのが、厳密に考えるなら「平均で200人」になるだろうからだ。

当然、「平均」200人だと明示しようがしまいがどうでもいいというのは、大人だからすぐにわかる。

実際には秒単位になるだろうし、その場の天気や気温、スタッフの練度によっては分単位でブレるだろうが、問題文の粒度に照らしてそんなことは考慮に入れなくても良いことはわかる。

これは理想的で非現実的な状況を考えているではなく、現実においても、細かいブレは試行回数を増やすことで平均化されていく感覚を大人は持っている。

1日に何百人も捌けば一人当たりの対応時間など平均値以外ほぼ意味を持たないし、1ヶ月とか何ヶ月とかのスパンで考えれば尚更のことだ。

しかし、もしかしたら当時はこういったところも言語化できない複雑さとして自分を混乱させていたのかもしれない。

最後に5.と6.だ。

5. 窓口が6つあると毎分60人捌けるが、毎分20人増えるので、実質的には毎分40人を捌くことができる。  
6. これで400人を捌くことを考えると、400[人] / 40[人/分] = 10 分かかる。

当然、「毎分n人増える」という情報で頭が真っ白になっているので、当時の自分には5.のような「実質の処理能力」を理解する余地はなかったと断言できる。

あと、5. を説明されたとしても 6. のところで「えっ、なんで人数が増えることを考慮に入れなくて大丈夫なの???」と混乱したと思う。

5. 一般的に解く

最後に、仕返しとしてある程度まで一般化して終わりにしたい。

まず、状況設定はこうしよう。

  • 処理開始時点の行列が N
  • 毎分 ΔN 人ずつ増える
  • 窓口が1つのとき t_1
  • 窓口一つあたりで毎分処理できる人数 p
  • 窓口が m 個のとき t_m

とした上で、 t_m について解いてみよう。

といってもやることは 3-4. でやった方法そのままだ。

まず、 p を求めることができる。

N + ΔN * t_1 = p * t_1
-> p = (N + ΔN * t_1)/t_1

これを窓口 m 個の場合に拡張すればよい。 窓口が m 個あれば、毎分 m * p 人捌くことができるので、

N + ΔN * t_m = m * p * t_m

t_m について解くと

t_m = N/(m * p - ΔN)

で、 p を代入すると、

t_m = t_1 / (m + (m-1) * ΔN/N * t_1)

となる。

あるいは、今回の例題のように窓口が m 個と n 個のときの所要時間を使うバージョンも考えられる。

N + ΔN * t_m = m * p * t_m
N + ΔN * t_n = n * p * t_n

この2式を連立させるだけだ。t_n について解くと

t_n = t_m / [n/m + (n/m - 1) * ΔN/N * t_m]

こうなる。分数を1行に押し込めて書いているので一見複雑に見えるが、実際は大したものではない。

こうしてみると、見えてくるものがある。

まず、ΔN/N の部分をみると、最初の人数と毎分の増加分はそれぞれ具体的な値が分からなくても比が分かっていれば良いことがわかる。「毎分何%ずつ増える」さえ分かっていれば良い。

n/m から、窓口の数についても同様に比率さえわかれば良いこともわかる。

以上を踏まえて例題から情報を削ぎ落とすと、こうなる。

遊園地の入場券の発売開始時刻にある人数の行列ができていて、その後も毎分、開始時刻の人数の5%の人数が増えていきました。入場券発売口をある数だけ開くと、行列が20分でなくなりました。もし入場券発売口の数を1.5倍にしていたら、発売開始から何分で行列はなくなりますか。

一気にとっかかりがなくなったように見える。

これって(お受験をする)小学生は解けるんですかね?

もし解くなら最初の行列の人数と最初の窓口の数を適当に仮定する感じになるのだろうが、その場合仮定した数に依らないことは示せるのだろうか?

ちなみに、今回取り上げたのはもっとも典型的なニュートン算の問題だが、引用したサイト内で難関校を想定しているという問題を解いてみると普通に難しかった。

そして解答をみると、窓口一つあたりの毎分の処理数(ここでは p とおいていた)を 1 とおいて計算を進める方法が定番のテクニックのように見えた。

むずくないか?この記事内で私は次元をある程度明示しているが、ここが曖昧だとかなり解くのは厳しいと思う。

6. まとめ

大人の力を持ってすれば余裕だと思っていたが、応用問題は普通に方程式を使わないと今でも全然解けないということが最後に判明してしまった。

本当は応用問題を解く仮定も載せたかったが、方程式なしで自力で解けなかったので載せない。

悔しい。