【问题描述】
输入:
(1)GF(2)上的线性移位寄存器的阶数n小于等于10,
(2)反馈函数f(x1,x2,...xn)=C1X1+C2X2+...+CnXn的系数c1,C2,…,Cn
(3)初始状态S0=(a0,a1,...,an-1)中的a0,a1,...,an-1
输出:周期p,以及输出序列
【输入形式】
输入为3行:
第1行:线性移位寄存器的阶数n
第2行:反馈函数的系数
第3行;初始状态
【输出形式】
输出为2行:
第1行:为周期p;
第2行:输出序列(输出n+p位)。
【样例输入】
5
10010
10011
样例输出
31
10011010010000101011101100011111011
#include <iostream>
#include <vector>
class LinearShiftRegister {
private:
int n;
std::vector<int> feedbackCoeffs;
std::vector<int> initialState;
std::vector<int> state;
int period;
std::vector<int> outputSequence;
int calculateFeedback() {
int feedback = 0;
for (int i = 0; i < n; i++) {
feedback += state[i] * feedbackCoeffs[i];
}
return feedback % 2;
}
void updateState(int feedback) {
for (int i = 0; i < n - 1; i++) {
state[i] = state[i + 1];
}
state[n - 1] = feedback;
}
public:
LinearShiftRegister(int n, std::vector<int> feedbackCoeffs, std::vector<int> initialState) {
this->n = n;
this->feedbackCoeffs = feedbackCoeffs;
this->initialState = initialState;
this->state = initialState;
this->period = 0;
}
void generateOutputSequence() {
while (true) {
int feedback = calculateFeedback();
int outputBit = state[0];
outputSequence.push_back(outputBit);
if (isArrayEqual(state, initialState) && period > 0) {
break;
}
updateState(feedback);
period++;
}
outputSequence.pop_back();
outputSequence.insert(outputSequence.end(), initialState.begin(), initialState.end());
}
int getPeriod() {
return period;
}
std::vector<int> getOutputSequence() {
return outputSequence;
}
bool isArrayEqual(std::vector<int> arr1, std::vector<int> arr2) {
if (arr1.size() != arr2.size()) {
return false;
}
for (int i = 0; i < arr1.size(); i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
};
int main() {
int n;
std::cin >> n;
std::vector<int> feedbackCoeffs(n);
std::string feedbackCoeffsInput;
std::cin >> feedbackCoeffsInput;
for (int i = 0; i < n; i++) {
feedbackCoeffs[i] = feedbackCoeffsInput[i] - '0';
}
std::vector<int> initialState(n);
std::string initialStateInput;
std::cin >> initialStateInput;
for (int i = 0; i < n; i++) {
initialState[i] = initialStateInput[i] - '0';
}
LinearShiftRegister lfsr(n, feedbackCoeffs, initialState);
lfsr.generateOutputSequence();
int period = lfsr.getPeriod();
std::vector<int> outputSequence = lfsr.getOutputSequence();
std::cout << period << std::endl;
for (int i = 0; i < outputSequence.size(); i++) {
std::cout << outputSequence[i];
}
std::cout << std::endl;
return 0;
}
1万+

被折叠的 条评论
为什么被折叠?



