今年度の入試問題を解いていて(2)

かなり前に書いた記事のお手頃な入試問題と同じ大学のお手頃問題。河合塾ではやや難。

条件付き確率の問題で,分母を簡単に取り換えると解きやすいという問題。ただ,厳密っぽく書けないから解答はそれでは書かないけど。結局,条件付き確率は。分母をなんとなくうまく取り換えられるかが全てだと思っている。その考え方は,解答は書きにくいので計算をしたふりはするけど。この感覚をつかむのは,個人的にはプログラミングのための確率・統計が一押しなんだけど,高校生にこれ全部読めは重いしなと思いつつ。

問題

まずさいころを投げる。出た目を a_1としておく。次にコインを投げる。表がでれば b_1=1となる。裏がでれば b_1 = a_1となる。これを3回繰り返して a_2, a_3, b_2, b_3を作る。

今, b_1=1, b_2=1, b_3=1の下での条件付き確率を考える。

  1.  a_1=1, a_2 = 1, a_3 = 5となる条件付き確率を求めよ。
  2.  a_1 + a_2 + a_3 = 7となる条件付き確率を求めよ。

なんとなく考えたこと

1.で考える。まず,3回のさいころをふる試行は独立。したがって,Bを b_1=1,b_2=1,b_3=1の事象を表すということにしておくと


 \displaystyle
 P(a_1 =1, a_2=1, a_3 = 5 \mid B ) = P(a_1=1 \mid B) \times P(a_2 =1 \mid B) \times P(a_3=1 \mid B)

となる。1回目のさいころの値は, b_2, b_3とは相互に一切影響がない。2回目以降も同様。したがって,求めるべき確率は


 \displaystyle
  P(a_1=1 \mid b_1=1) \times P(a_2 =1 \mid b_2=1) \times P(a_3=1 \mid b_3=1)

とできるはず。 b_1 = 1の下でのa_1の条件付き確率の分布を考える。

ここで,まず,次のような直感が出てくる。 b_1が1になるのは,

  • コインが表でサイコロの目はなんでもよしと
  • コインが裏でサイコロが1が出たとき

の2通りである。ということは,1がちょっと出やすい条件付き分布になるはずである。それを計算で確認する。それぞれの条件付きでない確率を出すと

  • 1~6のいずれかで表 :  1/6 \times 1/2
  • 1が出て裏 :  1/6 \times 1/2

でこれが全ての場合。また,1~6が出て表(6パターン)と1が出て裏(1パターン)は等確率なのがわかるので,全部足して1にするには分母を7にとってやればよい。よって, a_1の条件付きの分布は1が2/7で残りのさいころの目が1/7となることがわかる。あとは計算すると


 \displaystyle
  P(a_1=1 \mid b_1=1) \times P(a_2 =1 \mid b_2=1) \times P(a_3=1 \mid b_3=1) = \frac{2}{7} \times \frac{2}{7} \times \frac{5}{7} = \frac{4}{343}

とできる。

この考え方,1ではたいしたことがないが,2では大きく影響してくる。

2は普通にやると, a_i=1とそれ以外の分母が根本的に違うことになる。例えば, (a_1,b_1) = (1,1)の確率と (a_1,b_1)=(3,1)の確率を求めるときで,分母が違ってくる。で,場合分けして足すことになるので,計算が面倒なのである。解答速報の式を見ていると全部分母を12で揃えて


 \displaystyle
 \frac{12+12+6+3}{12^3}

としているが,こんなのやりたくない。ただ,解答にはこう書くけどね・・・

しかし,条件付き確率の扱いが中途半端なせいでただの分数計算がやっかいになってる現状って少し悲しい気もする。。。。

JavaのSilverの黒本を読むときに思ったこと

とりあえずなんとかJavaのSilverを片付けてきた。

この試験,黒本さえ仕上げれば楽勝らしい。そして,淡々とやっていけばこなせるとも書かれている。しかし,スペックの低い私は何度も挫折しかけた。なので,感じたことをだらだらと書いておく。

なお,私のスペックはJava未経験,プログラミングはそんなに得意ではなく,業務でもやったことはありません,のレベルである。

各章の問題と総仕上げ問題の難易度のギャップが大きい

悪いということではない。要は総仕上げ問題までは,範囲を網羅しつつポイントを定着させることを意図した教育的な問題配列になっているということである。各章の問題はポイントがはっきりしていて,学習効果は非常に高いと思った。

問題は,そのノリで総仕上げ問題もいけると考えてしまうのが良くないということ。なお,本番の試験は総仕上げ問題レベルと感じたので,結果的にこのレベルの問題は仕上げないといけない。

