⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 polynomial.cpp

📁 (31,21) bch 码编解码程序 C++实现.
💻 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 + -