序論的なお気持ち表明
最近、世の中はChatGPTでにぎわっていて、どの界隈でもある程度はそれを有効活用しようという流れが見られるような気がします。しかし、特に学業の世界では、そのような手法は禁忌とされ避けられています。例えば、様々な大学がレポートの利用に禁止、または非推奨の立ち場をとっています。
しかし、私たちは本当はあるべきものを積極的に利用していくべきではないでしょうか。つまり保守になりすぎず、システムやその背景にある技術知識を身につけ、そのうえできちんとメリデメを判断すべきではないでしょうか。という軽いぼやきです。
大学入試の問題の難しさは「制限時間」と「手計算」というところにあると思います。そこで、安逸ですが、単純な計算を任せたら早く、答えのみを得るという点において有用だと考えました。特に有効なのはプログラミングを知らない層でも扱えることです。今回はpythonを使っているので、Google Colabなどを使えば環境構築すら必要ありません。
part1は整数や解析の問題を中心にまとめました。今後も少しずつ問題を追加していこうと思います。
0:前提条件
ChatGPT model-4
使用言語:英語(English)
出力形式:"export python code"
1:2005年東京大学(前期)
【問題】
$3 \leq a \leq 9999$を満たすような奇数$a$について$a^2-a\equiv 0(\text{mod}10000)$を満たすものをすべて求めよ
やや表現を改めました。この程度なら単純な繰り返しで書くのが筋でしょう。
【コード】
solutions = []
for a in range(3, 10000, 2):
if (a**2 - a) % 10000 == 0:
solutions.append(a)
for solution in solutions:
print(solution)
【出力結果】
625
答えが存在するというのを前提にしているため、答えが見つからなかった場合の出力は特に考えていません。
2:2022年北海道大学(後期)
注意しなければいけないのは、正の整数だけではなく、負の整数も答えとしてありえます。(考慮し忘れていたので、一度プロンプトを打ち直しました)
また、探索する範囲についても極端に大きい値をとらなくても、実際には「手計算」で解かないといけないことを考えればさほど大きい値になるはずがありません。
【コード】
max_value = 100
min_value = -100
solutions = []
for a in range(min_value, max_value + 1):
for b in range(a, max_value + 1):
for c in range(b, max_value + 1):
S = a**3 + b**3 + c**3 - 3*a*b*c
if S == 63:
solutions.append((a, b, c))
for solution in solutions:
print(solution)
【出力結果】
(-2, 2, 3)
(-1, 0, 4)
(6, 7, 8)
正解です。しかし、多重ループは読みづらいですし、計算量があるため、絶対値$10^3$程度で少し遅いなとなりました。そこで追加で質問しました。
【コード2】
import itertools
max_value = 100
min_value = -100
values = list(range(min_value, max_value + 1))
solutions = []
for a, b, c in itertools.combinations_with_replacement(values, 3):
S = a**3 + b**3 + c**3 - 3*a*b*c
if S == 63:
solutions.append((a, b, c))
for solution in solutions:
print(solution)
たしかに改善されていますね。事前に"readble"などと説明しておくといいのかもしれません。
3:2019年東京大学
【問題】
次の積分を求めよ
$$\int_{0}^1 \left(x^2+\dfrac{x}{\sqrt{1+x^2}}\right)\left(1+\dfrac{x}{(x^2+1)\sqrt{1+x^2}}\right)$$
【コード】
from scipy.integrate import quad
import numpy as np
def f(x):
return x**2 + x/np.sqrt(1 + x**2)
def g(x):
return 1 + x/((x**2 + 1)*np.sqrt(1 + x**2))
def h(x):
return f(x) * g(x)
integral_value, error = quad(h, 0, 1)
print(f"The integral value is {integral_value}. The estimated error is {error}.")
【出力結果】
The integral value is 1.0115663209647952. The estimated error is 1.1230642204704767e-14
estimated errorは推定誤差のことです。
想定解は
$$\dfrac{\pi}{8}+\dfrac{5\sqrt{2}}{2}-\dfrac{35}{12}$$
なのですが、これをwolfram-alphaで近似計算すると
$$1.0115663209647951101453855667675163902821591966975917438969007523$$
となります。ほとんど誤差がないといっても過言ではないでしょう。
所感と検討
以上で簡単な実験を終わります。
ただ、pythonで実装していますが、ほかの言語のほうが適していたりする場合ももちろんあると思います。また、いくつかの入試問題は競プロのようなアルゴリズムを考えることで解けるでしょう。
考えられるプロンプトの工夫としては、事前にこちらで次のようなことを指定することでしょう。
・入力形式、出力形式、制約条件
・言語や使う(と想定される)ライブラリ
・アルゴリズムなどの具体的なアイディア
すると、(人間よりも)意図を組んだものを出力してくれます。使い方次第では、入試も変わっていくのかもしれませんね。