はじめに
この記事は、Python Advent Calendar 2017 12日目の記事です。
ここでやること
PyCon JP 2017の会場でもとてもお世話になった早稲田大学の数学入試問題をPythonで扱います。
※ この記事で扱う問題は、代々木ゼミナール(予備校) | 早稲田大学 基幹理工・創造理工・先進理工の入試問題と解答例(2016年解答速報)から引用しています。
過去の記事
環境
- Python 3.6.3
Sympyとは?
Pythonの記号計算ライブラリ
公式ドキュメント : http://www.sympy.org/en/index.html
日本語資料 : http://www.turbare.net/transl/scipy-lecture-notes/packages/sympy.html
第5問
(1)
- 変数p, q, αをsymbols()を用いて変数定義
- 関数f(x)とg(x)を定義
In [1]: import sympy as sy
In [2]: p, q, α = sy.symbols('p q α', real=True)
In [3]: def f(x):
return x**3+x**2+p*x+q
In [4]: def g(x):
return -1/(x+ 1)
f(x)=0 の任意の解αに足して g(α)も f(x)=0 の解である
とあるので、
- f(α) = 0
- f(g(α)) = 0
- f(g(g(α))) = 0
の3つの式が成り立つことがわかる。
In [5]: c1 = f(α)
In [6]: c2 = f(g(α))
In [7]: c3 = f(g(g(α)))
solve()を用いて、この3つの式からp, q, αの値を求める。
In [8]: sy.solve({c1, c2, c3}, {p, q, α})
Out[8]: [{p: -2,
q: -1,
α: 7**(2/3)*(-2*2**(1/3)/3 + (-4 + 2**(2/3)*(-1 + sqrt(3)*I)*(7 + 21*sqrt(3)*I)**(1/3))*(1 - sqrt(3)*I)*(7 + 21*sqrt(3)*I)**(1/3)/84)/((1 - sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3))},
{p: -2,
q: -1,
α: -7**(2/3)*(2*2**(1/3)/3 + (1 + sqrt(3)*I)*(4 - 2**(2/3)*(-1 - sqrt(3)*I)*(7 + 21*sqrt(3)*I)**(1/3))*(7 + 21*sqrt(3)*I)**(1/3)/84)/((1 + sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3))},
{p: -2,
q: -1,
α: -1/3 + 2**(1/3)*7**(2/3)/(3*(1 + 3*sqrt(3)*I)**(1/3)) + 28**(1/3)*(1 + 3*sqrt(3)*I)**(1/3)/6}]
となるので、(1)の答えは p: -2, q: -1 となる。
これを元にf(x)を再定義しておく。
In [9]: def f(x):
return x**3+x**2-2*x-1
(2)
(2)の証明はグラフによる図示で済ませればよいので、f(x)をmatplotlibを用いて描いてみる。
In [10]: import matplotlib.pyplot as plt
In [11]: import numpy as np
In [12]: x = np.linspace(-2, 2, 100);
In [13]: plt.plot(x, f(x))
Out[13]: [<matplotlib.lines.Line2D at 0x10a735e80>]
-2<x<2の間にy=0となる点が3つあるので、
f(x)=0は-2<x<2の範囲に3つの実数解を持つことがわかる
(3)(4)
とここまではすんなりいけたけど、(3)(4)は正直うまく解けなかった(´・ω・`)
実際の試験だと
2 \cos{\left (2 θ \right )} = 4 \cos^{2}{\left (θ \right )} - 2
2 \cos{\left (3 θ \right )} = 8 \cos^{3}{\left (θ \right )} - 6\cos{\left (θ \right )}
であることを頭に入れて、逆算から式をゴニョっていくのが速い気がする。
ここではせっかくPythonでやるんだから愚直なやり方で解こうと思って、f(x), f(g(x)), f(g(g(x)))に 2*sy.cos(θ) を突っ込んでみたら
In [14]: θ = sy.symbols('θ', positive=True)
In [15]: sy.solve({f(2*sy.cos(θ)), f(g(2*sy.cos(θ))), f(g(g(2*sy.cos(θ))))})
Out[15]: [{θ: -acos(7**(2/3)*(-56*2**(1/3) + 7**(1/3)*(-4 - 2**(2/3)*7**(1/3)*(1 - sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3))*(1 - sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3))/(168*(1 - sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3))) + 2*pi},
{θ: -acos(7**(2/3)*(-56*2**(1/3) + 7**(1/3)*(-4 - 2**(2/3)*7**(1/3)*(1 + sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3))*(1 + sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3))/(168*(1 + sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3))) + 2*pi},
{θ: -acos(-1/6 + 2**(1/3)*7**(2/3)/(6*(1 + 3*sqrt(3)*I)**(1/3)) + 28**(1/3)*(1 + 3*sqrt(3)*I)**(1/3)/12) + 2*pi},
{θ: acos(7**(2/3)*(-2**(1/3)/3 + (-4 + 2**(2/3)*(-1 + sqrt(3)*I)*(7 + 21*sqrt(3)*I)**(1/3))*(1 - sqrt(3)*I)*(7 + 21*sqrt(3)*I)**(1/3)/168)/((1 - sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3)))},
{θ: acos(-7**(2/3)*(2**(1/3)/3 + (1 + sqrt(3)*I)*(4 - 2**(2/3)*(-1 - sqrt(3)*I)*(7 + 21*sqrt(3)*I)**(1/3))*(7 + 21*sqrt(3)*I)**(1/3)/168)/((1 + sqrt(3)*I)*(1 + 3*sqrt(3)*I)**(1/3)))},
{θ: acos(-1/6 + 2**(1/3)*7**(2/3)/(6*(1 + 3*sqrt(3)*I)**(1/3)) + 28**(1/3)*(1 + 3*sqrt(3)*I)**(1/3)/12)}]
となって、うまい感じの出力にはならなかった。
うーん困ったということで、駿台の解答例をカンニングしてみる。
すると、
z = i \sin{\left (θ \right )} + \cos{\left (θ \right )}
2 \cos{\left (θ \right )} = z + \frac{1}{z}
を利用すればよいことがわかる。
これを元に解いてみると、
In [16]: z = sy.symbols('i z')
In [17]: sy.simplify(f(z+1/z))
Out[17]: (z**6 + z**5 + z**4 + z**3 + z**2 + z + 1)/z**3
In [18]: sy.solve(_)
Out[18]: [-cos(pi/7) - I*sin(pi/7),
-cos(pi/7) + I*sin(pi/7),
cos(2*pi/7) - I*sin(2*pi/7),
cos(2*pi/7) + I*sin(2*pi/7),
-cos(3*pi/7) - I*sin(3*pi/7),
-cos(3*pi/7) + I*sin(3*pi/7)]
zに対して6つの解が得られる。
この中から
z = i \sin{\left (θ \right )} + \cos{\left (θ \right )}
というzの形式に沿うものは、
cos(2*pi/7) + I*sin(2*pi/7)
-
cos(4*pi/7) + I*sin(4*pi/7)
<=-cos(3*pi/7) + I*sin(3*pi/7)
-
cos(6*pi/7) + I*sin(6*pi/7)
<=-cos(pi/7) + I*sin(pi/7)
の3つに絞られる。
よって、(4)の答えは θ=2/7π, 4/7π, 6/7π である。
またこの回答から(3)の問の証明もなされる。
おわりに
(3)のような問題は(4)を解くための誘導の意味合いが大きく、人間に最適化されているのでプログラミングで解くのは難しかった!