演習課題

2018/09/01 山田 泰司 <taiji@aihara.co.jp>

自分で解法を考える訓練が目的です。全てに解答しなければならないわけではありませんし、各人得意不得意もあるでしょうから、無理のない範囲で興味のあるものに挑戦してください。提出する場合、ちゃんと動作する完成品をアーカイブして送り、解法や方針がわからない場合は相談してください。

課題リスト

  1. 撹乱順列
  2. ピアノの音階の周波数
  3. 2次元の離散時間力学系
  4. 第2種スターリング数
  5. じゃんけんの確率
  6. カタラン数
  7. 「正しくない」括弧
  8. 食玩問題
  9. 離散時間力学系
  10. 移動手段の推定

尚、履修者以外でこの文書を利用したい方は、予めご一報頂けますようお願いします。

課題0 - 撹乱順列

n人によるパーティーでの互いのプレゼントが、各々自分のプレゼントに当たらない確率を n=20 まで印字せよ。また、さらに n=100 まで印字せよ。

ちなみに、この課題については解答例を末尾に紹介する。

課題1 - ピアノの音階の周波数

12平均律、88鍵盤のピアノの音階の周波数を、音階名を添えて、すべて求めて印字せよ。但し、音階名A4(49番目の鍵盤)の基準ピッチは440Hzとする。

課題2 - 2次元の離散時間力学系

次のエノン写像の振る舞いを10000ステップほど印字せよ。 \[ \begin{aligned} x(t+1) &= y(t) + 1 - ax(t)^2\\ y(t+1) &= bx(t) \end{aligned} \] ここで、\(a=1.4, b=0.3, x(0)=0.2, y(0)=0.1\)とする。

課題3 - 第2種スターリング数

次の第2種スターリング数を\(n (0\le n\le 10), k (0\le k\le n)\)について求めて印字せよ。 \[ \begin{aligned} \dstirlii{n}{k} &= \frac1{k!}\sum_{i=1}^{k}(-1)^{k-i}\dbinom{k}{i}i^n \end{aligned} \]

課題4 - じゃんけんの確率

2人から100人までの、じゃんけんで「あいこ」になる確率を印字せよ。

課題5 - カタラン数

次のカタラン数を\(n (0\le n\le 32)\)について求めて印字せよ。 \[ \begin{aligned} c_0 &= 1\\ c_{n+1} &= \frac{2(2n+1)}{n+2}c_n\\ &= \sum_{i=0}^{n}c_ic_{n-i} \end{aligned} \]

課題6 - 「正しくない」括弧

入力された文字列の括弧が正しいか判定する関数を作成し、利用して結果を表示せよ。また、\(n\)ペア\((1\le n\le 5)\)の「正しくない」括弧の場合をすべて列挙して印字せよ。

課題7 - 食玩問題

コンプガチャで400円のアイテムを8種類コンプリートする確率が9割を超えるのに掛かる費用を求めよ。

課題8 - 離散時間力学系

差分方程式クラスを継承した先のエノン写像クラスと次の修正ベルヌーイ写像クラスを作成し、それらの振舞いを10000ステップほど印字せよ。 \[ \theta(t+1) = \begin{cases} \theta(t) + 2^{B-1}(1 - 2\epsilon)\theta(t)^B + \epsilon &\text{ for }\theta(t) \le 0.5\\ \theta(t) - 2^{B-1}(1 - 2\epsilon)(1-\theta(t))^B - \epsilon &\text{otherwise} \end{cases} \] ここで、\(B=2, \epsilon=\mathtt{Double.min}, \theta(0)=0.3\)とする。

課題9 - 移動手段の推定

位置情報として移動履歴や速度履歴が20秒毎に得られたとして、過去5分間の移動手段(移動していない、徒歩、自転車、自動車、列車)を推定する手法を検討し、実装例を示せ。

解答例

課題0 in Swift at Xcode Playground
import Foundation

var str = "Hello, playground. Written by Taiji Yamada"

do { // n人によるパーティーでの互いのプレゼントが、各々自分のプレゼントに当たらない確率を n=20 まで表示
    print("derangement probability:")
    var a = [ 0, 1 ]
    print(1, Double(a[0]) / 1)
    print(2, Double(a[1]) / 2)
    var nf = 2
    for n in 3...20 { // ここまでが Int での演算における限界
        nf *= n
        let an = (n - 1) * (a[1] + a[0]) // モンモール数
        let p = Double(an) / Double(nf)
        print(n, p)
        a[0] = a[1]
        a[1] = an
    }
}
do { // n人によるパーティーでの互いのプレゼントが、各々自分のプレゼントに当たらない確率を n=100 まで表示
    print("derangement probability:")
    var k = 1.0
    var f = -1.0
    var p = 0.0
    print(1, p)
    for n in 2...100 { // 誤差を容認して Double で、別の漸化式で算出
        f *= -1
        k *= Double(n)
        p += f / k
        print(n, p)
    }
    print("1/e", 1.0 / exp(1.0)) // このように、これはネイピア数の逆数に漸近
}
// [参考文献]
// 1. チャート研究所「改訂版 チャート式 数学I+A」第6刷, pp. 334-335, 2017.
    

このように、作者を明示し、適度なコメントを添えて、参考にしたサイト等を添えておくこと。

すべての解答例(提出前の閲覧は控えてください): Exercises.playground-20180901.zip

Copyright (C) 2018 Taiji Yamada <taiji@aihara.co.jp>