📄 polynomial.cpp
字号:
// Polynomial.cpp: implementation of the Polynomial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Polynomial.h"
#include <windows.h>
#include <iostream>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Polynomial::Polynomial()
{
}
Polynomial::~Polynomial()
{
}
Polynomial Polynomial::operator =(const char *str)
{
Polynomial poly;
for (int i = 0; i < strlen(str); i++)
if (str[i] == '1')
poly.coeff.push_back(1);
else
poly.coeff.push_back(0);
if (str[i-1] != '1')
exit(0);
coeff = poly.coeff;
return poly;
}
Polynomial Polynomial::operator /(const Polynomial beDevid)
{
Polynomial shang;
bvec shift_reg;
bvec back_reg;
//移位寄存器的位数为被除式的次数
shift_reg.resize(beDevid.Degree());
back_reg.resize(beDevid.Degree());
//商的次数
shang.Resize(Degree() - beDevid.Degree() + 1);
if (Degree() - beDevid.Degree() + 1 <= 0)
{
return shang;
}
//清0
for (int i = 0; i < beDevid.Degree(); i++)
{
shift_reg[i] = back_reg[i] = 0;
}
//需要A(x) 次数加1次节拍完成计算
for (i = 1;i <= Degree()+1; i++)
{
//第0位积存器连接
shift_reg[0] = (coeff[Degree() - i+1] + back_reg[beDevid.Degree() - 1] )%2;
for (int j =1 ;j < beDevid.Degree(); j++)
{
if (beDevid.coeff[j] == 1)
shift_reg[j] = (back_reg[j-1] + back_reg[beDevid.Degree() - 1]) % 2;
else
shift_reg[j] = back_reg[j-1];
}
//线性反馈移位寄存器连接完毕.等待输出
if (i >= beDevid.Degree() + 1)
shang.coeff[shang.Degree() - (i-beDevid.Degree() - 1)] = back_reg[beDevid.Degree() - 1];
//拷贝.触发寄存器
back_reg = shift_reg;
}
return shang;
}
Polynomial Polynomial::operator *(const Polynomial B)
{
Polynomial ji;
ji.Resize(Degree() + B.Degree() + 1);
bvec shift_reg,back_reg;
shift_reg.resize(B.Degree());
back_reg.resize(B.Degree());
//LFSR清0
for (int i = 0;i < B.Degree(); i++)
shift_reg[i] = back_reg[i] = 0;
bit a; //A(X)输入
int j;
//通过本多项式每一项乘beSub
for ( i = Degree()+B.Degree();i >= 0; i--)
{
if (i-B.Degree() <= Degree())
{
a = coeff[i-B.Degree()];
//第0项LFSR连接
shift_reg[0] = a;
}
else
a = 0;
//连接LFSR
for ( j = 1; j < B.Degree(); j++)
{
if (B.coeff[j] == 1)
shift_reg[j] = (back_reg[j-1] + a) % 2;
else
shift_reg[j] = back_reg[j-1];
}
ji.coeff[i] = (back_reg[j-1] + a) % 2;
//触发寄存器
back_reg = shift_reg;
}
return ji;
}
//二进制,加减法一样
Polynomial Polynomial::operator +(const Polynomial beSub)
{
Polynomial poly;
poly = *this + beSub;
return poly;
}
Polynomial Polynomial::operator -(const Polynomial beSub)
{
Polynomial poly;
poly.coeff.resize(max(beSub.Degree(), Degree()) + 1);
Polynomial big;
Polynomial sm;
if (Degree() > beSub.Degree())
{
big = *this;
sm = beSub;
}
for (int i = big.Degree(); i >= 0; i--)
{
poly.coeff[i] = big.coeff[i];
if (i <= sm.Degree())
{
if (big.coeff[i] == sm.coeff[i])
poly.coeff[i] = 0;
}
}
//去掉头的0
for (i = poly.Degree() ;i >=0;i --)
{
if (poly.coeff[i] == 0)
poly.coeff.resize(big.Degree());
}
return poly;
}
int Polynomial::Degree() const
{
return coeff.size() - 1;
}
Polynomial Polynomial::operator =(const Polynomial beEqual)
{
Polynomial poly;
poly.coeff = beEqual.coeff;
coeff = beEqual.coeff;
return poly;
}
void Polynomial::Resize(int n)
{
coeff.resize(n);
for (int i = 0;i < n ; i++)
coeff[i] = 0;
}
void Polynomial::Output()
{
for (int i = Degree();i >= 0; i--)
{
if (coeff[i] == 1)
cout << "x^" << i;
if (i != 0)
cout << "+";
}
cout << endl;
}
Polynomial Polynomial::operator %(const Polynomial beDevid)
{
Polynomial yushi;
bvec shift_reg;
bvec back_reg;
//移位寄存器的位数为被除式的次数
shift_reg.resize(beDevid.Degree());
back_reg.resize(beDevid.Degree());
//商的次数
if (Degree() - beDevid.Degree() + 1 <= 0)
{
yushi = *this;
return yushi;
}
//清0
for (int i = 0; i < beDevid.Degree(); i++)
{
shift_reg[i] = back_reg[i] = 0;
}
//需要A(x) 次数加1次节拍完成计算
for (i = 1;i <= Degree()+1; i++)
{
//第0位积存器连接
shift_reg[0] = (coeff[Degree() - i+1] + back_reg[beDevid.Degree() - 1] )%2;
for (int j =1 ;j < beDevid.Degree(); j++)
{
if (beDevid.coeff[j] == 1)
shift_reg[j] = (back_reg[j-1] + back_reg[beDevid.Degree() - 1]) % 2;
else
shift_reg[j] = back_reg[j-1];
}
//拷贝.触发寄存器
back_reg = shift_reg;
}
yushi.coeff = back_reg;
return yushi;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -