センター試験の群数列の問題をPythonで解いてみた。

 センター試験の群数列の問題をPythonで解いてみました。(^_^;

\frac{1}{2}|\frac{1}{3},\frac{2}{3}|\frac{1}{4},\frac{2}{4},\frac{3}{4}|\frac{1}{5},\dots
(1-1)a_{15},(1-2)a.indexOf(\frac{1}{8})
(2)a_{104}
(3)\sum_{n=1}^{103} a_{n}

ただし、途中の式は求めにくいので項や添え字、総和のような値だけ求めました。

 第i群の項数は、i[個]で、群数列の第i群のj番目の項が原数列の第n項だとすると、次式が成り立ちます。
 n=\frac{i(i-1)}{2}+j
 このとき、iとnには、次の関係も成り立ちます。四捨五入して整数化する関数をRound(x)とすると、
 i=Round(\sqrt{2n})=int(\sqrt{2n}+0.5)
 一般項a_{ij}は、次式で表されます。
 a_{ij}=\frac{j}{i+1}=\frac{j}{k}
 ここで、k=i+1で、1≦j≦i=k-1です。
 また、一般項a_{n}は、次式で表すことが出来ます。これを検算用としました。(^_^;
 i=Round(\sqrt{2n}),j=n-\frac{i(i-1)}{2}だから
a_{n}=\frac{j}{i+1}=\frac{n-\frac{Round(\sqrt{2n})(Round(\sqrt{2n})-1)}{2}}{Round(\sqrt{2n})+1}=\frac{n-{}_{Round(\sqrt{2n})}\mathrm{C}_2}{Round(\sqrt{2n})+1}
 ちなみに、第m群のn番目の項までの和Sは、次式のようになります。
 S=\sum_{i=1}^{m-1}\left(\sum_{j=1}^{i}\frac{j}{i+1}\right)+\sum_{j=1}^{n}\frac{j}{m+1}=\frac{1}{4}m(m-1)+\frac{n(n+1)}{2(m+1)}

● GrpSeqCt1.py

# coding: UTF-8
# GrpSeqCt1.py

from fractions import Fraction
from math import sqrt

def Round(x):
    return int(round(x))    # int(x+.5)

def main():
    M = 10000   # 104以上の任意の整数、検算用にちょっと大きめにとる
    N = Round(sqrt(2*M))
    a = ['0/1']
    a+= [str(j)+'/'+str(i+1) for i in range(1,N) for j in range(1,i+1)]
    a+= [str(j)+'/'+str(N+1) for j in range(1,N+1) if N*(N-1)//2+j<=M]
##    print(a)
    s = 0
    for i in range(1,103+1):
        s+= Fraction(a[i])
    print('(1) %s , %d'%(a[15],a.index('1/8')))
    print('(2) %s'%a[104])
    print('(3) %s'%s)

    print(u'//--- 検算 ---//')
    b = []
    for n in range(M+1):
        i = Round(sqrt(2*n))
        j = n-i*(i-1)//2
        b.append(str(j)+'/'+str(i+1))
##    print(b)
    s = 0
    for i in range(1,103+1):
        s+= Fraction(b[i])
    print('(1) %s , %d'%(b[15],b.index('1/8')))
    print('(2) %s'%b[104])
    print('(3) %s'%s)
    print(a==b)

    N = 103
    m = Round(sqrt(2*N))
    n = N-m*(m-1)//2
    s = Fraction(m*(m-1),4)+Fraction(n*(n+1),2*(m+1))
    print(s)

if __name__ == '__main__':
    main()

●実行結果

(1) 5/6 , 22
(2) 13/15
(3) 507/10
//--- 検算 ---//
(1) 5/6 , 22
(2) 13/15
(3) 507/10
True
507/10

※参考URL
大学入試センター試験|解答速報2016|予備校の東進
知恵袋の群数列の問題をPythonで解いてみた。
知恵袋の群数列の問題をPythonで解いてみた。(2)
知恵袋の群数列の問題をPythonで解いてみた。(3)