漢字プリント 数学プリント
問題文
$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()
解説になっているのか?甚だギモンな動画
「高校数学のエアポケット」に戻る