複天一流:どんな手を使ってでも問題解決を図るブログ

宮本武蔵の五輪書の教えに従い、どんな手を使ってでも問題解決を図るブログです(特に、科学、数学、工学の問題についてですが)

東大数学2024問題6 (part 8): gnuplotで条件に合致する領域を塗ってみる

前回のあらすじ

しばらく前になるが、問題6の前半部分を解析的、および数値的に解いた。後半部分は、前半部分の応用であるからあまりおもしろくない、と思っていたのだが、gnuplotの練習の観点から少し面白そうなネタありそうだったので、取り上げてみることにする。

後半部分

後半部分は、考える関数が「若干」一般化され、整数$a,b$を用いて \begin{equation}g(x)=x^3+ax^2+bx=x(x^2+ax+b)\end{equation}となる。問題の前半は$a=10, b=20$という特別な場合を考えていたのであった。後半でも、$x\rightarrow n\in \mathbb{Z}$としたときに、$g(n)$が素数になる場合について考えさせる問題である。$g(n)$が素数になるケースは、問題前半で検討したように、4つの場合が存在する。ただし、以下では因数分解したときの二次関数の部分を$k(x)=x^2+ax+b$と表すことにする。

  1. $x=1$, かつ$k(1)>0$が素数になる場合
  2. $x=-1$, かつ$k(-1)<$が負の符号がついた素数($-p$)になる場合
  3. $p$を素数とする。$x=p>0$に対して$k(p)=p^2+ap+b =1$となる場合
  4. $x=-p <0$に対して$k(-p)=p^2-ap+b=-1$となる場合。

この4つの場合の組み合わせを丁寧に追いかければ証明はできるはずである。とはいえ、いろいろな組み合わせが発生するので、取りこぼしがないように気をつけねばならない。

最初のケース

まずは3.のケースを考えたい。$k(p)=1$となるような素数$p$が見つかるかどうかである。これは$p$についての2次方程式を解くことになるので、一般解は解の公式を用いて \begin{equation} p = \frac{-a\pm\sqrt{a^2-4(b-1)}}{2} \end{equation} と「形式的」にかける。もちろん、このままでは複素数だったり、無理数を一般的に許すことになるので、制限を課さねばならない。

絶対にまずいのが、複素数になってしまう場合である。これを避けるために判別式(つまり平方根の中身)が正値あるいは零値をもつことを課さねばならない。すなわち最初の条件式は \begin{equation} a^2-4(b-1) \ge 0 \rightarrow b \le \frac{a^2}{4}+1 \end{equation} である。この条件式を満たす$(a,b)$ならば, 素数$p$が複素数になってしまうことはない(笑)。

