遊び tokidoki 仕事

数学と音楽と教育と遊び

| おしごと - きょういく - がくせい - ゼミ - イベント | すうがく - おんがく - 数理音楽 - DTM - かがく - scratch
| Art - photo - おきにー - Tips - ものもう - あれこれ | About - Top

基数システムで遊び倒す

ネイピアの骨ってのは古来知られた計算盤として
しばしば教育現場でも取り扱われるネタだろう.
f:id:okiraku894:20150508124933p:plain
でも,Genaille-Lucasの計算盤は日本ではあまり有名ではないようだ.
自分も某講義の下準備のため調べていくうちに見つけた.
Genaille–Lucas rulers - Wikipedia, the free encyclopedia
で,やっぱり作ってしまった,Scratchで.
f:id:okiraku894:20150508145846g:plain
↓複数桁自然数×一桁のシミュレーションをやってくれる.

おまけに,Genaille-Lucasには割り算バージョンもあるのだ.

さて,毎度こちらがあれこれネタを用意して見せてきた某教科学.
そろそろテレビのように見てる学生らにもパフォーマンスを出してもらいたい.
ということでこのGenaille-Lucas計算盤を彼らに設計してもらうことにした.

初めにネイピアの骨で計算棒というアイディアに触れてもらって
それを踏まえて一部のみ分かるようにしたGenaille-Lucas計算棒一覧を渡し,
これを完成してもらう作業を課した.
もちろん,使い方そのものも自分たちで考えてもらうことから始めた.
これまで散々筆算で掛け算をやってきただろうし,
おまけに直前にネイピアの骨で繰り上がりの仕組みを再確認したから,
さすがに皆仕組みまで自ら発見するだろうと思いきや,それがなかなか.
最後までこの仕組みを納得できないで
見た目の法則だけで完成させたものもちらほら.

学生らがいかに形式的にしか物事を見ないで過ごしているのか
それを改めて思い知った場面だった.

The Sieve of Moebius

二次関数y=x2を描く.
で,あらゆる整数p,qの組合せに対し,P(p,p2)とQ(q,q2)を結ぶ.
するとy軸上でこれら線分が通った点を消していくと,素数だけが生き残る.

一見不思議なんだけど,実は線分PQのy切片はいつもpqになることに由来している.
紀元前からエラトステネスの篩として素数をだけ残す篩が知られていたが,
19世紀にメビウスは放物線上の整数点から篩ってみたわけだ.
生徒が二次関数の学習をしたときの,ちょっとした小ネタにできそうな話題.
れいの「教科学」のネタ...

楕円曲線を始めとする代数多様体上の有理点は数論幾何の主対象なんだが,
実は二次曲線であっても色々と面白いことが起こる.
円上の有理点はピタゴラス数全てに対応するが,
これらを制御する力学系が独立に多くの人によって発見されてきた.
その辺りの話はたとえば↓に.

トポロジカル・インデックス: フィボナッチ数からピタゴラスの三角形までをつなぐ新しい数学

トポロジカル・インデックス: フィボナッチ数からピタゴラスの三角形までをつなぐ新しい数学

で,このメビウスの篩の元ネタは
ありとあらゆる方面に長年にわたり精力的な研究を続けていらっしゃる,
本業は数学者ではない,佐藤 郁郎氏のページから.
メビウスのふるい
がんセンターに勤めながら,この膨大な数学コラムの山.

おもしろそうだったからBASICで作ってみた.
↓クリックで拡大

REM
REM [Moebius sieve]
REM Ver. 2015/05/02
REM

INPUT  PROMPT "maximal number":maxN
LET maxX=INT(SQR(maxN))
DIM pr(2 TO maxN)
FOR k=2 TO maxX
   FOR l=2 TO INT(maxN/k)
      LET pr(k*l)=1
   NEXT l
NEXT k
SET WINDOW -maxX*1.05,maxX*1.05,-maxN*.05,maxN*1.05
DRAW axes(INT(maxX*.1),INT(maxN*.1))
SET LINE COLOR 2
FOR x=-maxX TO maxX
   PLOT LINES: x,x^2;
NEXT x
PLOT LINES
SET LINE COLOR 3
FOR j=-2 TO -maxX STEP -1
   FOR i=-j TO INT(-maxN/j)
      PLOT LINES: j,j^2; i,i^2
   NEXT i
NEXT j
DRAW axes(INT(maxX*.1),INT(maxN*.1))
SET POINT COLOR 4
SET POINT STYLE 4
FOR k=2 TO maxN
   IF pr(k)=0 THEN PLOT POINTS: 0,k
NEXT k
END

芸は身を滅ぼす?

度々,免許更新講習やら訪問授業やら高大連携やらで
有名な27 card trickをやってきたのだけど,
その仕組みを説明するときPower Pointでのアニメーションでは説得力がなかった.
しかしBASICでやるのもビジュアルにあまり楽しくないし,ってことでScratchで作ってみた.
f:id:okiraku894:20150425154127p:plain
別に27枚でなくても良いのだけど3進数表示にマッチすることだし,
基数システムの話題に載りやすいので27枚でやっている.

