データ通信や保存の際に、情報の正確性を確保するために用いられる技術に「パリティチェック」と「ハミング符号」があります。これらはエラー検出やエラー訂正に利用され、特に通信システムで重要な役割を果たします。この教材では、これらの基本概念とPythonによる実装を学びます。
パリティチェックは、データが正しく伝送されたかどうかを確認するための単純な方法です。データのビット列に対して、偶数パリティまたは奇数パリティを使用して、追加のビット(パリティビット)を付加します。
以下は、偶数パリティを実装するPythonのサンプルコードです。
def calculate_parity_bit(data):
"""
データの偶数パリティビットを計算する関数
:param data: ビット列(文字列)
:return: パリティビット('0'または'1')
"""
ones_count = data.count('1')
if ones_count % 2 == 0:
return '0' # 偶数なのでパリティビットは0
else:
return '1' # 奇数なのでパリティビットは1
# 使用例
data = "1101001"
parity_bit = calculate_parity_bit(data)
print(f"データ: {data}, パリティビット: {parity_bit}")
calculate_parity_bit
関数は、ビット列を引数として受け取ります。ones_count
は、データ内の'1'の数をカウントします。ハミング符号は、特定のビットのエラーを検出し、訂正するための方法です。ハミング符号は、データビットに冗長ビットを追加して、エラーの位置を特定できるようにします。
ハミング符号を生成するための基本的な手順は次の通りです。
以下は、(7, 4)ハミング符号を生成するPythonのサンプルコードです。
def hamming_encode(data):
"""
ハミング符号を生成する関数 (7, 4)
:param data: データビット(リスト)
:return: ハミング符号(リスト)
"""
# 位置 1, 2, 4 はパリティビットの位置
p1 = data[0] # d1
p2 = data[1] # d2
p3 = data[2] # d3
d1 = data[3] # d4
d2 = data[4] # d5
d3 = data[5] # d6
d4 = data[6] # d7
# パリティビットの計算
p1 = d1 ^ d2 ^ d4 # 1番目のパリティビット
p2 = d1 ^ d3 ^ d4 # 2番目のパリティビット
p3 = d2 ^ d3 ^ d4 # 3番目のパリティビット
return [p1, p2, d1, p3, d2, d3, d4]
# 使用例
data_bits = [1, 0, 1, 1] # d1, d2, d3, d4
hamming_code = hamming_encode(data_bits)
print(f"データビット: {data_bits}, ハミング符号: {hamming_code}")
hamming_encode
関数は、データビットをリストで受け取ります。受信側でエラーを検出し、訂正するためにハミング符号をデコードする必要があります。以下は、ハミング符号のデコード処理を実装したサンプルコードです。
def hamming_decode(hamming_code):
"""
ハミング符号をデコードし、エラーを検出・訂正する関数
:param hamming_code: ハミング符号(リスト)
:return: デコードされたデータビットとエラー位置
"""
p1 = hamming_code[0] # 1番目のパリティビット
p2 = hamming_code[1] # 2番目のパリティビット
p3 = hamming_code[3] # 3番目のパリティビット
# パリティビットのチェック
s1 = p1 ^ hamming_code[2] ^ hamming_code[4] ^ hamming_code[6]
s2 = p2 ^ hamming_code[2] ^ hamming_code[5] ^ hamming_code[6]
s3 = p3 ^ hamming_code[4] ^ hamming_code[5] ^ hamming_code[6]
error_position = s1 * 1 + s2 * 2 + s3 * 4 # エラー位置の計算
if error_position != 0:
print(f"エラー位置: {error_position}")
# エラー訂正
hamming_code[error_position - 1] ^= 1
return hamming_code[2:4] + hamming_code[4:6] # データビットを返す
# 使用例
received_code = [1, 0, 1, 0, 0, 1, 1] # 受信したハミング符号
decoded_data = hamming_decode(received_code)
print(f"デコードされたデータビット: {decoded_data}")
hamming_decode
関数は、ハミング符号を引数として受け取ります。この教材では、パリティチェックとハミング符号の基本概念を学び、Pythonを使用してそれを実装する方法を示しました。これらの技術は、データ通信や保存において非常に重要な役割を果たしており、エラーの検出と訂正の手段として広く利用されています。これを基に、さらなる学習を進めていきましょう。