つぶやきより少しだけ長い何か。

忘れたくない感覚の記録

伝説の良問を子どもと一緒に考えた話。

4月から小学校5年生になる息子は、算数や数学が好きなので、よく一緒に算数や数学の話をする。

 

ところで先日、ツイッターで下記のようなツイートを見かけた。

 

 

京都大学に通われているツイ主さんが、誕生日の日に、京大の二次試験の数学の問題がメッセージプレートに書かれたケーキを親御さんから頂いた、という思い出を語った、微笑ましい話題だ。

 

元ツイートがいつ消えてしまうか分からないので、念のため問題をこちらにも書き写してみよう。

 

自然数nの関数f(n),g(n)を、

f(n)=nを7で割った余り、

g(n)=3f(\sum_{k=1}^7 k^n)

によって定める。

(1)すべての自然数nに対してf(n^7) = f(n)を示せ。

(2)あなたの好きな自然数nを1つ定めてg(n)を求めよ。そのg(n)の値をこの設問(2)におけるあなたの得点とする。

(1995 京都大)

 

ツイ主さんとは年齢が倍以上も異なる私だけど、この問題には実は見覚えがある。自分で好きな数を決めて、その数を関数に当てはめて計算した結果が、問題の得点になるという(2)の設問がユニークで、私も受験勉強で過去問を解いたときに、面白い問題だなと思って記憶に残っていたからだ。

 

20年以上も前に、受験生だったの頃の私が目にした問題が、こうして令和の時代に「伝説の良問」として再度話題に上るのは、なんだか感慨深い。

 

ところでこの問題、おそらく数学的帰納法を使う(1)の証明はともかく、一見奇問に見える(2)については、ちょっと進んだ小学生なら十分に問題の意味は理解できる。うちの子もシグマと階乗くらいなら知っているので、一緒に親子で考えてみた。

 

n=1, n=2, n=0の場合をそれぞれ計算して、答え(=得点)が0になってしまうところまで確認した後、子は「続きは学校で友達と計算してみる!」と書き写した問題を学校に持っていって、同じ塾に通う友達と一緒に考えていたようで、案の定この良問を楽しんでくれて良かった。

 

子が学校から帰ってきた後、今度はg(n)を計算するプログラムを私が組んでみせて、計算した答えが正しいかどうかを確認してみることにした。g(n)を計算するプログラムは、プログラミングを習い始めたばかりの初学者でも、以下のように5~10行程度のプログラムで書ける。

 

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i <= 20; i++) {
            long sum = 0;

            for (int k = 1; k <= 7; k++) {
                long pow = (long) Math.pow(k, i);
                sum = sum + pow;
            }

            long ans = 3 * (sum % 7);
            System.out.println("n = " + i + ", ans = " + ans);
        }
    }
}

 

もしかしたら、小学生が学校から一人一台持たされているパソコンに大抵入っているScratchでも、少し頑張れば書けてしまうので、Scratchに慣れ親しんだお子さんなら、プログラム部分も自分で考えさせてみるのも良いかもしれない。

 

nの値によって、g(n)がどう分布するのか、興味があったので、試しにn=20まで計算させてみたところ、出力結果は下記の通りとなった。

 

n = 1, ans = 0
n = 2, ans = 0
n = 3, ans = 0
n = 4, ans = 0
n = 5, ans = 0
n = 6, ans = 18
n = 7, ans = 0
n = 8, ans = 0
n = 9, ans = 0
n = 10, ans = 0
n = 11, ans = 0
n = 12, ans = 0
n = 13, ans = 9
n = 14, ans = 15
n = 15, ans = 15
n = 16, ans = 12
n = 17, ans = 0
n = 18, ans = 0
n = 19, ans = 9
n = 20, ans = 9

 

つまりは、n=1から順に計算していけば、取り急ぎn=6のときにg(n)が取り得る最大値となる解が見つかることになる。以降は、n=20まで計算しても、最大値となる計算結果にならず、結果の分布にも一見規則性が見られないのは面白い。

 

また、g(n)は結構早い速度で発散するので、g(n)の結果を格納するのに32bitのintを使うと、n=11あたりで早くもintが桁あふれを起こして計算結果がマイナスになってしまう。この辺りを試行錯誤させてみるのもいいプログラミング教育になる気がした。

 

大手塾の算数の偏差値がまだ60を越えたことがないうちの息子くんだけど、こうやってたまに算数や数学の話題を振ったら、ちゃんと面白がって取り組んでくれるのはなかなか頼もしい。今後もネットでちょっとした数学ネタを見つけたら、また親子の会話の話題にしていけたらよいなと思う。

 

f:id:steppapa:20220326103334j:plain