スタートさせると27枚が番号付きで積みあがるので,その中から1枚クリックして選ぶ.
そしてDealボタンを押すと3つの山に配られ,
その後選んだカードのある山を真ん中にして3山を重ねる.
またDealボタンを押す...を多くても3回繰り返せば,
選んだカードは必ずB山の真ん中にくる.
その様子が見えるように作った.

さてなぜ必ず真ん中に来るか.
それは選んだカードのある山を真ん中に挟む操作が,
3進数で番号付けした各桁を順に特定することになるからだ.
そしてこの考え方を応用すると色々カードマジックができそうだ.
しぶしぶ講義する羽目になった「教科学」で実験するかもしれない.
そうなんだ,いつもは文系や一般人や高校生相手の話題だから
それほど突っ込んだ話にしなくても喜んでくれるのだけど,
「教科学」は数学の学生相手.すぐに見破られてしまうので,
ネタ探しに毎週土日を潰す羽目になってしまった.

「芸は身を助ける」というのが一般的に知られているが,
一方で「芸は身の仇」とも言うらしい.
何だろう,何か間違った方向にどんどん進んでいる気がしてならない.
(はいそこ,「今さら」とか突っ込まない.)

こどもたちはやり方を知りたいと思うと,それを学習するのです.

さあ,新年度開始.だから初年次演習も始まる.
過去2年やってみたが,何か地に足がついた講義になっている気がしない.
それは何より私自身,主張はあれど
それを実現するきちんとした基盤を持てないでいるからだ.
それでも明日から始まる.今回,もう少しだけ形を変えてみたい.
何か学生が自発的に「学び」に気付く方法は無いものかと.

で,再びふらふら歩いていたら,TEDの良いトークにぶつかった.
スガタ・ミトラの自己学習にまつわる新しい試み,だ.www.ted.com
そこから印象深い言葉を幾つか拾おう.
「こどもたちはやり方を知りたいと思うと,それを学習するのです.」
またこのトークではアーサー C.クラークと対談したシーンがあるのだが,
そこでのアーサーの言葉.
『機械で替えがきく教師は 替えるべきだ』
『子どもたちが興味を抱いたとき,そこに教育が生まれる』

それに続いて,
「これは間違いなく 人の役にたちますよ.
 子どもたちは やり方をすぐ理解して夢中になって面白いことを探しますからね.
 興味を持てれば教育を受けているのと同じことです.」
そしてトークの最後は次で締めくくられる.
教育は自己学習システムです.そこでは学習が創発的現象なのです.
実験的に証明するには数年かかるでしょうがやってみるつもりです.」

とりあえず,明日からの初年次ではこのトークの一部を紹介するつもりだ.
教えられることに慣れ過ぎた学生に,小さな変化を起こす導火線になればと.

統計とコンピュータも方法を大きく変えたいと思い,プロジェクト学習なんかも視野に入れて
(もちろんとてもそんな大がかりなことはできないけど)講義を考え直している.
その参考とした書物の中に次の言葉があった.
そうあって欲しいという教育者の願いが込められた言葉に思える.

「子どもは教えないと何も知らないかもしれません.
しかし大事なことはすでに知っている気もします.
人間は知識の入れ物ではありません.
その深いところに『高き心』や『知』を希求する魂や
『考える』ということでしか良き未来への道はないことを知っているかのような存在
と私には感じます.」

プロジェクト学習の基本と手法―課題解決力と論理的思考力が身につく

プロジェクト学習の基本と手法―課題解決力と論理的思考力が身につく

おっと,いつものあれももちろん.

人を伸ばす力―内発と自律のすすめ

人を伸ばす力―内発と自律のすすめ

箱ひげ図自動作成マクロ作ったよ

統計教育の必要性が叫ばれ始めて随分と経つそうだ.
そして今年度もやがて始まる講義,統計とコンピュータ用に作ってみた.
講義内容・方法を全面的に変えようと画策しているが,未だ目処が立たず.
ちょっと気が滅入ってきている今日このごろ.
f:id:okiraku894:20150402190751p:plain
五数要約と平均値が書かれていれば,その範囲を選択して【Ctrl+b】をすると
そのシートに箱ひげ図ができあがる,というものだ.
2015/04/27 修正!
項目の方向を自動判定させず常に
横方向が項目となるようにした.
余分な系列が表示されていたので消した.
散布図で平均の位置を描いていたのを変更.
項目が文字だとエラーが出るので訂正した.

あちこちサイトを回ってかき集めた情報で何とか作ったシロモノなので,ソースは汚い.
サーフィンしてみてわかったけど,苦労している人が多そうだから
ここにのっけておく.結構需要高いと思う.
あ,エラー対策してないから,間違った範囲選択でCtrl+bするとマクロ画面に変わります.
20150427_boxplot_macro.xlsm 直

