知恵袋の群数列の問題をPythonで解いてみた。(3)

 知恵袋の群数列の問題Pythonで解いてみました。(^_^;

1/1,2/2,3/2,4/3,5/3,6/3,7/4,8/4,9/4,10/4…のような分数の列(分母がnである分数はn個あり、分子は1から並べた物を作る。
このとき初項から第200項までの分数の和を求めよ 。

 第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{n}{i}=\frac{\frac{i(i-1)}{2}+j}{i}=\frac{i(i-1)+2j}{2i}
 また、一般項a_{n}は、次式で表すことが出来ます。これを検算用としました。(^_^;
 a_{n}=\frac{n}{i}=\frac{n}{Round(\sqrt{2n})}

 そういえば、今日で300日達成、金市民になるはずです。o(^-^)o

● GrpSeq3.py

# coding: UTF-8
# GrpSeq3.py

from fractions import Fraction
from math import sqrt

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

def main():
    M = 200
    N = Round(sqrt(2*M))
    a = [Fraction(i*(i-1)//2+j,i) for i in range(1,N) for j in range(1,i+1)]
    a+= [Fraction(N*(N-1)//2+j,N) for j in range(1,N+1) if N*(N-1)//2+j<=M]
    print("S= %s"%sum(a))
    # 検算
    b = [Fraction(n,Round(sqrt(2*n))) for n in range(1,M+1)]
    print("S= %s"%sum(b))
    print(a==b)

if __name__ == '__main__':
    main()

●実行結果

S= 5369/4
S= 5369/4
True

Pythonスタートブック

Pythonスタートブック

みんなのPython 第3版

みんなのPython 第3版

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)