수열과 합의 기호 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""수열과 합의 기호 검증.

문서: 20.수열과 합의 기호 (예시, 정의, 증명, 예제, 카드 C1~C3)
주장 1: Σ_{k=1}^{n} k = n(n+1)/2, Σ k² = n(n+1)(2n+1)/6 (n <= 2,000 전수).
주장 2: 등차수열 합 = 항 수 × (첫 항 + 끝 항)/2, 항 수는 n - m + 1.
주장 3: Σ_{k=3}^{10} (2k + 1) = 112.
주장 4: for i in range(n): for j in range(i): 의 안쪽 실행 횟수는 n(n-1)/2.
        for i in range(n): for j in range(i, n): 은 n(n+1)/2.
주장 5: (k+1)³ - k³ = 3k² + 3k + 1을 더하면 망원합으로 Σk²가 나온다.
"""


def main():
    for n in range(0, 2001):
        assert sum(range(1, n + 1)) == n * (n + 1) // 2
        assert sum(k * k for k in range(1, n + 1)) == n * (n + 1) * (2 * n + 1) // 6
    print("[OK] 주장 1: n <= 2,000 전수")

    for a1 in range(-5, 6):
        for d in range(-3, 4):
            for n in range(1, 30):
                terms = [a1 + (k - 1) * d for k in range(1, n + 1)]
                assert 2 * sum(terms) == n * (terms[0] + terms[-1])
    assert len(range(3, 11)) == 10 - 3 + 1
    print("[OK] 주장 2")

    assert sum(2 * k + 1 for k in range(3, 11)) == 112
    print("[OK] 주장 3·카드 C1: 112")

    for n in range(0, 200):
        c1 = sum(1 for i in range(n) for j in range(i))
        c2 = sum(1 for i in range(n) for j in range(i, n))
        assert c1 == n * (n - 1) // 2 and c2 == n * (n + 1) // 2
    print("[OK] 주장 4·카드 C2: 이중 반복문 횟수")

    for n in range(1, 500):
        telescoped = (n + 1) ** 3 - 1
        assert telescoped == sum((k + 1) ** 3 - k ** 3 for k in range(1, n + 1))
        assert telescoped == 3 * sum(k * k for k in range(1, n + 1)) + 3 * n * (n + 1) // 2 + n
    print("[OK] 주장 5: 망원합")
    print("ALL CHECKS PASSED")


if __name__ == "__main__":
    main()