2017年6月25日日曜日

ふりまわされる学生

 小学校でのプログラミング教育が検討されているそうです。情報化が進んだ昨今、学生が社会に出てからの仕事のことを考えてのことでしょう。
 ですが、プログラミングを追加して、英語を追加してと増やしてばかりでは、学生も先生もパンクしてしまいそうです。

 インターンの採用直結を認めないというニュースがありました。社会に出てからの仕事の前に、学業を優先させるということらしいです。
 先ほどの話と優先順位が逆転しているところは滑稽です。

 以前、博士号を持つ人材を増やそうという政策がありました。海外の学位のシステムを意識した政策なのでしょうが、その結果、就職できないポスドクが増えたという話をよく聞きます。

 こういった話を聞くと、学生がふりまわされているという印象を受けます。

 教育に正解はないでしょう。人それぞれです。しっかり学業を修めた方がいい人もいれば、インターンから直接就職して活躍する人もいるでしょう。
 正解はないからこそ、押し付けだけはやめて欲しいと思います。すべての学生に一つの政策を押し付けるのは、独善的で配慮に欠いたやり方です。


 私は、インターンの採用直結を悪いと思わないので、先のニュースを聞いてびっくりしました。もちろん世の中にはいろいろな裏の事情があるとは思いますが、「学業を優先させる」という一方的な論理を強要するのは、それこそ教育的ではないと強く思った次第です。


クレーマー・クレーマー

 クレームを言うのが苦手です。

 日本人の気質でしょうか。文句を言って不和を生むよりは、我慢することを選んでしまいます。

 ですが、現状に不満があるからこそ、将来の改善につながるものです。正しいクレームは、実は生産的な活動だと思います。
 もちろん、正しくないクレームは諍いを生むだけなので、その加減が難しいのですが。

 願わくば、間違いはきちんと指摘できるようになりたいものです。

情報過多

 テレビのニュースを見ていると、アナウンサーの変わり身にときどき驚かされます。

 中東情勢の話をしていると思えば、アメリカ、北朝鮮、と世界一周して、休む間もなくスポーツの話題に変わったりします。

 アナウンサーの方々は、非常に賢いのだと思います。
 あらゆる話題をさも関心があるように話す様は、少し気持ち悪いくらいです(失礼ですみません)。
 個人的には、「私は大相撲に興味ありません」というくらいでもいいと思います。


 現代はあらゆる情報が集まる時代です。いつの間にか大量の情報が押し寄せてくる時代です。
 ですが、頭の中で処理できる情報の量には限りがあると思います。

 大量の情報にさらされていると、目を回してしまいそうになることがあります。情報の海に溺れているような気分です。頭の中で、大量の情報を処理し続けるのは疲れるんです。

 どうせ頭で処理しきれないのだから、少し情報を遮断して、休憩したいなぁなどと思ったりする今日この頃です。



2017年6月11日日曜日

Excel VBAで数学 8

 Excel VBAを使った簡単な数学プログラミングの続きです。

 今回は組み合わせの計算です。
 学校の数学でさんざん考えた記憶がありますが、コンピュータにやらせるとあっさりしたものです。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。

Option Explicit

Dim row As Long


Public Sub Macro()
    Dim N As Long
    Dim m As Long
    Dim num() As Byte
   
    row = 1
   
    N = 5
    m = 3
    ReDim num(m - 1) As Byte
    'nHm num, N, m, 0
    'nPm num, N, m, 0
    nCm num, N, m, 0
End Sub

'nHm
'重複あり組み合わせ
Public Sub nHm(num() As Byte, N As Long, m As Long, pos As Long)
    Dim i As Long
   
    If pos < m Then
        For i = 0 To N - 1
            num(pos) = i + 1
            nHm num, N, m, pos + 1
        Next i
    ElseIf pos = m Then
        For i = 0 To m - 1
            Sheet1.Cells(row, i + 1) = num(i)
        Next i
       
        row = row + 1
    End If
End Sub

'nPm
'順列 (permutation)
Public Sub nPm(num() As Byte, N As Long, m As Long, pos As Long)
    Dim i As Long
    Dim j As Long
   
    If pos < m Then
        For i = 0 To N - 1
            For j = 0 To pos - 1
                If i + 1 = num(j) Then Exit For
            Next j
           
            If j = pos Then
                num(pos) = i + 1
                nPm num, N, m, pos + 1
            End If
        Next i
    ElseIf pos = m Then
        For i = 0 To m - 1
            Sheet1.Cells(row, i + 1) = num(i)
        Next i
       
        row = row + 1
    End If
