def generate_m_sequence(taps, initial_state, length):
"""
Генерация M-последовательности с использованием LFSR.
aram taps: список позиций обратных связей
aram initial_state: начальное состояние регистра
aram length: требуемая длина последовательности
:return: сгенерированная последовательность
"""
state = initial_state
m_sequence = []
for _ in range(length):
m_sequence.append(state[-1])
feedback = 0
for tap in taps:
feedback ^= state[-tap]
state = [feedback] + state[:-1]
return m_sequence
def is_m_sequence(sequence):
"""
Проверка, является ли последовательность M-последовательностью.
aram sequence: последовательность для проверки
:return: True, если является M-последовательностью, иначе False
"""
n = len(sequence)
ones = sequence.count(1)
zeros = sequence.count(0)
# Условие для M-последовательности: разница между количеством 1 и 0 должна быть не более 1
if abs(ones - zeros) > 1:
return False
# Проверка цикличности
for i in range(1, n):
if sequence[:i] == sequence[i:i+i]:
return False
return True
# Пример использования:
taps = [1, 6] # Позиции обратных связей (согласно рисунку)
initial_state = [1, 1, 1, 0, 0, 1] # Начальное состояние (согласно рисунку)
length = 6 # Длина требуемой последовательности
m_sequence = generate_m_sequence(taps, initial_state, length)
print("Сгенерированная последовательность:", m_sequence)
print("Является ли последовательность M-последовательностью?", is_m_sequence(m_sequence))