python
import math
import random
def binary_entropy(p):
"""二元随机变量的香农熵,单位bits。"""
if not 0 <= p <= 1:
raise ValueError("p必须位于[0,1]")
if p == 0 or p == 1:
return 0.0
return (
-p * math.log2(p)
-(1-p) * math.log2(1-p)
)
def bsc_capacity(p):
"""
二元对称信道容量。
单位:bits / channel use
"""
return 1 - binary_entropy(p)
def repetition_error(p, n):
"""
n次重复码的多数表决解码错误概率。
n必须是正奇数。
"""
if n < 1 or n % 2 == 0:
raise ValueError("重复次数必须是正奇数")
return sum(
math.comb(n, k)
* p**k
* (1-p)**(n-k)
for k in range(n//2 + 1, n+1)
)
def simulate_repetition(p, n, trials=50000, seed=42):
"""
模拟二元对称信道和n次重复码。
每个编码比特独立翻转。
"""
rng = random.Random(seed)
errors = 0
for _ in range(trials):
original = rng.randint(0, 1)
received = []
for _ in range(n):
noise = int(rng.random() < p)
received.append(original ^ noise)
ones = sum(received)
decoded = int(ones > n//2)
if decoded != original:
errors += 1
return errors / trials
p = 0.10
print("比特翻转概率:", p)
print(
"噪声熵:",
round(binary_entropy(p), 6)
)
print(
"BSC容量:",
round(bsc_capacity(p), 6)
)
print()
print("次数 编码率 理论错误率 模拟错误率")
for n in [1, 3, 5, 7]:
theoretical = repetition_error(p, n)
experimental = simulate_repetition(
p, n, trials=50000, seed=42
)
print(
f"{n:>3} "
f"{1/n:.4f} "
f"{theoretical:.6f} "
f"{experimental:.6f}"
)
assert abs(binary_entropy(0.5) - 1) < 1e-12
assert abs(bsc_capacity(0.5)) < 1e-12
assert abs(repetition_error(0.1, 3) - 0.028) < 1e-12
assert abs(repetition_error(0.1, 5) - 0.00856) < 1e-12