대역폭-지연 곱 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""대역폭-지연 곱(BDP) 계산 검증.

문서: 28.대역폭-지연 곱 (예시, 카드 C1·C3)
정의: BDP = R x d_prop (비트). 첫 비트가 도착한 순간 링크 위에 떠 있는 비트 수의 상한.
주장: 첫 비트가 도착한 순간 프레임이 링크(파이프)를 채운 비율 = min(1, L / BDP).
보충: 한 번에 프레임 하나를 보내고 답을 기다리면 링크 사용률 = (L/R) / (L/R + RTT).
단위: 시간은 초, Mbps = 10^6 bps.
"""
from fractions import Fraction as F


def bdp(R_bps, d_prop_s):
    return R_bps * F(d_prop_s)


def bits_on_link_when_first_bit_arrives(L, R_bps, d_prop_s):
    """시각 d_prop에 링크 위에 있는 프레임의 비트 수 (직접 계산)."""
    sent = min(L, R_bps * F(d_prop_s))  # d_prop 동안 실은 비트
    arrived = 0  # 첫 비트가 막 도착
    return sent - arrived


def main():
    d = F(1, 1000)  # 1 ms
    L = 12_000
    # 링크 1: 10 Mbps
    b1 = bdp(10**7, d)
    on1 = bits_on_link_when_first_bit_arrives(L, 10**7, d)
    assert b1 == 10_000 and on1 == 10_000 and on1 / b1 == 1 and L - on1 == 2_000
    # 링크 2: 100 Mbps
    b2 = bdp(10**8, d)
    on2 = bits_on_link_when_first_bit_arrives(L, 10**8, d)
    assert b2 == 100_000 and on2 == 12_000 and on2 / b2 == F(12, 100)
    for R in (10**6, 10**7, 10**8, 10**9):
        assert bits_on_link_when_first_bit_arrives(L, R, d) / bdp(R, d) == min(1, F(L) / bdp(R, d))
    print("[OK] 예시: 10 Mbps -> 파이프 100% (A에 2,000비트 남음), 100 Mbps -> 12%")

    # 카드 C1: 1 Gbps, 50 ms
    c1 = bdp(10**9, F(50, 1000))
    assert c1 == 50_000_000 and c1 / 8 == 6_250_000
    print("[OK] 카드 C1: 5 x 10^7비트 = 6,250,000바이트")

    # 카드 C3: 한 프레임씩 보내고 기다리기, RTT 2 ms
    def util(L, R, rtt):
        t = F(L, R)
        return t / (t + rtt)
    u10 = util(12_000, 10**7, F(2, 1000))
    u100 = util(12_000, 10**8, F(2, 1000))
    assert u10 == F(3, 8) and round(float(u100), 3) == 0.057
    print(f"[OK] 카드 C3: 10 Mbps {float(u10):.1%}, 100 Mbps {float(u100):.1%}")
    print("ALL CHECKS PASSED")


if __name__ == "__main__":
    main()