拡張ユークリッドアルゴリズム有限ドメイン上の多項式求逆


            ,   C++                ^_^
           
ExEuclid    "<>itemCount; 
	for (int t = 0; t < itemCount; t++)
	{
		static polyNode tmpItem;
		cout<Please input the coef and power:"<>tmpItem.coef>>tmpItem.power;
		poly.push_back(tmpItem);

	}
	SortPolyByPower(poly);
	cout<      :"<::iterator iter="" style="color:#0000ff;">for ( iter = poly.begin();iter!= poly.end();iter++)
	{
		cout<X^"<+";
	}
	cout< PolyAdd(vectorp1,vectorp2)//OK
{
	vector tmpPolyAdd;
	vector::iterator iter1,iter2;
	iter1 = p1.begin();
	iter2 = p2.begin();
	if (p1.size() == 0)
	{
		tmpPolyAdd.clear();
		tmpPolyAdd = p2;
		return tmpPolyAdd;
	}
	else if(p2.size() == 0)
	{
		tmpPolyAdd.clear();
		tmpPolyAdd = p1;
		return tmpPolyAdd;
	}
	else
	{
		tmpPolyAdd.clear();
		for (; iter1 != p1.end() && iter2 != p2.end();)
		{
			if ((*iter1).power > (*iter2).power)
			{
				tmpPolyAdd.push_back(*iter1);
				iter1++;
			}
			else if ((*iter1).power == (*iter2).power)
			{
				polyNode tmp;
				tmp.coef = ((*iter1).coef + (*iter2).coef)%2;
				tmp.power = (*iter1).power;
				if (tmp.coef != 0)
				{
					tmpPolyAdd.push_back(tmp);
				}
				else;
				iter1++;
				iter2++;
			}
			else if ((*iter1).power < (*iter2).power)
			{
				tmpPolyAdd.push_back(*iter2);
				iter2++;
			}
		}
		if (iter2 != p2.end())
		{
			for (;iter2 != p2.end();iter2++)
			{
				tmpPolyAdd.push_back(*iter2);
			}
			SortPolyByPower(tmpPolyAdd);
			return tmpPolyAdd;
		}
		else if(iter1 != p1.end())
		{
			for (;iter1 != p1.end();iter1++)
			{
				tmpPolyAdd.push_back(*iter1);
			}
			SortPolyByPower(tmpPolyAdd);
			return tmpPolyAdd;
		}
		else 
		{
			SortPolyByPower(tmpPolyAdd);
			return tmpPolyAdd;
		}

	}
}

vector PolySub(vectorp1,vectorp2)//OK
{
	vector tmpPolySub;
	vector::iterator iter1,iter2;
	iter1 = p1.begin();
	iter2 = p2.begin();
	for (; iter1 != p1.end() && iter2 != p2.end();)
	{
		if ((*iter1).power > (*iter2).power)
		{
			tmpPolySub.push_back(*iter1);
			iter1++;
		}
		else if ((*iter1).power == (*iter2).power)
		{
			polyNode tmp;
			tmp.coef = ((*iter1).coef - (*iter2).coef)%2;
			tmp.power = (*iter1).power;
			if (tmp.coef != 0)
			{
				tmpPolySub.push_back(tmp);
			}
			else;

			iter1++;
			iter2++;
		}
		else if ((*iter1).power < (*iter2).power)
		{
			tmpPolySub.push_back(*iter2);
			iter2++;
		}
	}
	if (iter2 == p2.end())
	{
		for (;iter1 != p1.end();iter1++)
		{
			tmpPolySub.push_back(*iter1);
		}
	}
	else if(iter1 == p1.end())
	{
		for (;iter2 != p2.end();iter2++)
		{
			tmpPolySub.push_back(*iter2);
		}
	}
	SortPolyByPower(tmpPolySub);
	return tmpPolySub;
}