Sub boxplot()
'
' boxplot Macro
'
' 五数要約(上から順に,最大・第3四分位・中央・第1四分位・最小値・平均値)とした表から
' 箱ひげ図を作る
'
' Ver. 2015/04/27
' http://tokidoki.hatenablog.jp/
'
' Keyboard Shortcut: Ctrl+b
'
    Dim box0, dWisker, uWisker, Mean
    
    ActSht = ActiveSheet.Name 'アクティブシート名取得
    Set ActArea = Selection
    ActCell = ActArea.Address '選択範囲のアドレスを取得(項目名,最大~平均値を囲う)
    box0 = Range(ActCell)
    UB = UBound(box0, 2)
    UBB = UBound(box0, 1)
    ReDim boxName(1 To UB)  '(1,i):項目名
    ReDim boxLB(1 To UB) '(2,i):箱の下境界
    ReDim boxMid(1 To UB) '(3,i):中央線まで
    ReDim boxUB(1 To UB) '(4,i):箱の上境界まで
    ReDim dWisker(1 To UB) '(5,i):下ヒゲ長
    ReDim uWisker(1 To UB) '(6,i):上ヒゲ長
    ReDim Mean(1 To UB)  '(7,i):平均値
    
    '五数要約からグラフ表示用のデータに変換
    For i = 1 To UB
        boxName(i) = box0(1, i)
        boxLB(i) = box0(5, i)
        boxMid(i) = box0(4, i) - box0(5, i)
        boxUB(i) = box0(3, i) - box0(4, i)
        dWisker(i) = box0(6, i) - box0(5, i)
        uWisker(i) = box0(2, i) - box0(3, i)
        Mean(i) = box0(7, i)
    Next i
    
    'メインの箱の系列データをセット,グラフをSheet内に配置
    Charts.Add
    With ActiveChart
        .ChartType = xlColumnStacked
        .PlotBy = xlRows
        .SeriesCollection(6).Delete
        .SeriesCollection(5).Delete
        .SeriesCollection(4).Delete
        .SeriesCollection(1).XValues = boxName
        .SeriesCollection(1).Values = boxLB
        .SeriesCollection(2).Values = boxMid
        .SeriesCollection(3).Values = boxUB
        .HasLegend = False
        .Location Where:=xlLocationAsObject, Name:=ActSht
    End With
    
    'メインの箱の色と線を変更
    ActiveChart.SeriesCollection(1).Select
    Selection.Format.Fill.Visible = msoFalse
    ActiveChart.SeriesCollection(2).Select
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.ObjectThemeColor = msoThemeColorAccent5
        .ForeColor.TintAndShade = 0
        .ForeColor.Brightness = 0.6
        .Transparency = 0
        .Solid
    End With
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 0)
        .Transparency = 0
    End With
    ActiveChart.SeriesCollection(3).Select
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.ObjectThemeColor = msoThemeColorAccent5
        .ForeColor.TintAndShade = 0
        .ForeColor.Brightness = 0.6
        .Transparency = 0
        .Solid
    End With
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 0)
        .Transparency = 0
    End With
    
    '上下のひげ.ただし下ヒゲもxlErrorBarIncludePlusValuesで行ったので,
    '使う値dWisker()は負になるよう計算してある.
    With ActiveChart
        .SeriesCollection(3).HasErrorBars = True
        .SeriesCollection(3).ErrorBar Direction:=xlY, Include:= _
            xlPlusValues, Type:=xlErrorBarTypeCustom, amount:=0
        .SeriesCollection(3).ErrorBar Direction:=xlY, Include:= _
            xlErrorBarIncludePlusValues, Type:=xlErrorBarTypeCustom, amount:=uWisker
        .SeriesCollection(1).HasErrorBars = True
        .SeriesCollection(1).ErrorBar Direction:=xlY, Include:= _
            xlErrorBarIncludePlusValues, Type:=xlErrorBarTypeCustom, amount:=dWisker
    End With
    
    '平均値をマーカーのみの折れ線グラフで追加
    With ActiveChart
        .SeriesCollection.NewSeries
        .SeriesCollection(4).Values = Mean
        .SeriesCollection(4).ChartType = xlLineMarkers '折れ線グラフ
        .SeriesCollection(4).Select
    End With
    With ActiveChart.SeriesCollection(4)
        .MarkerStyle = 4 'マーカーは×
        .MarkerSize = 8
        .Format.Fill.Visible = msoFalse 'マーカーを塗りつぶさない
        .Format.Line.Visible = msoFalse '折れ線は消す
        .MarkerForegroundColor = RGB(255, 0, 0) 'マーカーは赤で
    End With
    
    ActiveChart.Axes(xlValue).MajorGridlines.Delete ' 横目盛線消去
End Sub