今回は受験シーズンにつき
大学の入試問題をプログラムで解いてみました。

解説動画はこちら

 
一橋大学さんの2021年の数学の入試問題です。

問題は

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

さて
私は偏差値20位しかないので
普通に解いたら解くことはできません。

プログラムの力を使って
強引に解いていきましょう。

まずは1000以下の素数を列挙したれば
個数がわかります。

素数を列挙してみましょう。

素数を判定するプログラムを書いても良いですが
面倒くさいのでライブラリを用います。

Python言語ではsympyという数学計算ライブラリがあり
それを用いると計算はめっちゃ楽です。

isprimeという素数かどうかを判定する
メソッドがあるのでそれを用いましょう。

素数だと判定された数を
リストに格納して個数を数えます。
from sympy import isprime

prime=[]
for i in range(1,1001):
    if isprime(i):
        prime.append(i)
print(len(prime))
168

ということで
250個以下であるということは
わかりましたね。


でもこれだと素数を列挙して
答案用紙に書くのは大変そうですね。

別の解き方も考えてみましょう。

​素数の倍数を挙げ
それが750個以上出れば
素数は250個以下であることが
示ると思います。

それでは素数の小さい方から
その倍数の個数を数えていきましょう。

2が一番小さいですね。
2の倍数で考えると2は素数なので候補ではなく
4から1000まで数えることになります。

こんな感じで2の倍数のリストを
作ることができます。
bai_2 = [i for i in range(4,1001,2)]
len(bai_2)
499

2の倍数の時点で499個ですね
次は3の倍数です。
bai_3 = [i for i in range(6,1001,3)]
len(bai_3)
332

5の倍数もいきましょう。
bai_5 = [i for i in range(10,1001,5)]
len(bai_5)
199

この時点でリストの個数は
len(bai_2 + bai_3 + bai_5)
1030

ということで、リストの個数は
1000個を超えましたが
このリストは重複が含まれています。

プログラム言語では重複を排除する方法として
セットというデータ型を使うことができます。

pythonでは set() でリストをセットに変換できます。
sets = set(bai_2 + bai_3 + bai_5)
print(len(sets))
731


重複を排除したら731個になってしまいました。

7の倍数も追加してみましょう。
bai_7 = [i for i in range(14,1001,7)]
print(len(bai_7))

sets = set(bai_2 + bai_3 + bai_5 + bai_7)
print(len(sets))
141
768

7の倍数を追加すると素数でないものの数が
750を超えました。

ということで素数が250個以下になることが
わかるかと思います。

あとは解答用紙にどう書くかですかね
そこは知りません!!!!!

ということで今回は
数学の問題をプログラムで解いてみました。

プログラムの勉強にはちょうど良い題材ですね。
それでは。