End Sub

'nCm
'組み合わせ (combination)
Public Sub nCm(num() As Byte, N As Long, m As Long, pos As Long)
    Dim i As Long
    Dim j As Long
   
    If pos < m Then
        For i = 0 To N - 1
            For j = 0 To pos - 1
                If i + 1 <= num(j) Then Exit For
            Next j
           
            If j = pos Then
                num(pos) = i + 1
                nCm num, N, m, pos + 1
            End If
        Next i
    ElseIf pos = m Then
        For i = 0 To m - 1
            Sheet1.Cells(row, i + 1) = num(i)
        Next i
       
        row = row + 1
    End If
End Sub

Excel VBAで数学 7

 Excel VBAを使った簡単な数学プログラミングの続きです。

 今回は円周率の計算です。
 値は知っていても、実際に計算したことがある人は、多くないのではないでしょうか。
 今回は、Machinの公式というのを使っています。計算機がない時代に手計算をしていた人々のことを思うと、感慨深いです。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。

Option Explicit

'piの計算 (Machinの公式)

Public Sub Macro()
    Dim i As Long
    Dim m As Long
    Dim p As Double
    Dim temp As Double
 
    m = 100
 
    temp = 16 / 5
 
    For i = 0 To 3 * m + 2
        p = p + temp / (2 * i + 1)
        temp = -temp / 5 / 5
    Next i
 
    temp = 4 / 239
 
    For i = 0 To m
        p = p - temp / (2 * i + 1)
        temp = -temp / 239 / 239
    Next i
 
    Sheet1.Cells(1, 1) = p
End Sub

Excel VBAで数学 6

 Excel VBAを使った簡単な数学プログラミングの続きです。

 今回はネイピア数です。自然対数の底という言った方が普通な気がします。
 普通のプログラミングだと、変数の型に制限があるので、10桁くらいしか求まりません。もっと桁数を増やすにはテクニックが必要です。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。

Option Explicit

'eの計算

Public Sub Macro()
    Dim i As Long
    Dim e As Double
    Dim temp As Double
   
    e = 1
    temp = 1
   
    For i = 1 To 100
        temp = temp / i
        e = e + temp
    Next i
   
    Sheet1.Cells(1, 1) = e
End Sub

Excel VBAで数学 5

 Excel VBAを使った簡単な数学プログラミングの続きです。

 今回はピタゴラス数です。三平方の定理、ピタゴラスの定理と呼ばれるやつです。
 前回のEuclidの互除法を利用しています。
 (3,4,5) (5,12,13)くらいは有名ですが、(777,464,905)なんかは覚えている人は稀でしょう。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。

Option Explicit

'ピタゴラス数

Public Sub Macro()
    Dim i As Long
    Dim m As Long
    Dim N As Long
    Dim row As Long
   
    row = 1
   
    For i = 1 To 100
        m = 1
        N = 2 * i - 2
       
        Do While m < N
            Sheet1.Cells(row, 1) = m
            Sheet1.Cells(row, 2) = N
           
            If Euclidean(m, N) = 1 Then
                Sheet1.Cells(row, 3) = N * N - m * m
                Sheet1.Cells(row, 4) = 2 * m * N
                Sheet1.Cells(row, 5) = N * N + m * m
            End If
           
            m = m + 1
            N = N - 1
            row = row + 1
        Loop
    Next i
End Sub

Public Function Euclidean(x As Long, y As Long) As Long
    Dim a As Long
    Dim b As Long
    Dim r As Long
   
    If x < y Then
        a = y
        b = x
    Else
        a = x
        b = y
    End If
   
    r = a Mod b
   
    Do While 0 < r
        a = b
        b = r
        r = a Mod b
    Loop
   
    Euclidean = b
End Function


Excel VBAで数学 4

 Excel VBAを使った簡単な数学プログラミングの続きです。

 今回はEuclidの互除法です。
 アルゴリズムの基本という感じがします。実は、次回への布石です。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。

Option Explicit

'Euclidの互除法

Public Sub Macro()
    Dim x As Long
    Dim y As Long
   
    x = 123
    y = 333
   
    Sheet1.Cells(1, 1) = x
    Sheet1.Cells(1, 2) = y
    Sheet1.Cells(1, 3) = Euclidean(x, y)
End Sub

