점대점 링크 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""점대점 완전 연결(full mesh)의 링크 수·포트 수 검증.

문서: 01.점대점 링크 (카드 C2), 02.다중 접근 링크 (카드 C3), 03.스위칭 네트워크 (카드 C2)
주장 1: 노드 n개를 모든 쌍끼리 점대점으로 이으면 링크는 n(n-1)/2개다.
주장 2: 이때 노드마다 포트(인터페이스)가 n-1개 필요하다.
주장 3: n >= 2이면 n^2/4 <= n(n-1)/2 <= n^2/2 이다 (즉 n^2에 비례해 늘어난다).
방법: n = 0..20에서 노드 쌍을 직접 나열해 센 값과 공식을 비교한다.
"""
from itertools import combinations


def count_links_bruteforce(n: int) -> int:
    return sum(1 for _ in combinations(range(n), 2))


def count_links_formula(n: int) -> int:
    return n * (n - 1) // 2


def port_counts(n: int) -> list[int]:
    ports = [0] * n
    for u, v in combinations(range(n), 2):
        ports[u] += 1
        ports[v] += 1
    return ports


def main() -> None:
    for n in range(0, 21):
        links = count_links_bruteforce(n)
        assert links == count_links_formula(n), n
        ports = port_counts(n)
        assert all(p == n - 1 for p in ports), n
        assert sum(ports) == 2 * links, n  # 링크마다 끝점이 2개
        if n >= 2:
            assert n * n <= 4 * links <= 2 * n * n, n  # n^2/4 <= m <= n^2/2
    print("[OK] n = 0..20: 직접 센 값 = n(n-1)/2, 포트 = n-1, n^2/4 <= m <= n^2/2")

    for n in (0, 1, 2, 4, 5, 8, 10, 100):
        print(f"  n={n:>3}: 링크 {count_links_formula(n):>5}, 노드당 포트 {max(n - 1, 0)}")

    # 01.점대점 링크 예시: 방 4개 -> 선 끝 12개 -> 선 6개, 방 100개 -> 4,950개
    assert sum(port_counts(4)) == 12 and count_links_formula(4) == 6
    assert count_links_formula(100) == 4950
    # 카드 point-to-point-link#C2: n = 8
    assert count_links_formula(8) == 28 and port_counts(8)[0] == 7
    # 카드 multiple-access-link#C3: n = 10 완전 연결 vs 버스
    assert count_links_formula(10) == 45
    # 카드 switched-network#C2: 호스트 6개를 스위치 2개에 3개씩 붙이고 스위치끼리 1개로 연결
    switched_links = 6 + 1
    assert (switched_links, count_links_formula(6)) == (7, 15)
    print(f"  스위치 2개 구성 링크 {switched_links} vs 완전 연결 {count_links_formula(6)}")
    print("ALL CHECKS PASSED")


if __name__ == "__main__":
    main()