PR

2021年一橋大学の数学の問題をプログラミングで解いてみました

アイキャッチ画像

2021年の一橋大学の数学の問題が、伝説になると言われているとか言われていないとかで話題になっているようなので、プログラミングで解いてみます。

ターゲット読者

プログラミングと数学の基本的な知識がある人

この記事でわかること

数学の問題がプログラミングで解けるという実感

問題文

1000以下の素数は250個以下であることを示せ。

(2021 一橋大)

自分で考えて解きたい方は、一旦ここでストップして考えてから先を読み進めてください。

考え方

素数が250個以下\( ⇔ \)合成数が750個以上

であるから、合成数が750個以上であることを示す

2の倍数と3の倍数はそれぞれ2と3以外は合成数であるから、1000以下の2の倍数と3の倍数の総数から6の倍数の数と2を引いた数が750個以上であることを示せばよい

750個未満であれば、2の倍数と3の倍数と5の倍数で同様に考える

それでも750個未満であれば、7,11,13などの素数の二乗などを数え上げる


以上を踏まえてプログラミングで解きます。

プログラミングで解く

考え方に従う

<?php

// 1000以下の2の倍数と3の倍数の総数から、6の倍数の数を引く
$number_1 = floor(1000 / 2) + floor(1000 / 3) - floor(1000 / 6);
// 2を引く
echo $number_1 - 2; // 665
echo "\n";

// 1000以下の2の倍数と3の倍数と5の倍数の総数から、6の倍数と15の倍数と10の倍数の総数を引き、30の倍数の数を足す
$number_2 = floor(1000 / 2) + floor(1000 / 3) + floor(1000 / 5) - floor(1000 / 6) - floor(1000 / 15) - floor(1000 / 10) + floor(1000 / 30);
// 3を引く
echo $number_2 - 3; // 731
echo "\n";

?>
665 731

ここから

それでも750個未満であれば、7,11,13などの素数の二乗などを数え上げる

をやるわけですが、プログラミングで解いてる感じはしないですよね。

ちなみに、この考え方は下記の動画で詳しく解説されています。

素数か判定して数え上げる

実は、プログラミングを使えば素数か判定して数え上げるのは容易です。

紹介した考え方は、実際に試験で解く際、人間の計算力や試験時間を考えると時間がかかるから合成数を数えることにしたわけです。

<?php

// 素数の総数を定義
$total = 0;
// 2以上1000以下で繰り返し処理
for ($number = 2; $number <= 1000; $number++) {
    $flg = true;
    // 2以上$number未満の全ての整数で繰り返し処理で$numberを割る
    for ($i =2; $i < $number; $i++) {
        // もし、$numberが割り切れたらループ終了
        if ($number % $i == 0) {
            $flg = false;
            break;
        }
    }
    // 割り切れなかったら素数の総数に1を足す
    if ($flg) {
        $total++;
    }
}

echo $total;

?>

1000以下の素数の数は、

168

これで題意を示せました。

まとめ

一橋大学の数学をプログラミングで解いてみました。

初めに説明した考え方でも解けますが、それは人間が手動でやることを前提としています。

高速な計算が可能なパソコンを使ったプログラミングでは、考え方を工夫せずとも素数が何個か数え上げるプログラムを組めば良いことが分かりますね。