Public Function Euclidean(x As Long, y As Long) As Long
    Dim a As Long
    Dim b As Long
    Dim r As Long
   
    If x < y Then
        a = y
        b = x
    Else
        a = x
        b = y
    End If
   
    r = a Mod b
   
    Do While 0 < r
        a = b
        b = r
        r = a Mod b
    Loop
   
    Euclidean = b
End Function

Excel VBAで数学 3

 Excel VBAを使った簡単な数学プログラミングの続きです。

 今回は完全数です。
 実はこの一連の数学プログラミングは、完全数を探してみたくて始めたものです。6, 28, 496, 8128くらいはすぐ見つかりました。数字が大きくなると計算時間がかかるので、なかなか見つからないです。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。

Option Explicit

'完全数を調べる

Public Sub Macro()
    Dim i As Long
    
    For i = 1 To 100
        Sheet1.Cells(i, 1) = i
        
        If isPerfect(i) Then
            Sheet1.Cells(i, 2) = "Perfect"
        End If
    Next i
End Sub

Public Function isPerfect(x As Long) As Boolean
    Dim i As Long
    Dim sum As Long
    
    isPerfect = False
    sum = 0
    
    For i = 1 To x - 1
        If x Mod i = 0 Then
            sum = sum + i
        End If
    Next i
    
    If sum = x Then
        isPerfect = True
    End If
End Function

Excel VBAで数学 2

 Excel VBAを使った簡単な数学プログラミングの続きです。

 今回は素因数分解です。
 小学校の頃にさんざんやった記憶があります。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。

Option Explicit

'素因数分解

Public Sub Macro()
    Dim i As Long
    Dim j As Long
    Dim f As Collection
    
    For i = 1 To 100
        Sheet1.Cells(i, 1) = i
        Set f = Factorize(i)
        
        For j = 1 To f.count
            Sheet1.Cells(i, j + 1) = f(j)
        Next j
    Next i
End Sub

Public Function Factorize(x As Long) As Collection
    Set Factorize = New Collection
    
    Dim temp As Long
    Dim factor As Long
    
    temp = x
    factor = 2
    
    Do While (factor <= temp)
        If temp Mod factor = 0 Then
            temp = temp \ factor
            Factorize.Add factor
        Else
            factor = factor + 1
        End If
    Loop
End Function

Excel VBAで数学 1

 なんでも学校でのプログラミングの授業が計画されているそうです。文部科学省のWebサイトを覗いてみたら、なかなか高度な内容だったので、びっくりです。
 先生は大変だろうなぁ、などと思っています。

 それはそれとして、Excel VBAで簡単な数学のプログラムを作ってみました。個人的には、こういうプログラムは教育的だと思っています。

 まずは素数の判定プログラムです。
 999611と999613のように双子の素数を見つけたりすると少し楽しいです。
 実際に実行してみると、計算時間を体感できます。例えば10000桁の素数を探すことがいかに大変かが分かります。素数は無限に存在しますが、その意味を体感している感じです。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。

Option Explicit

'素数を調べる

Public Sub Macro()
    Dim i As Long
   
    For i = 1 To 100
        Sheet1.Cells(i, 1) = i
       
        If isPrime(i) Then
            Sheet1.Cells(i, 2) = "Prime"
        End If
    Next i
End Sub

Public Function isPrime(x As Long) As Boolean
    Dim i As Long
    Dim max As Long
   
    isPrime = True
   
    max = CLng(Math.Sqr(x))
   
    For i = 2 To max
        If x Mod i = 0 Then
            isPrime = False
            i = max
        End If
    Next i
End Function



規則正しい生活

「規則正しい生活を心がけなさい」とは、よく言われることです。

 ですが、よくよく考えてみると、規則正しい生活をしているのは、現代人だけなのではないでしょうか?
 毎朝同じ時間に起きて、会社や学校に行って、家に帰って、しばらくしたら寝る。そんな単調な生活を送っているのは、現代人だけな気がします。

 人類が狩猟や農耕をしていた時代、生活は自然のリズムに従っていたはずです。自然のリズムは単調ではなく、晴れた日もあれば、雨の日もあります。生活は不規則を強いられていたでしょう。

 そう考えると、単調すぎる生活よりは、少し不規則な生活の方が、自然に近い生活なのかもしれません。規則正しすぎる生活より、少し不規則な生活の方が、刺激があってよいかもしれません。

 近頃、不規則な生活が続いているせいか、そんなことを考えています。

 もちろん、度が過ぎた不摂生な生活はダメだと思いますが。