問題文
$m$ を $2015$ 以下の正の整数とする。 ${}_{2015}\mathrm{C}_m$ が偶数となる最小の $m$ を求めよ。(2015 東京大学 理系第5問)
$$32$$
※ この答えは学校側が公表したものではありません。個人が作成した非公式の答えです。
コード
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
#外枠がない座標を使います
fig = plt.figure()
ax = fig.add_subplot(111)
ax.axis("off")
ax.set_aspect('equal')
ax.set_xlim(-9,15)
ax.set_ylim(-7.1,7.1)
ax.set_title("2015東大数学 理系第5問",loc="left",pad=30)
#フォント辞書たち
fdic1 = {
"fontsize" : 20,
"ha" : "center",
"va" : "center",
}
fdic2 = {
"fontsize" : 16,
"color" : "maroon",
"ha" : "center",
"va" : "center",
}
fdic3 = {
"fontsize" : 24,
"color" : "red",
"ha" : "center",
"va" : "center",
}
#2で何回割れるかカウントする関数
def how_many_two(m):
if m%2 == 0:
return how_many_two(m//2)+1
return 0
#二項係数を表示させる関数
def textC(m):
strC = '${}_{2015}\\mathrm{C}_{'+str(m)+'}\\;=$'
img = [ax.text(-6,0,strC,fontdict=fdic1)]
return img
#2015C1のとき
def first_fraction(imgs):
for k in range(31):
img = textC(1)
alpha1 = min(k/10,1)
col1 = (alpha1/2,0,0)
alpha2 = max(min((k-10)/10,1),0)
col2 = (alpha2/2,0,0)
alpha3 = max(min((k-20)/10,1),0)
img += ax.plot([-2,2],[0,0],color="k")
img += [ax.text(3,2,"奇数",
fontdict=fdic2,alpha=alpha1)]
img += [ax.text(0,1,str(2015),
fontdict=fdic1,color=col1)]
img += [ax.text(3,-2,"奇数",
fontdict=fdic2,alpha=alpha2)]
img += [ax.text(0,-1,str(1),
fontdict=fdic1,color=col2)]
img += [ax.text(8,0,"全体も奇数~",
fontdict=fdic3,alpha=alpha3)]
imgs.append(img)
#2015C1のあと、分数を伸ばします
def first_slide(imgs):
for k in range(21):
img = textC(2)
alpha = min(k/20,1)
img += ax.plot([-2,2+3*alpha],[0,0],color="k")
img += [ax.text(0,1,str(2015),
fontdict=fdic1,alpha=1-alpha)]
img += [ax.text(20-17*alpha,1,str(2014),
fontdict=fdic1)]
img += [ax.text(0,1,"$\\cdots\\times$",
fontdict=fdic1,alpha=alpha)]
img += [ax.text(0,-1,str(1),
fontdict=fdic1,alpha=1-alpha)]
img += [ax.text(20-17*alpha,-1,str(2),
fontdict=fdic1)]
img += [ax.text(0,-1,"$\\cdots\\times$",
fontdict=fdic1,alpha=alpha)]
imgs.append(img)
#2015Cmのとき
def check_odd(imgs,m):
p = how_many_two(m)
#mが偶数のとき
if p>0:
case1(imgs,m,p)
#mが奇数のとき
else:
case2(imgs,m)
#mが偶数のときの関数
def case1(imgs,m,p):
for k in range(10*p+31):
img = textC(m)
img += ax.plot([-2,5],[0,0],color="k")
img += [ax.text(0,1,"$\\cdots\\times$",
fontdict=fdic1)]
img += [ax.text(0,-1,"$\\cdots\\times$",
fontdict=fdic1)]
img += [ax.text(3,1,str(2015-m+1),
fontdict=fdic1)]
img += [ax.text(3,-1,str(m),
fontdict=fdic1)]
alpha1 = max(min((k-10*p)/10,1),0)
alpha2 = max(min((k-10*p-10)/10,1),0)
alpha3 = max(min((k-10*p-20)/10,1),0)
#mが32未満のとき
if m<32:
col1 = (alpha1/2,0,0)
col2 = (alpha2/2,0,0)
#mが32になったとき
elif m==32:
col1 = (0,0,alpha1/2)
col2 = (alpha2/2,0,0)
r=1
while r<min(p+1,np.ceil(k/10)+1):
if r<min(p,np.ceil(k/10)):
img += [ax.text(3,1+1.5*r,str(int((2015-m+1)/2**r)),
fontdict=fdic1)]
img += ax.plot([1.5,4.5],[1+1.5*(r-1),1+1.5*(r-1)],
color="k")
img += [ax.text(3,-1-1.5*r,str(int(m/2**r)),
fontdict=fdic1)]
img += ax.plot([1.5,4.5],[-1-1.5*(r-1),-1-1.5*(r-1)],
color="k")
else:
alpha0 = max(min((k-10*r+10)/10,1),0)
img += [ax.text(3,1+1.5*r,str(int((2015-m+1)/2**r)),
fontdict=fdic1,alpha=alpha0,color=col1)]
img += ax.plot([1.5,1.5+3*alpha0],[1+1.5*(r-1),1+1.5*(r-1)],
color="k")
img += [ax.text(3,-1-1.5*r,str(int(m/2**r)),
fontdict=fdic1,alpha=alpha0,color=col2)]
img += ax.plot([1.5,1.5+3*alpha0],[-1-1.5*(r-1),-1-1.5*(r-1)],
color="k")
r=r+1
#mが32未満のとき
if m<32:
img += [ax.text(6,2+1.5*(r-1),"奇数",
fontdict=fdic2,alpha=alpha1)]
img += [ax.text(6,-2-1.5*(r-1),"奇数",
fontdict=fdic2,alpha=alpha2)]
img += [ax.text(11,0,"全体も奇数~",
fontdict=fdic3,alpha=alpha3)]
#mが32になったとき
if m==32:
img += [ax.text(6,2+1.5*(r-1),"偶数",
fontdict=fdic2,alpha=alpha1,color="navy")]
img += [ax.text(6,-2-1.5*(r-1),"奇数",
fontdict=fdic2,alpha=alpha2)]
img += [ax.text(11,0,"全体は偶数!\n\nヽ(・ω・)ノ\n\nヤッタ-----",
fontdict=fdic3,alpha=alpha3,color="blue")]
imgs.append(img)
#mが奇数のときの関数
def case2(imgs,m):
for k in range(31):
img = textC(m)
alpha1 = min(k/10,1)
col1 = (alpha1/2,0,0)
alpha2 = max(min((k-10)/10,1),0)
col2 = (alpha2/2,0,0)
alpha3 = max(min((k-20)/10,1),0)
img += ax.plot([-2,5],[0,0],color="k")
img += [ax.text(3,1,str(2015-m+1),
fontdict=fdic1,color=col1)]
img += [ax.text(0,1,"$\\cdots\\times$",
fontdict=fdic1)]
img += [ax.text(3,-1,str(m),
fontdict=fdic1,color=col2)]
img += [ax.text(0,-1,"$\\cdots\\times$",
fontdict=fdic1)]
img += [ax.text(6,2,"奇数",
fontdict=fdic2,alpha=alpha1)]
img += [ax.text(6,-2,"奇数",
fontdict=fdic2,alpha=alpha2)]
img += [ax.text(11,0,"全体も奇数~",
fontdict=fdic3,alpha=alpha3)]
imgs.append(img)
#本番
imgs=[]
first_fraction(imgs)
first_slide(imgs)
for i in range(1,32):
m = i+1
check_odd(imgs,m)
mov=ani.ArtistAnimation(fig, imgs, 100)
plt.show()