勉強時間を見積もるときには,総仕上げの手前まできたからもう大丈夫,でなく,そっからもう一山あるという感じで計画を立てるのが良いと思う。

あと,この特質から考えると,総仕上げの前までは基本知識なので解法暗記気味に全範囲を速いサイクルで回数を回していって,それがきちんと仕上がってから考える形で総仕上げ問題を解く,というようにしたほうが良いとも思う。総仕上げした段階でひっかかった部分はもう一回解説に戻って塗るとか。総仕上げ問題のセット数もそんなにあるわけではないので,そうせざるをえないともいえる。

重い章と軽い章の差が大きい

これは黒本の特徴ではなく,Javaがそういうものということなんだと思う。

1章から5章まではまあ軽いといえば軽いが細かいひっかけをいろいろと学んでいくといった感じ。

6章のインスタンスとメソッド・クラスの継承,7章のインターフェース,抽象クラスは個人的にはものすごく重く感じた。そして総仕上げ問題でもこの章がからむ問題はつらい。Javaで一番大事なとこだから当然といえば当然なのだが。

8章の関数型インターフェース・9章のAPIは軽い。

章の重さで勉強順は決めた

自分は,途中でなんとなくこの構造を把握して,それで勉強順を決めた。自分は8章をまず片付けて(Stream APIの使い方を調べる中でlambdaに時間を使ったので),そっからだらだらとオブジェクト指向の7章・8章以外をやって,気合の入った日に数日かけて7章と8章に手をつけた感じ。7章と8章も,適当にまずは一度やって,そのあと何回か塗り直す感じ。

スッキリにも書かれてる,初学者がこのトピックを一度で塗りきろうとすると危険なので,3度塗りぐらいの前提で読み進めていくのが良い,というのに従った感じ。

総仕上げ問題は取りやすい問題にまずは目を向ける

合格ラインは63%である。

重い問題読んでて疲れてて軽い問題をミスしたというのは最悪である。

軽い問題の解説を完璧に読み込んで落とさないようにする,というのが最重要だと思う。

総仕上げ問題をやってると,重い問題の解説に消耗して,軽い問題の解説を適当に読み飛ばしてしまいそうに何度もなってしまう。そのたびに軽いの落としたら意味ない,と心を整えてた。

知識の全体像を入れる本ではない

個々の解説は丁寧で良く理解できる。しかし,それはある程度の全体像があったうえでのものである。著者も最初のほうでそう言ってる。教科書でなくて問題集なんだから当然。

よって,全体像をつかむのになんかもう一冊本がないと素人にはきつかった。自分はスッキリを使った。特にオブジェクト指向のとこはパーツで暗記にかかると,暗記量が爆発して大変なことになる。そういうアプローチをしていると「2つ選べ」の問題がつらいことにもなる。なので,論理で割り切れるとこは論理で割り切らないとやってられない。というか,論理なしの反復アプローチでここの部分を覚えられる人は違う意味で尊敬する。

同じ本が2冊あると勉強がはかどる

私は1冊電子版をセールで買って,1冊紙版を買ってた。特に総仕上げ問題をやるときは,問題文と解答が同時に表示できた方が良い。解説はわかりやすい。わかりやすいけど見てわかるものでもないしそういう分量でもない。読んでわかるものである。なのでちゃんと読めるように環境整備したい。

もっとも,別デバイスKindle立ち上げれば一冊でも済むが。

全部完璧にしようと気合をいれすぎない

分量に何度も死にそうになった。完璧主義で行くとこれは死ぬと思って,いろいろとごまかしながらやった。例えば,総仕上げ問題を1回目にやったときは死にそうになり,1回で間違えたとこを全部完璧になるまで復習することはあきらめるなど,自分を適度に甘やかして最後までこぎつけた。

アプリにしてほしい

説に臨みたい。1万ぐらいまでなら払うと思った。紙で淡々と解いてると挫折しそうになるので・・・・

スッキリの副読本として良い本だと思った

スッキリだけ読んでるとストーリーはこういう感じで良く分かった,になって結構読み流しがちだったことに気付いた。というのも,黒の解説読んでそんなん知るか,となったときにもう一回スッキリに戻ったらちゃんとここに書いてありましたね,というのが多かったので。なので,スッキリを読み流ししないための素材として黒本を使うのはいいかなと思った。

自分のように,字面読むとか反復のアプローチで暗記は無理,何かの負荷をかけないと理解・暗記できない,といった人にとっては,この勉強でスッキリの内容がそれなりに読めるようになった良かったといった感じ。問題は重箱の隅をつついてる?とも思わないこともないこともあったけど,それを解いたり解説を読むために頭を働かせた内容についてはそんなに悪くなかったと思ってる。