次は無理数にならない条件などを考えたいところだが、ちょっと面倒なので、まずは素数が正数であるという定義から攻めることにしよう。ここで考えるのは、2次方程式の2つの解が両方とも正値をとるための条件である。片方だけ正値ということはあるかもしれないが、まずは両方ともに正値になる場合について考えてみる。 \begin{equation} -a\pm\sqrt{a^2-4(b-1)} > 0 \rightarrow -a > \sqrt{a^2-4(b-1)} > a \end{equation} $a>0$の場合は成立しないので、$a=-a'<0$の場合だけを考える。すなわち \begin{equation} a' > \sqrt{a'^2-4(b-1)} > -a' \end{equation} 右側の不等式は自明な関係式なので、条件式としては利用できない。左側の不等式を自乗して整理すると \begin{equation} b > 1 \end{equation} という条件式が手に入る。

gnuplotの出番

ここで、gnuplotの出番である。3.のケースが2つの素数を許す「必要条件」として次の3つが浮かび上がった。 \begin{align} a &<0 \\ b & > 1\\ b &\le \frac{a^2}{4}+1 \end{align} 我々が興味あるのは、この領域を図示するにはどうすればよいかというgnuplotの問題である。まずはそれぞれの領域を塗りつぶし、重ね塗りすることで対応する領域を見つけ出したい。

いろいろ検索すると、弘前大学の相対論グループが発表しているgnuplotマニュアルが役立ちそうである。

まずは上の条件式のなかに含まれる放物線$b=a^2/4+1$を描いてみよう。今回は、座標軸も描き入れてみよう。

unset key
unset arrow

set size square
set grid

f(x)=x**2/4.+1

xmax=5; xmin=-5
ymax=8; ymin=-2
set arrow from xmin,0 to xmax,0 lw 2
set arrow from 0,ymin to 0,ymax lw 2

plot [xmin:xmax][ymin:ymax] f(x) lw 2

この放物線の下側の領域が3.の場合の2つの解が実数となる領域に対応する。塗りつぶすには次のようにする。

plot [xmin:xmax][ymin:ymax] f(x) w filledcurves y=ymin fc "#114422"

この「塗り絵」はちょっと重苦しいので、透明度を上げて印象を軽くしよう。

set style fill transparent solid 0.2
...
plot [xmin:xmax][ymin:ymax] f(x) w filledcurves y=ymin fc "#114422", f(x) w l lw 3

を付け足すとよい。 境界線の放物線グラフを際立たせるために「2度描き」していることに注意。

次は2次方程式の解が2つとも正になるための2つ目の条件$b>1$を取り込もう。$1<b<\text{ymax}$の部分を塗りつぶせば良いので、

plot [xmin:xmax][ymin:ymax] \
     f(x) w filledc y=ymin fc "#114422",\
     1 w filledc y=ymax fc "#114422",\
     f(x) lw 2 lt 2, \
     1 lw 2 lt 2

となる。重ね塗りされた部分が正しい領域になる。

最後に$a<0$を取り込む。描画領域を負の領域と正の領域に分ける必要があり、このためにはサンプリングのテクニックを使う。サンプリングはplot sampleで実現できる。具体的には次のようにする。

plot [xmin:xmax][ymin:ymax] sample \
     [xmin:xmax] f(x) w filledc y=ymin fc "#114422",\
     [xmin:xmax] 1 w filledc y=ymax fc "#114422",\
     [xmin:00] ymax w filledc y=ymin fc "#114422",\
     [xmin:xmax] f(x) lw 2 lt 2, \
     [xmin:xmax] 1 lw 2 lt 2

4行目の定義域が「部分的」、つまり負の領域だけが指定されている。つまりsampleによって定義域を分割(sampling)することができるのである。表示結果は次のような感じになる。流石に3重塗りだとよくわからなくなってくる。

2つの関数グラフに挟み込間れた部分だけを塗る

gnuplotは「挟み込んだ領域」を塗りつぶす命令をもっているのでそれを利用する。上の場合は、挟み込む領域が放物線と$y=ymin$だったので、放物線と$y=1$に変えればよいだけである。

plot [xmin:xmax][ymin:ymax]  f(x) w filledc y=1 fc "#114422",\
     f(x) lw 2, 1 lw 2 lt 2

最後にsampleのテクニックを盛り込んで完了である。随分簡単に描ける。

plot [xmin:xmax][ymin:ymax] sample \
     [xmin:0] f(x) w filledc y=1 fc "#114422", f(x) lw 2, 1 lw 2 lt 2

ちょっとだけ数学の問題に戻ってみる

さて、問題を解くという観点に少しだけ戻ってみよう。

塗りつぶされた領域のどこでも良いわけではなく、整数の格子点だけが許されることに注意しなくてはならない。このグラフに含まれている部分だけを抜き出せば、(a,b)=(-5,0),(-4, 0), (-3,0), (-2, 0), (-1,0), (0,0); (-5,1),(-4,1),(-3,1),(-2,1); (-5, 2), (-4,2),(-3,2),(-2,2); (-5,3),(-4,3), (-3,3); (-5,4),(-4,4), (-5,5),(-5,4),(-5,6),(-5,7)が候補となる。これらの値を$k(n)$に代入したときに、素数となるようケースが見つかるだろうか?(つづく)