vector PolyMultiply( vectorp1, vectorp2)//OK
{
	vector tmpPolyMul;
	tmpPolyMul.clear();
	vector itemPoly;
	polyNode tmp;

	vector::iterator iter1,iter2;
	iter1 = p1.begin();
	iter2 = p2.begin();
	for (; iter2 != p2.end(); iter2++)
	{
		for (;iter1 != p1.end(); iter1++)
		{
			tmp.coef = (*iter1).coef * (*iter2).coef;
			tmp.power = (*iter1).power + (*iter2).power;
			itemPoly.push_back(tmp);
		}
		SortPolyByPower(itemPoly);
		iter1 = p1.begin();		
		tmpPolyMul = PolyAdd(tmpPolyMul,itemPoly);
		itemPoly.clear();
	}
	SortPolyByPower(tmpPolyMul);
	return tmpPolyMul;

}

vector PolyDiv(vector&p1, vectorp2)//OK
{
	polyNode tmpItem;
	vector tmpP1 = p1;
	vector tmpP2 = p2;
	static vector result;
	static vector ret;
	vector tmpMultiply;
	vector tmpResult;
	static vector rPoly;

	vector::iterator iter1;
	vector::iterator iter2;
	iter1 = tmpP1.begin();
	iter2 = tmpP2.begin();
	while ((*iter1).power >= (*iter2).power)
	{
		for (;iter2!=tmpP2.end();iter2++)
		{
			tmpItem.coef = abs((*iter1).coef / (*iter2).coef);
			tmpItem.power = (*iter1).power - (*iter2).power;
			tmpResult.push_back(tmpItem);
			result.push_back(tmpItem);

			tmpMultiply = PolyMultiply(p2,tmpResult);
			vector::iterator tmpIter;
			tmpIter = tmpMultiply.begin();
			tmpResult.clear();
			rPoly= PolySub(tmpP1,tmpMultiply);

			p1 = rPoly;
			rPoly.clear();
			return PolyDiv(p1,p2);
		}
	}
	SortPolyByPower(result);
	ret = result;
	result.clear();
	return ret;
}

vector Eculid(vector&mx,vector&bx)//OK
{
	vector a1x;
	vector a2x;
	vector a3x;
	vector a3xcp;

	vector b1x;
	vector b2x;
	vector b3x;

	vector t1x;
	vector t2x;
	vector t3x;

	vector qx;
	vector gcd;
	vector inverse;
	vector::iterator iter;

	static polyNode tmpItem;
	tmpItem.coef = 1;
	tmpItem.power = 0;
	a1x.push_back(tmpItem);
	a3x.clear();
	a3x = mx;

	b1x.clear();
	tmpItem.coef = 1;
	tmpItem.power = 0;
	b2x.push_back(tmpItem);
	b3x = bx;
	do 
	{
		iter = b3x.begin();
		if (b3x.empty())
		{
			cout<No inverse!!!"<else if (b3x.size() == 1 && ((*iter).coef == 1 && (*iter).power == 0))
		{
			inverse = b2x;
			return inverse;
		}
		a3xcp = a3x;
		qx = PolyDiv(a3x,b3x);
		a3x = a3xcp;

		t1x = PolySub(a1x,PolyMultiply(qx,b1x));
		t2x = PolySub(a2x,PolyMultiply(qx,b2x));
		t3x = PolySub(a3x,PolyMultiply(qx,b3x));

		a1x = b1x;
		a2x = b2x;
		a3x = b3x;

		b1x = t1x;
		b2x = t2x;
		b3x = t3x;
	} while (1);

}


int main()
{
	vector polynomial1;
	vector polynomial2;
	vector inverse;
	vector ::iterator iter;
	vector r;
	CreatePoly(polynomial1);
	CreatePoly(polynomial2);
	inverse = Eculid(polynomial1,polynomial2);
	SortPolyByPower(inverse);
	iter = inverse.begin();
	cout<     :"<for (;iter!=inverse.end();iter++)
	{
		cout<X^"<+"<