회선 스위칭 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""회선 스위칭에서 파일 전송 시간 계산 검증.

문서: 06.회선 스위칭 (예제, 카드 C3)
가정: 링크가 TDM으로 칸 k개로 나뉘고 회선 하나가 칸 하나를 쓴다. 전파 지연은 무시한다.
  회선 전송률 = 링크 전송률 / k
  총 시간 = 회선 설정 시간 + 파일 크기 / 회선 전송률
"""
from fractions import Fraction as F


def transfer_time(bits: int, link_rate: int, slots: int, setup: F):
    rate = F(link_rate, slots)
    return rate, setup + F(bits) / rate


def main() -> None:
    # 예제 (Kurose & Ross 1.3절의 예제와 같은 수치)
    rate, total = transfer_time(640_000, 1_536_000, 24, F(1, 2))
    assert rate == 64_000 and total == F(21, 2)
    print(f"예제: 회선 {rate} bps, 총 {float(total)} s")

    # 쉬는 시간의 낭비: 1 Mbps 링크를 100 kbps 회선으로 나누면 10명, 10%만 보내면 90%가 빔
    assert 1_000_000 // 100_000 == 10
    print("반례: 1 Mbps / 100 kbps = 10명, 활동 10%면 예약 용량의 90%가 빈다")

    # 카드 circuit-switching#C3
    rate, total = transfer_time(800_000, 3_072_000, 48, F(1, 4))
    assert rate == 64_000 and total == F(51, 4)
    # 흔한 오답: 링크 전체 전송률로 나눈 값
    wrong = F(1, 4) + F(800_000, 3_072_000)
    assert round(float(wrong), 2) == 0.51
    print(f"카드 C3: 회선 {rate} bps, 총 {float(total)} s (오답 {float(wrong):.2f} s)")
    print("ALL CHECKS PASSED")


if __name__ == "__main__":
    main()