余弦定理を使うか座標を使うか

先週のABCの問題。

時針の長さ・分針の長さ・時刻が与えられたときに時針の先端と分針の先端の間の距離を求めよという問題。

解説が余弦定理になってて余弦定理をぐぐってる人多数だったことにびびる。

この問題で,余弦定理を使っても脳のリソースを消費しない人はすごいと思う。

厳密な意味での三角形にこだわるなら位置関係の考察が面倒

三角形を使って考察するという時点で,私の中では次の2点で頭を抱える。

  • 時針と分針の位置関係の考察が発生する
  • (挟む角度を0から180度にするように計算するなら)何らかの場合分けが発生しそう

解答はさらっと書いてるけど,解答の角度を求める式で0度・負の角・180度から360度までの角が式の形とでそう。「三角形の問題」として考えるならこれらを回避する式を立てないとということになる。

ただ,常識で考えて cos(\theta ) = cos(-\theta) とかでどうせなんとかなるに決まってるとか,余弦定理の証明は(教科書は)座標で距離でやってるので0度とか負の角とか入れてもなんとかしてくれるんじゃない?って感覚はあるけど。

図形で解くときはこういう場合分けを考えないといけないのでp計算機があるなら座標計算に持ち込むのがシンプル。そういう感覚が頭の中にあるので,余弦定理を使うとわかっても第一選択にはなりにくい,というのが私の感覚。

座標で取ると頭は使わなくて良い

まず,座標の取り方が時計回りが正の向きになるように取ってあげる必要がある。それさえ注意すれば単純作業。小数計算が多数発生するはずなので,まあ桁落ちとかなければないなと祈りながらやるぐらいか。

ただ,座標のないところに座標を書き込むのは,少なくとも偏差値がある程度以上の受験数学をやった人の感覚のような。これもこれで訓練は必要。

教科書レベルだと,座標のないところに座標を入れるのは教科書では中線定理の証明とその前後にある例題ぐらい。なので,一定以上の受験数学を経験しないと訓練回数は足らないような。

複素数って発想はなかった

複素数の絶対値なら自動で計算してくれるということで,複素数に持ち込むって発想が斬新で面白いとは思った。

7000人程度に解かれてることがびびる

どっちで解いたとしても,教科書レベルに見えてそうでもない問題といったイメージ。これが7000人に解かれてるわけでびびるな。数学弱い人がこのサイトにレートを上げるつもりで参加するのはつらすぎるとしか言いようがない。これは努力は裏切るということを意味してるわけだが,まあこの世界,元々のスペック差が相当にある世界なのでそんなものなのでしょう。

こういう問題が高校の数学の授業で扱えるといいんだけどね・・・

  • 座標と余弦定理の使い分け。メリット・デメリット。よさ。
  • 座標の距離計算から余弦定理は導けるので,本質的には同じことをやってるのだからどっちも同じ。
  • 複素数に持ち込んでみると,コンピュータの用意されている道具によっては扱いやすくなる。

あたりを題材に色々と話すことはある。ただこういうのって,自明な人には自明だし,説明しても一生理解できない人には理解できないしとなかなか扱いにくいんですよね。

数学活動とかいってる人たちは,こういうのをうまく授業に乗せて欲しいですね。(自分はもうそういう世界から降りた側)

このサイトの問題,そういう題材としてほんといい問題が多いんだよな・・・

プログラミング初心者がreduceしか見えないのは変なのはわかってるけど・・・

プログラミングの練習をしてたら,配列があって,配列の中身全部の最大公約数を求めるコードを書くことになった。

で,古いPythonだから最大公約数を求める関数はfraction.gcdとして(今だとmath.gcd),

import fractions
from functools import  reduce
list1 = [4,12,28]
reduce(lambda a,b : fractions.gcd(a,b),list1,list1[0])

のようなのしか思いつかない。たぶん重症。

普通のループを書けば良いんだけど,ループを書くのがおっくうといういう病理。

Pythonを使い始めれば少しはその傾向が変わるかと思いきや,あまり変わらない。リスト内包記法でかなりのループがまかなえる,ということに日々気付く方向になってるし。

病理の原因?

最初に使った言語がRだったせいか,普通のループを書くのがずっと苦手。次に使ったのがRubyなので,その傾向が変わるわけもなく。

自分の感覚,たぶんおかしすぎる。

例えば,超初心者の頃から無名関数を使うことにも全く抵抗がなかった。Rのちょっとマニアックな本で,apply系関数に引数にfunction(x){なんとか}でその場で関数の内容をべた書きして与える例を見て感動してから(感覚おかしい!),これは便利ということで抵抗なく使ってるし。。。

その流れでいくとRubyのブロックはごく自然に使えるようになるし,色々使たり本とか読んだりでたりするうちに,関数に関数を渡すという概念も自然になり・・・

世間ではこういうのを関数型になじみのある人っていうんだろうけど,再帰とか全然わかんないし,そんなに数学得意じゃないのにおかしいな。。。

しかし,こういう人が初心者にプログラミングを教えるのはだめだとは思ってる。ほんと,自分の感覚のおかしさにあきれる。

オートモードのシーフードサラダが意外とよかった

f:id:baruku07:20200510024606j:plain

スーパーでいか(輪切りになってる)のとアスパラがおいしそうだったので,調理法は後から考えるかで買って帰った。

いかはソフト蒸しにするとして,時間を考えるのが頭痛いと思ってたとこに,オートモードがあるのを思い出す。

説明には,ソフト蒸し75度16分で代替できるとのことだったのでたぶん思った通りの仕上がりになるとふんで蒸す。アスパラもこれに入れてしまえば良いと気付いて同時にいれてボタンを押す。

で,試食をしたんだけど良い。2/3が一瞬で消える。

ただ,アスパラが200円,いかが400円。原価が高すぎる・・・自炊は節約になるといったのはどこの誰だと最近つくづく思う。

3つのサイコロの最小値は定義通り素朴にやっては・・・

本をばさっとScanしようとしたら、よくある問題に目が止まった。

サイコロが3つあって(誘導付きで)最小値が2である確率を求めよと。

通常は、P(最小値が2以上)-P(最小値が3以上)が普通。最大値が2以上は、全部2以上が出るとできるので、結局  \left( \frac{5}{6} \right) ^3 で簡単に計算できるし,最小値が3以上でも簡単なので,結局そうやれば簡単にできるでしょ,という考え方である。ただ、個人的にこの考え方、知ってるか知ってないかだと思って好きではない。

なので,普通にできないの?とかふと思ったりすることがある。この問題,最大値の定義ということを踏まえて考えれば

 P(最大値が2) = P(全部2以上) \times P(少なくとも1個2を取る \mid 全部2以上)

で計算できるはずで、

 P(最大値が2) = (\frac{5}{6})^3 \times ( 1-(\frac{4}{5} )^3 )

とすれば、普通に式がたつ。展開すれば結果的に同じ式にはなるけど。

ただ,この解法,「全部2以上の世界で考えて余事象」を考えるのが厳密じゃないとか言われればまあそれまでなんだけど。個人的には,最大値の定義をストレートに考える考え方のほうが素朴だと思うんですけどね。。。

教科書の配列順の関係や、一般人受けの関係で、条件付きの考えははよほど必要な時以外は全面に出さないことになってる,というのはわかる。特に,制限した世界で全事象を取るということは相当に抵抗感があるみたいで。条件付き確率を計算する問題ですから,全事象を条件付きの世界に取り換えて計算することなく,もとの事象の世界で考えて、ばかばか大きな数のまま計算して定義に代入、ってスタンスで書かれているのがほとんどだし。

Pythonはじめました

2月ぐらいで短時間でとある教科書のプログラミング教材について話す講義をすることになった。その算数教材について,講義しないとならない事項が多すぎてブロック言語では間に合わない。そこでブロック言語とテキスト言語を両方示しながら講義するという案で行くことにした。

Google BlocklyのDemoにあるCode Editorがいい感じでブロックを作ってくれるので,ブロックのサンプルはこれで良い。テキスト言語は慣れているRubyにしたかったのだが,Code EditorがPythonをブロックからの自動変換で吐いてくれるので,Pythonを使うことにした。

個人的にはPythonのインデント命が嫌いで仕方がなかったので避けていた。ただ,いざ読ませる方になるとインデント教のほうが良いなと思いだした。かっことかendが省略できて縦の幅を取らずにコードがかけることが,講義資料を書くときに相当にありがたいのである。特に,紙に書くときやディスプレイが縦長でないことを前提とするときにありがたい。

AtCoderのAB問題で練習中

そのうちPythonを使って計算やデータ系のお勉強はしたいけど,そこまでの基本を身に着けるのにどうしようかということで,AtCoderのABCのA, Bをここ数日解いている。

やってるうちにリスト内包表記もなんとなく使えるようになってきて,いい感じ。初心者が基本的な練習するのには,ほんと良くできてるとつくづく思う。

あとは,Pythonで解くことでPythonの解答コードも読むようになってきて,そうするとRubyより回答数が多いので自分にとって読みやすいコードに触れられることも多くなって,そういう意味でも良い感じ。