当前位置:服务支持 >  软件文章 >  Mini MATLAB代码:简化版MATLAB开发实践

Mini MATLAB代码:简化版MATLAB开发实践

阅读数 175
点赞 21
article_banner

(终有一天,我们能够实现matlab等软件的国产化!我们能够赶超世界先进水平!)

(并赋诗一首)//把OOP的小作业做成了大作业,哈哈哈

九章功成有怀

纵马二十狂,挥洒五千行。

星烛凌旭日,红火胜骄阳。

#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<windows.h>
using namespace std;
const int mod=10000;//位数
const int maxn=80;//最大长度
const int maxl=20;//最大阶数
const int maxmat=18;// 最大阶数
const int blank=5;//空格个数
const int maxx=100;
int shuwei=20;//保存有效数位
const int maxheng=60;//分割线长度
long long base[19]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000,10000000000000,100000000000000,1000000000000000,10000000000000000,100000000000000000,1000000000000000000};
class pmatrix;
class polynomial;
void fenge()
{
	for(int i=1;i<=maxheng;i++)
	cout<<"-";
	cout<<endl;
}
int transint(string x)
{
	int ans=0;
	if(x.at(0)=='-'){
	for(int i=1;i<=x.length()-1;i++)  ans=ans*10+int(x.at(i))-int('0');
	ans=-ans;
    }
	else {
	for(int i=0;i<=x.length()-1;i++)  ans=ans*10+int(x.at(i))-int('0');
	}
	return ans;
}

class longx{
public:
	int p[maxn];
	int len;
	int hao;
	string name;
	longx(){memset(p,0,sizeof(p));len=1;hao=1;}
    longx(long long x)
    {
    	memset(p,0,sizeof(p));
		if(x<0) {
    	hao=-1;x=-x;
		}else hao=1;
    	len=0;
    	while(x>0)
    	{
    		len++;
    		p[len]=x%mod;x/=mod;
		}
		if(len==0) len++;
	}

   friend istream& operator>>(istream& in,longx& longx_);
   friend ostream& operator<<(ostream& in,const longx& longx_);

    void input(string x)
    {
    hao=1;int t=x.length(),g=t;
	if(x.at(0)=='-')  { hao=-1;t--;}
	int n=t/4,m=t%4;
     	if(m==0)
     	{len=n;	for(int i=1;i<=n;i++) p[i]=transint(x.substr(g-4*i,4));}
     	else
     	{
     		len=n+1;
     		for(int i=1;i<=n;i++) p[i]=transint(x.substr(g-4*i,4));
     		p[len]=transint(x.substr(g-t,m));
		 }
	}

	int transtoint()
	{
		int ans=0,base=1;
	    for(int i=1;i<=len;i++)
	    {
	       ans+=p[i]*base;base*=10000;
		}
		return ans;
	}

    void trans(string x)
    {
	int t=x.length();//cout<<"ee"<<x<<"ee";
	while(x.at(0)=='0'&&t>1) //除去前导零
	{x.erase(0,1);t--;}//cout<<x;
	int g=t;
	if(x.at(0)=='-')  { hao=-1;t--;}
	int n=t/4,m=t%4;
     	if(m==0)
     	{len=n;	for(int i=1;i<=n;i++) p[i]=transint(x.substr(g-4*i,4));}
     	else
     	{
     		len=n+1;
     		for(int i=1;i<=n;i++) p[i]=transint(x.substr(g-4*i,4));
     		p[len]=transint(x.substr(g-t,m));
		 }
	}

	void print()
	{
		if(hao==-1) cout<<"-";
		printf("%d",p[len]);
		for(int i=len-1;i>=1;i--)
		{
		if(p[i]==0)
    	{printf("0000");continue;}
		for(int k=10;k*p[i]<mod;k*=10)
		printf("0");
		printf("%d",p[i]);
	    }
	}

  longx operator -()
  {
  	longx c=*this;
  	if(c==0) return c;
	c.hao=-hao;
	return c;
  }

  int operator >(longx a)
  {
  	if(hao>a.hao) return 1;
  	if(hao<a.hao) return 0;
  	if(hao==1)
  	{
  		if(len>a.len) return 1;
  		if(len<a.len) return 0;
  		for(int i=len;i>=1;i--)
  		{
  			if(p[i]>a.p[i]) return 1;
  			if(p[i]<a.p[i]) return 0;
		  }
  		return 0;
	  }

	if(hao==-1)
  	{
  		if(len>a.len) return 0;
  		if(len<a.len) return 1;
  		for(int i=len;i>=1;i--)
  		{
  			if(p[i]>a.p[i]) return 0;
  			if(p[i]<a.p[i]) return 1;
		  }
  		return 0;
	  }
  }

  int operator <(longx a)
  {
    if(hao>a.hao) return 0;
  	if(hao<a.hao) return 1;
  	if(hao==1)
  	{
  		if(len>a.len) return 0;
  		if(len<a.len) return 1;
  		for(int i=len;i>=1;i--)
  		{
  			if(p[i]>a.p[i]) return 0;
  			if(p[i]<a.p[i]) return 1;
		  }
  		return 0;
	  }

	if(hao==-1)
  	{
  		if(len>a.len) return 1;
  		if(len<a.len) return 0;
  		for(int i=len;i>=1;i--)
  		{
  			if(p[i]>a.p[i]) return 1;
  			if(p[i]<a.p[i]) return 0;
		  }
  		return 0;
	  }
  }

  bool operator ==(longx a)
  {
    if(hao!=a.hao) return false;
  	if(len!=a.len) return false;
  	for(int i=len;i>=1;i--)   {	if(p[i]!=a.p[i]) return false;}
  	return true;
  }

  bool operator !=(longx a)
  {
    if(hao!=a.hao) return true;
  	if(len!=a.len) return true;
  	for(int i=len;i>=1;i--)   {	if(p[i]!=a.p[i]) return true;}
  	return false;
  }

  bool operator ==(int a)
  {
    longx t(a);if(t==*this) return true;
  	return false;
  }

  bool operator !=(int a)
  {
    longx t(a);if(t==*this) return false;
  	return true;
  }

  longx operator -(longx a)	//高精-高精
  {
    longx tmp=*this;
	if(hao==1&&a.hao==-1)
    {
    	return tmp+(-a);
	}
  	if(hao==-1&&a.hao==1)
  	{
  		if(a==longx(0)) return tmp;
  		return tmp+(-a);
	}
	if(hao==-1&&a.hao==-1)
	{
	  	return -((-tmp)-(-a));
	}

  	if(hao==1&&a.hao==1)
  	{
  		if(tmp<a) return -(a-tmp);
  		if(tmp==a) return longx(0);
  		longx c;int wei=len;
		  for(int i=1;i<=len;i++)
		  {
		  	c.p[i]=p[i]-a.p[i];
		  }
		  for(int i=1;i<=len-1;i++)
		  {
		  	if(c.p[i]<0)
			  {
			  	c.p[i+1]--;
			  	c.p[i]+=mod;
			  }
		  }
		  for(int i=len;i>=1;i--)
		  {
		  	if(c.p[i]==0) wei--;
		  	else break;
		  }
		  c.hao=1;
		  c.len=wei;
		  return c;
	  }

  }

  longx	operator + (longx a)//高精+高精
  {
  	longx tmp=*this;//cout<<endl;tmp.print();cout<<endl;
	if(a.hao==1&&hao==1)
  	{
  	longx c;c.hao=1;
	c.len=max(len,a.len);
	int x=0;
	for(int i=1;i<=c.len;i++)
	{
		c.p[i]=p[i]+a.p[i]+x;
		x=c.p[i]/mod;
		c.p[i]%=mod;
	}
	if(x>0)
	c.p[++c.len]=x;
	return c;
	}

	if(a.hao==-1&&hao==-1)
  	{
  	longx c;c.hao=-1;
	c.len=max(len,a.len);
	int x=0;
	for(int i=1;i<=c.len;i++)
	{
		c.p[i]=p[i]+a.p[i]+x;
		x=c.p[i]/mod;
		c.p[i]%=mod;
	}
	if(x>0)
	c.p[++c.len]=x;
	return c;
	}

	if(hao==1&&a.hao==-1)
	{
		return tmp-(-a);
	}

	if(hao==-1&&a.hao==1)
	{
		return a-(-tmp);
	}
  }

  longx operator*(int t)//高精*单精
  {
  	longx c;int h=0;
	if(t==0||*this==0) return longx(0);
  	if(t>0) h=1;else h=-1;
  	c.hao =hao*h;
	c.len=len;
	int x=0;
	for(int i=1;i<=c.len;i++)
	{
		c.p[i]=p[i]*t+x;
		x=c.p[i]/mod;
		c.p[i]%=mod;
	}
	while(x>0)
	c.p[++c.len]=x%mod,x/=mod;
	return c;
  }

  longx operator*(longx t)//高精*高精
  {
    if(*this==0||t==0) return longx(0);
  	longx c;c.hao=hao*t.hao;int x=0;
  	c.len=len+t.len-1;
  	for(int i=1;i<=c.len;i++)
  	{
	 int g=(i+1-len)>1?(i+1-len):1;
  	 c.p[i]=x;x=0;
  		for(int j=g;j<=i;j++)
  		{
  			c.p[i]=c.p[i]+t.p[j]*p[i-j+1];
  			x+=c.p[i]/mod;
  			c.p[i]%=mod;
		}
	}
  	while(x>0)
	c.p[++c.len]=x%mod,x/=mod;
	return c;
  }

  longx abs()//取绝对值
  {
  	longx t=*this;t.hao=1;return t;
  }

  longx operator/(longx t)//高精除以高精
  {

	if(abs()<t.abs()) return longx(0);
    vector<int>tmp1;
    vector<int>tmp2;
    tmp1.push_back(0);tmp2.push_back(0);
    for(int i=1;i<=len-1;i++)
	{
		int h=p[i];
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);
	 }
		int h=p[len],wei1=4*(len-1);
		while(h>0)
		{
			wei1++;
			tmp1.push_back(h%10);h/=10;
		}

     for(int i=1;i<=t.len-1;i++)
	{
		int h=t.p[i];
	    tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);
	 }
		 h=t.p[t.len];int wei2=4*(t.len-1);
		while(h>0)
		{
			wei2++;
			tmp2.push_back(h%10);h/=10;
		}
	tmp1.push_back(0);tmp2.push_back(0);
	int limit=wei1-wei2+1;
	vector<int>ans(limit+6,0);

	for(int i=limit;i>=1;i--)
	{
	int f=0;
		while(1)
		{//cout<<"ss";
		  int flag=0;
		  if(!f)
		  {
		  	f=1;
		  	int g=(tmp1[wei2+i]*10+tmp1[wei2+i-1])/(tmp2[wei2]+1);ans[i]+=g;
			if(g!=0)
		  	{
			 for(int j=i;j<=wei2+i-1;j++){
		  	 tmp1[j]-=tmp2[j-i+1]*g;
		 	 if(tmp1[j]<0){
				int o=tmp1[j]%10;
				if(o==0)  {tmp1[j+1]+=tmp1[j]/10;tmp1[j]=0;}
				else {tmp1[j+1]+=tmp1[j]/10-1;tmp1[j]=o+10;}
			  }
		     }
			}
		  }

		  for(int j=wei2+i;j>=i;j--)
		  {
		  	if(tmp1[j]<tmp2[j-i+1]) {flag=1;break;}
		  	if(tmp1[j]>tmp2[j-i+1]) break;
		  }
		  if(flag) break;
		  ans[i]++;
		  for(int j=i;j<=wei2+i-1;j++)
		  {
		  	tmp1[j]-=tmp2[j-i+1];
			if(tmp1[j]<0)
			{
				tmp1[j]+=10;
				tmp1[j+1]--;
			}
		  }
		}
	}
	longx tmp;tmp.hao=hao*t.hao;
	if(ans[limit]==0)limit--;
	int r=limit%4;
	int lenn=limit/4;
	if(r!=0) lenn++;tmp.len=lenn;
	for(int i=1;i<=lenn;i++)
	{
		tmp.p[i]=1000*ans[i*4]+100*ans[i*4-1]+10*ans[i*4-2]+ans[i*4-3];
	}

	 return tmp;
  }

   longx operator %(longx t)//高精取余
  {
	if(abs()<t.abs()) return *this;
    vector<int>tmp1;
    vector<int>tmp2;
    tmp1.push_back(0);tmp2.push_back(0);
    for(int i=1;i<=len-1;i++)
	{
		int h=p[i];
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);
	 }
		int h=p[len],wei1=4*(len-1);
		while(h>0)
		{
			wei1++;
			tmp1.push_back(h%10);h/=10;
		}

     for(int i=1;i<=t.len-1;i++)
	{
		int h=t.p[i];
	    tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);
	 }
		 h=t.p[t.len];int wei2=4*(t.len-1);
		while(h>0)
		{
			wei2++;
			tmp2.push_back(h%10);h/=10;
		}
	tmp1.push_back(0);tmp1.push_back(0);tmp1.push_back(0);tmp1.push_back(0);
	tmp2.push_back(0);
	int limit=wei1-wei2+1;
	vector<int>ans(limit+6,0);

	for(int i=limit;i>=1;i--)
	{
	int f=0;
		while(1)
		{//cout<<"ss";
		  int flag=0;
		  if(!f)
		  {
		  	f=1;
		  	int g=(tmp1[wei2+i]*10+tmp1[wei2+i-1])/(tmp2[wei2]+1);ans[i]+=g;
			if(g!=0)
		  	{
			 for(int j=i;j<=wei2+i-1;j++){
		  	 tmp1[j]-=tmp2[j-i+1]*g;
		 	 if(tmp1[j]<0){
				int o=tmp1[j]%10;
				if(o==0)  {tmp1[j+1]+=tmp1[j]/10;tmp1[j]=0;}
				else {tmp1[j+1]+=tmp1[j]/10-1;tmp1[j]=o+10;}
			  }
		     }
			}
		  }

		  for(int j=wei2+i;j>=i;j--)
		  {
		  	if(tmp1[j]<tmp2[j-i+1]) {flag=1;break;}
		  	if(tmp1[j]>tmp2[j-i+1]) break;
		  }
		  if(flag) break;
		  ans[i]++;
		  for(int j=i;j<=wei2+i-1;j++)
		  {
		  	tmp1[j]-=tmp2[j-i+1];
			if(tmp1[j]<0)
			{
				tmp1[j]+=10;
				tmp1[j+1]--;
			}
		  }
		}
	}
	longx tmp;tmp.hao=hao;
	int length=0;
	for(int i=wei2;i>=1;i--)
	{
		if(tmp1[i]!=0)
		{
			length=i;break;
		}
	}
	if(length==0) length=1;
	int r=length%4,lenn=length/4;
	if(r!=0) lenn++;
	tmp.len=lenn;
	for(int i=1;i<=lenn;i++)
	{
		tmp.p[i]=1000*tmp1[i*4]+100*tmp1[i*4-1]+10*tmp1[i*4-2]+tmp1[i*4-3];
	}
	  return tmp;
  }

   pair<longx,longx> operator|(longx t)//高精除法和取余
  {
    pair<longx,longx> anss;
	if(abs()<t.abs())
	{
	anss.first=longx(0);anss.second=*this;
	return anss;
	}
    vector<int>tmp1;
    vector<int>tmp2;
    tmp1.push_back(0);tmp2.push_back(0);
    for(int i=1;i<=len-1;i++)
	{
		int h=p[i];
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);h/=10;
		tmp1.push_back(h%10);
	 }
		int h=p[len],wei1=4*(len-1);
		while(h>0)
		{
			wei1++;
			tmp1.push_back(h%10);h/=10;
		}

     for(int i=1;i<=t.len-1;i++)
	{
		int h=t.p[i];
	    tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);h/=10;
		tmp2.push_back(h%10);
	 }
		 h=t.p[t.len];int wei2=4*(t.len-1);
		while(h>0)
		{
			wei2++;
			tmp2.push_back(h%10);h/=10;
		}
	tmp1.push_back(0);tmp1.push_back(0);tmp1.push_back(0);tmp1.push_back(0);
	tmp2.push_back(0);int limit=wei1-wei2+1;
	vector<int>ans(limit+6,0);

	for(int i=limit;i>=1;i--)
	{
	int f=0;
		while(1)
		{//cout<<"ss";
		  int flag=0;
		  if(!f)
		  {
		  	f=1;
		  	int g=(tmp1[wei2+i]*10+tmp1[wei2+i-1])/(tmp2[wei2]+1);ans[i]+=g;
			if(g!=0)
		  	{
			 for(int j=i;j<=wei2+i-1;j++){
		  	 tmp1[j]-=tmp2[j-i+1]*g;
		 	 if(tmp1[j]<0){
				int o=tmp1[j]%10;
				if(o==0)  {tmp1[j+1]+=tmp1[j]/10;tmp1[j]=0;}
				else {tmp1[j+1]+=tmp1[j]/10-1;tmp1[j]=o+10;}
			  }
		     }
			}
		  }

		  for(int j=wei2+i;j>=i;j--)
		  {
		  	if(tmp1[j]<tmp2[j-i+1]) {flag=1;break;}
		  	if(tmp1[j]>tmp2[j-i+1]) break;
		  }
		  if(flag) break;
		  ans[i]++;
		  for(int j=i;j<=wei2+i-1;j++)
		  {
		  	tmp1[j]-=tmp2[j-i+1];
			if(tmp1[j]<0)
			{
				tmp1[j]+=10;
				tmp1[j+1]--;
			}
		  }
		}
	}

	longx tmp;tmp.hao=hao*t.hao;
	int length=0;
	for(int i=wei2;i>=1;i--)
	{
		if(tmp1[i]!=0)
		{
			length=i;break;
		}
	}
	if(length==0) length=1;
	int r=length%4,lenn=length/4;
	if(r!=0) lenn++;
	tmp.len=lenn;
	for(int i=1;i<=lenn;i++)
	{
		tmp.p[i]=1000*tmp1[i*4]+100*tmp1[i*4-1]+10*tmp1[i*4-2]+tmp1[i*4-3];
	}

    anss.second=tmp;

	tmp.hao=hao*t.hao;
	if(ans[limit]==0)limit--;
	r=limit%4;
	lenn=limit/4;
	if(r!=0) lenn++;tmp.len=lenn;
	for(int i=1;i<=lenn;i++)
	{
		tmp.p[i]=1000*ans[i*4]+100*ans[i*4-1]+10*ans[i*4-2]+ans[i*4-3];
	}

    anss.first=tmp;
	return anss;
  }



};

istream& operator>>(istream& in,longx& longx_)
{
    string x;longx_.hao=1;
	in>>x;int t=x.length(),g=t;//cout<<"ss"<<t;
	if(x.at(0)=='-')  { longx_.hao=-1;t--;}
	int n=t/4,m=t%4;
     	if(m==0)
     	{longx_.len=n;	for(int i=1;i<=n;i++) longx_.p[i]=transint(x.substr(g-4*i,4));}
     	else
     	{
     		longx_.len=n+1;
     		for(int i=1;i<=n;i++) longx_.p[i]=transint(x.substr(g-4*i,4));
     		longx_.p[longx_.len]=transint(x.substr(g-t,m));
		 }
		 return in;
}

ostream& operator<<(ostream& out,const longx& longx_)
{
   if(longx_.hao==-1) cout<<"-";
   printf("%d",longx_.p[longx_.len]);
	    for(int i=longx_.len-1;i>=1;i--)
		{
		if(longx_.p[i]==0)
    	{printf("0000");continue;}
		for(int k=10;k*longx_.p[i]<mod;k*=10)
		printf("0");
		printf("%d",longx_.p[i]);
	    }
	    return out;
}

long long trans(string x)
{
	long long ans=0;
	if(x.at(0)=='-'){
	for(int i=1;i<=x.length()-1;i++)  ans=ans*10+int(x.at(i))-int('0');
	ans=-ans;
    }
	else {
	for(int i=0;i<=x.length()-1;i++)  ans=ans*10+int(x.at(i))-int('0');
	}
	return ans;
}

int wei(long long x)
{
    if(x==0) return 1;
    else if(x<0)
    { x=-x;
	for(int i=1;i<=18;i++)
	{
		if(x<base[i]) return i+1;
	}
	}
	else
	for(int i=1;i<=18;i++)
	{
		if(x<base[i]) return i;
	}
}

int wei(longx x)
{
    int t=0;
    if(x==longx(0)) return 1;
	else if(x.hao==-1) t=1;
	for(int i=3;i>=0;i--)
	{
		if(x.p[x.len]/base[i]!=0) return 4*(x.len-1)+i+1+t;
	}
}

int weishu(longx x)
{
	//cout<<x<<"s"<<x.len;
    if(x==longx(0)) return 1;
	for(int i=3;i>=0;i--)
	{
		if(x.p[x.len]/base[i]!=0) return 4*(x.len-1)+i+1;
	}
}

long long gcd(long long a,long long b)
{

    if(a==0) return b;if(b==0) return a;
	if(a<0) a=-a;if(b<0) b=-b;
	if(a>b)
	{long long tmp=a;a=b;b=tmp;}
	if(b%a==0){return a;}
	return gcd(b%a,a);
}

longx gcd(longx a,longx b)
{
   // a.print();cout<<" ";b.print();cout<<endl;
    longx u=longx(0);	//a.print();cout<<"  ";//b.print();cout<<" "<<a.len;cout<<endl;
	if(a.hao==-1) a.hao=1;
	if(b.hao==-1) b.hao=1;
    if(a==u) return b;if(b==u) return a;
	if(a>b)
	{longx tmp=a;a=b;b=tmp;}
	longx t=b%a;
	if(t==u){return a;}
	return gcd(t,a);
}

class Rn{
public:
    longx mu=longx(1);
	longx zi;
	string name;
	void print(){if(!(mu==longx(1)))  {zi.print();cout<<"/";mu.print();}else zi.print();}
	Rn(){}
	Rn(longx zi0,longx mu0)
	{
	if(mu0==longx(0)) {//cout<<zi0<<endl<<mu0;
	cout<<"improper construction"<<endl;return;} longx yinzi=gcd(zi0,mu0);zi=zi0/yinzi;mu=mu0/yinzi;
	if(mu<0)
	{mu=-mu;zi=-zi;}
	}

	friend istream& operator>>(istream& in,Rn& num);
	friend ostream& operator<<(ostream& out,const Rn& num);

	void huajian()
	{//cout<<"o"<<zi<<"s"<<zi.len;
		longx yinzi=gcd(zi,mu);//zi.print();mu.print();//yinzi.print();cout<<endl;
		zi=zi/yinzi;mu=mu/yinzi;
	}

	void input()
	{
		string tmp;cin>>tmp;
			int x=tmp.find('/');
			if(x!=tmp.npos)
			{
		    zi.trans(tmp.substr(0,x));
			mu.trans(tmp.substr(x+1));
			huajian();
			}
		    else{
			x=tmp.find('.');
		    if(x!=tmp.npos)
		    {
		    longx m;m.trans(tmp.substr(0,x));
			longx n;n.trans(tmp.substr(x+1));
			longx t;
			int k=tmp.length()-x-1;//cout<<k<<"s";
			int a=k/4,b=k%4;t.p[a+1]=base[b];//cout<<t.p[a+1];
			if((k+1)%4==0) t.len=(k+1)/4;
			else t.len=(k+1)/4+1;
			zi=n;
			mu=t;
			//print();
			huajian();//print();cout<<endl;
			if(m.hao>0)
			zi=zi+m*mu;
			else
			zi=-zi+m*mu;

			}
			else
			{
				zi.trans(tmp);//cout<<"ss";	//cout<<tmp<<endl;
				mu=longx(1);
			}
			}
	}

	void input(string tmp)
	{
			int x=tmp.find('/');
			if(x!=tmp.npos)
			{
		    zi.trans(tmp.substr(0,x));
			mu.trans(tmp.substr(x+1));
			huajian();
			}
		    else{
			x=tmp.find('.');
		    if(x!=tmp.npos)
		    {
		    longx m;m.trans(tmp.substr(0,x));
			longx n;n.trans(tmp.substr(x+1));
			longx t;
			int k=tmp.length()-x-1;//cout<<k<<"s";
			int a=k/4,b=k%4;t.p[a+1]=base[b];//cout<<t.p[a+1];
			if((k+1)%4==0) t.len=(k+1)/4;
			else t.len=(k+1)/4+1;//cout<<t<<"s"<<t.len;
			zi=n;
			mu=t;
			//print();
			huajian();//cout<<mu<<"s"<<mu.len;//print();cout<<endl;
			if(m.hao>0)
			zi=zi+m*mu;
			else
			zi=-zi+m*mu;

			}
			else
			{
				zi.trans(tmp);//cout<<"ss";	//cout<<tmp<<endl;
				mu=longx(1);
			}
			}
	}
//	string zhi()
//	{
//		return double(zi)/double(mu);
//	}
    Rn abs()
    {
    	Rn ans=*this;
    	ans.zi.hao=1;
    	return ans;
	}

	bool operator==(Rn a)
	{
		if(a.zi==zi&&a.mu==mu)return true;
		return false;
	}

	bool operator !=(Rn a)
	{
		if(a.zi==zi&&a.mu==mu) return false;
		return true;
	}

	int length()
	{
		if(mu==longx(1)) return wei(zi);
		return wei(zi)+wei(mu)+1;
	}

	Rn operator+(Rn x)
	{
		longx yinzi=gcd(mu,x.mu);longx t=x.mu/yinzi;
		longx mu_new=mu*t ;
		longx zi_new=zi*t+x.zi*(mu/yinzi);
		Rn tmp(zi_new,mu_new);
		return tmp;
	}

	Rn operator-(Rn x)
	{
		longx yinzi=gcd(mu,x.mu);longx t=x.mu/yinzi;
		longx mu_new=mu*t ;
		longx zi_new=zi*t-x.zi*(mu/yinzi);
		Rn tmp(zi_new,mu_new);
		return tmp;
	}

	Rn operator-()
	{
		Rn tmp=*this;
		if(!(tmp.zi==longx(0))) tmp.zi.hao*=-1;
		return tmp;
	}

	Rn operator*(Rn x)
	{
		longx yinzi1=gcd(mu,x.zi);
		longx yinzi2=gcd(zi,x.mu);
		Rn tmp((zi/yinzi2)*(x.zi/yinzi1),(mu/yinzi1)*(x.mu/yinzi2));
		return tmp;
	}

	Rn operator/(Rn x)
	{
		longx yinzi1=gcd(mu,x.mu);
		longx yinzi2=gcd(zi,x.zi);
		if(x.zi<0)
		{
		Rn tmp((zi/yinzi2)*((-x.mu)/yinzi1),(mu/yinzi1)*((-x.zi)/yinzi2));return tmp;
		}
		else
		{
		Rn tmp((zi/yinzi2)*((x.mu)/yinzi1),(mu/yinzi1)*((x.zi)/yinzi2));return tmp;
		}
	}

	void zhiprint()
	{
		Rn num=abs();
		int p=zi.hao;
		if(num.zi==0)
		{
			cout<<"0";return;
		}
		if(num.mu==longx(1))
		{
			vector<int>tmp;
            tmp.push_back(0);
		    for(int i=1;i<=num.zi.len-1;i++)
			{
				int h=num.zi.p[i];
				tmp.push_back(h%10);h/=10;
				tmp.push_back(h%10);h/=10;
				tmp.push_back(h%10);h/=10;
				tmp.push_back(h%10);
			}
			int h=num.zi.p[num.zi.len],wei=4*(num.zi.len-1);
			while(h>0){wei++;tmp.push_back(h%10);h/=10;}
			if(wei==0) wei=1;
			int limit=wei-1;
			//cout<<wei-shuwei;
			if(wei-shuwei>=1)
			{
				if(tmp[wei-shuwei]>=5)
				{
					tmp[wei-shuwei+1]++;
					for(int i=wei-shuwei+1;i<=wei-1;i++)
					{
						if(tmp[i]==10)
						{
						tmp[i]=0;
						tmp[i+1]++;
						}
						else break;
					}
				}
				limit=shuwei-1;
			}
			if(tmp[wei]==10) {tmp[wei]=0;tmp.push_back(1);wei++;}
			cout<<tmp[wei];
			if(wei>=2) cout<<".";
			for(int i=1;i<=limit;i++)
			cout<<tmp[wei-i];
			if(wei!=1)
			cout<<" * 10^"<<wei-1;
			return;
		}
			longx x=num.zi;
			longx y=num.mu;
			int lx=weishu(x),ly=weishu(y);
			int ans=0;int gg=y.len;
			if(x==1)
			{
			for(int i=1;i<=gg-1;i++)
			{
				int h=y.p[i];
				ans+=h%10;h/=10;
				ans+=h%10;h/=10;
				ans+=h%10;h/=10;
				ans+=h%10;
			}
		    int h=y.p[gg];
			while(h>0){ans+=h%10;h/=10;}
			   if(ans==1)
			   {//cout<<"ss";
			   	cout<<"1 * 10^ (-"<<ly-1<<")";return;
			   }
			}
		    longx t=x/y;
			int f=weishu(t);
			if(t==0)
			{t=y/x;f=1-weishu(t);}
			int limit=shuwei-f+1;
			int g=limit/4,r=limit%4;
			for(int i=1;i<=g;i++)
			x=x*mod;
			for(int i=1;i<=r;i++)
			x=x*10;
			t=x/y;
			vector<int>tmp;
		    tmp.push_back(0);
		    for(int i=1;i<=t.len-1;i++)
			{
				int h=t.p[i];
				tmp.push_back(h%10);h/=10;
				tmp.push_back(h%10);h/=10;
				tmp.push_back(h%10);h/=10;
				tmp.push_back(h%10);
			}
			int h=t.p[t.len],wei=4*(t.len-1);
			while(h>0){wei++;tmp.push_back(h%10);h/=10;}
			if(tmp[1]>=5)
			{
				tmp[2]++;
				for(int i=2;i<=wei-1;i++)
				{
					if(tmp[i]==10)
					{
						tmp[i]=0;tmp[i+1]++;
					}
					else break;
				}
			}
			if(tmp[wei]==10) {tmp[wei]=0;tmp.push_back(1);wei++;f++;}
			int min;
			for(int i=2;i<=wei;i++) if(tmp[i]!=0)
			{min=i;break;}int count=0;
			for(int i=wei;i>=1;i--)
			{
				if(i<min) break;
				cout<<tmp[i];
				if(i==wei&&wei!=min) cout<<".";
				count++;
				if(count==shuwei) break;
			}
			if(f!=1){cout<<" * 10^";if(f<0)cout<<"(";cout<<f-1;if(f<0)cout<<")";}
			return;
	}
};
Rn zero(longx(0),longx(1));
Rn one(longx(1),longx(1));

istream& operator>>(istream& in,Rn& num)
{
		string tmp;in>>tmp;
			int x=tmp.find('/');
			if(x!=tmp.npos)
			{
		    num.zi.trans(tmp.substr(0,x));
			num.mu.trans(tmp.substr(x+1));
			num.huajian();
			}
		    else{
			x=tmp.find('.');
		    if(x!=tmp.npos)
		    {
		    longx m;m.trans(tmp.substr(0,x));
			longx n;n.trans(tmp.substr(x+1));
			longx t;
			int k=tmp.length()-x-1;//cout<<k<<"s";
			int a=k/4,b=k%4;t.p[a+1]=base[b];//cout<<t.p[a+1];
			if((k+1)%4==0) t.len=(k+1)/4;
			else t.len=(k+1)/4+1;
			num.zi=n;
			num.mu=t;//cout<<num.mu.len;
			//print();
			num.huajian();//cout<<num.mu.len;//print();cout<<endl;
			if(m.hao>0)
			num.zi=num.zi+m*num.mu;
			else
			num.zi=-num.zi+m*num.mu;
		    }
			else
			{
				//cout<<"ss"<<tmp<<"a";
				num.zi.trans(tmp);//cout<<"ss";	//cout<<tmp<<endl;
				num.mu=longx(1);
			}
			}
			return in;
}

ostream& operator<<(ostream& out,const Rn& num)
{
  longx tmp=num.mu;
  if(!(tmp==longx(1)))  {out<<num.zi<<"/"<<num.mu;}//out<<num.zi;out<<"/";out<<num.mu;
  else out<<num.zi;
  return out;
}


class vectorx{
public:
	int n=0;string name="none";
	Rn data[50];
	vectorx(){n=0;}
	friend istream& operator>>(istream& in,vectorx& v);
	friend ostream& operator<<(ostream& out,const vectorx& v);
	void input()
	{
		cout<<"dimension:"<<endl;   //	cout<<"new vector:"<<endl<<"name:"<<endl;//	cin>>name;
		cin>>n;
		cout<<"elements"<<endl;
		for(int i=1;i<=n;i++)
		data[i].input();
	 }

	 void print()
	 {
	 	//cout<<n<<"dimension vector"<<name<":"<<endl;
	 	cout<<"( ";
	 	for(int i=1;i<=n;i++)
	 	{
	 	   data[i].print();
	 	   cout<<" ";
		 }
	 	cout<<")";
	 }

	vectorx operator+(vectorx a)
	{
		vectorx tmp; tmp.n=n;
		if(n!=a.n)
		{
			cout<<"improrer addition!"<<endl;
			return tmp;
		}
		for(int i=1;i<=n;i++)
		{
			tmp.data[i]=data[i]+a.data[i];
		}
		return tmp;
	}

	vectorx operator-(vectorx a)
	{
		vectorx tmp; tmp.n=n;
		if(n!=a.n)
	    {
		cout<<"improrer subtraction!"<<endl;
		return tmp;
		}
		for(int i=1;i<=n;i++)
		{
			tmp.data[i]=data[i]-a.data[i];
		}
		return tmp;
	}

	Rn operator*(vectorx a)
	{
		Rn ans=zero;
		for(int i=1;i<=n;i++)
		{
			ans=ans+data[i]*a.data[i];
		}
		return ans;
	}

	vectorx operator-()
	{
		vectorx tmp=*this;
		for(int i=1;i<=n;i++)
		tmp.data[i].zi.hao*=-1;
		return tmp;
	}

	bool operator==(vectorx a)
	{
		if(n!=a.n) return 0;
		for(int i=1;i<=n;i++)
		{
			if(!(data[i]==a.data[i]))return false;
		}
		return true;
	}

	bool operator!=(vectorx a)
	{
		if(n!=a.n) return 1;
		for(int i=1;i<=n;i++)
		{
			if(!(data[i]==a.data[i]))return true;
		}
		return false;
	}
};

istream& operator>>(istream& in,vectorx& v)
{
	cout<<"dimension:"<<endl;   //	cout<<"new vector:"<<endl<<"name:"<<endl;//	cin>>name;
	in>>v.n;
	cout<<"elements"<<endl;
	for(int i=1;i<=v.n;i++)
	in>>v.data[i];
	return in;
}

ostream& operator<<(ostream& out,const vectorx& v)
{
	out<<"( ";
	for(int i=1;i<=v.n;i++)
	{
	 	out<<v.data[i];
	    out<<" ";
	 }
	out<<")";
	return out;
}

//class vectors{
//	public:
//	int number;
//	vectorx data[20];
//};

class matrix{
public:
	vector<vector<Rn> >data;int maxlen[maxl];
	int h,l;
	string name="none";
	matrix(){}
	matrix(int h0,int l0)	{h=h0;l=l0;data.resize(h0+1,vector<Rn>(l0+1));}
	friend istream& operator>>(istream& in,matrix& max);
	friend ostream& operator<<(ostream& out,const matrix& max);

	void set(int h0,int l0)
	{
		//cout<<h0<<" "<<l0;
		h=h0;l=l0;
		data.resize(h0+1);
		for(int i=1;i<=h0;i++)
		data[i].resize(l0+1);
	}

	void init()
	{
	    for(int j=1;j<=l;j++) maxlen[j]=-1;
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++)
		{
			int t=data[i][j].length();
			if(t>maxlen[j]) maxlen[j]=t;
		}
	}

	void print(){
		init(); //cout<<"matrix "<<name<<":"<<endl;
		for(int i=1;i<=h;i++){
		for(int j=1;j<=l;j++){
		data[i][j].print();
		int t=maxlen[j]-data[i][j].length()+1;//cout<<"ww";
		for(int k=1;k<=t;k++) cout<<" ";
		}cout<<endl;
		}
	}

	void input()
	{
	//	cout<<"the name of the matrix:"<<endl;
	//	cin>>name;
		cout<<"the row and col:" <<endl;
		cin>>h>>l;set(h,l);
		cout<<"the elements:"<<endl;
		for(int j=1;j<=l;j++) maxlen[j]=-1;
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++)
		{
		data[i][j].input();
		int t=data[i][j].length();
		if(t>maxlen[j]) maxlen[j]=t;
		}
	}

	matrix operator-()
	{
		matrix x=*this;
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++)
		{
			x.data[i][j].zi.hao*=-1;
		}
		x.init();
		return x;
	}

	matrix operator*(Rn a)
	{
		matrix x;x.set(h,l);
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++)
		{x.data[i][j]=data[i][j]*a;}
		x.init();
		return x;
	}

	matrix operator+(matrix x)
	{
	    matrix tmp(h,l);
		if(h!=x.h||l!=x.l)
		{
		cout<<"improper matrix addition!"<<endl;tmp.init();return tmp;
		}
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++){
			tmp.data[i][j]=data[i][j]+x.data[i][j];
		}
		tmp.init();
		return tmp;
	}

	matrix operator-(matrix x)
	{
	    matrix tmp(h,l);
		if(h!=x.h||l!=x.l)
		{
		cout<<"improper matrix subtraction!"<<endl;tmp.init();return tmp;
		}
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++){
			tmp.data[i][j]=data[i][j]-x.data[i][j];
		}
		tmp.init();
		return tmp;
	}

	matrix operator*(matrix x)
	{
		matrix tmp(h,x.l);
		if(l!=x.h)  {cout<<"improper matrix Multiplication!"<<endl;tmp.init();return tmp;}
		for(int i=1;i<=tmp.h;i++)
		for(int j=1;j<=tmp.l;j++)
		{//cout<<i<<" "<<j<<endl;
		tmp.data[i][j]=zero;
		for(int k=1;k<=l;k++) {tmp.data[i][j]=tmp.data[i][j]+data[i][k]*x.data[k][j];}
		}
		tmp.init();
		return tmp;
	}

	bool operator==(matrix &x)
	{
		if(h!=x.h||l!=x.l) return false;
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++)
		{
			if(data[i][j]!=x.data[i][j]) return false;
		}
		return true;
	}

	bool operator!=(matrix &x)
	{
		if(h!=x.h||l!=x.l) return true;
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++)
		{
			if(data[i][j]!=x.data[i][j]) return true;
		}
		return false;
	}

	void swaph(int x,int y)
	{
	    data[x].swap(data[y]);
	}

	void swapl(int x,int y)
	{
	    Rn tmp;
		for(int i=1;i<=h;i++)
		{
			tmp=move(data[i][x]);
			data[i][x]=move(data[i][y]);
			data[i][y]=move(tmp);
		}
	}

	Rn determinant()
	{
		Rn t(longx(1),longx(1));//tmp.data[2][3].print();
		matrix tmp=*this;
		if(l!=h)
		{
			cout<<"matrix determinant does not exist"<<endl;return t;
		}
		int hao=1;
		for(int i=1;i<=h;i++)
		{
			if(tmp.data[i][i].zi==0)
			{//cout<<i;
				int flag=0;
				for(int j=i+1;j<=h;j++)
				{
					if(!(tmp.data[j][i].zi==longx(0)))
					{
						tmp.swaph(i,j);	hao=-hao;flag=1;break;
					}
				}
				if(!flag)
				{
					t.zi=longx(0);t.mu=longx(1);return t;
				}
			}
			for(int j=i+1;j<=h;j++)
			{
				Rn g=tmp.data[j][i]/tmp.data[i][i];
				for(int k=i+1;k<=l;k++)
				{
					tmp.data[j][k]=	tmp.data[j][k]-g*tmp.data[i][k];
				}
			}

		}
		for(int i=1;i<=h;i++)
			{
				t=t*tmp.data[i][i];
			}
		if(hao<0) t.zi=-t.zi;
        return t;
	}

	matrix inverse()
	{
		matrix tmp(h,2*l);
		if(determinant().zi==0||l!=h)
		{
			cout<<"no inverse exist"<<endl;
			return tmp;
		}

		for(int i=1;i<=h;i++)
		{
		  for(int j=1;j<=l;j++)  tmp.data[i][j]=data[i][j];
	      for(int j=1+l;j<=2*l;j++) {if(j-l==i) tmp.data[i][j]=Rn(longx(1),longx(1));else tmp.data[i][j]=zero;}
        }

		for(int i=1;i<=h;i++)
		{//cout<<i;
			if(tmp.data[i][i].zi==0)
			{//cout<<i;
				for(int j=i+1;j<=h;j++)
				{
					if(!(tmp.data[j][i].zi==longx(0)))
					{
						tmp.swaph(i,j);	break;
					}
				}
			}

			for(int j=i+1;j<=h;j++)
			{
				Rn g=tmp.data[j][i]/tmp.data[i][i];
				for(int k=i+1;k<=2*l;k++)
				{
					tmp.data[j][k]=	tmp.data[j][k]-g*tmp.data[i][k];
				}
			}
		}

		for(int i=h;i>=1;i--)
		{//cout<<i;
			for(int j=i-1;j>=1;j--)
			{
				Rn g=tmp.data[j][i]/tmp.data[i][i];
				for(int k=l+1;k<=2*l;k++)
				{
					tmp.data[j][k]=	tmp.data[j][k]-g*tmp.data[i][k];
				}
			}
		}

		matrix tmpp(h,l);
		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++)
		{tmpp.data[i][j]=tmp.data[i][j+l];}

		for(int i=1;i<=h;i++)
		for(int j=1;j<=l;j++)
		{tmpp.data[i][j]=tmpp.data[i][j]/tmp.data[i][i];}

		tmpp.init();
		return tmpp;
	  }

	int rank()
	{
		matrix tmp=*this;
		int x=1,y=1;
		while(1)
		{
		    if(x>h||y>l) break;
			//tmp.data[x][y].zi.print();
			//longx(0).print();
			if(tmp.data[x][y].zi==longx(0))
			{//cout<<i;
				int flag=0;
				for(int j=x+1;j<=h;j++)
				{
					if(!(tmp.data[j][y].zi==longx(0)))
					{
						flag=1;tmp.swaph(x,j);	break;
					}
				}
				if(!flag)
				{  y++;continue;  }
			}

			for(int j=x+1;j<=h;j++)
			{
				Rn g=tmp.data[j][y]/tmp.data[x][y];tmp.data[j][y]=zero;//cout<<"s";
				for(int k=y+1;k<=l;k++)
				{
					tmp.data[j][k]=	tmp.data[j][k]-g*tmp.data[x][k];
				}
			}
			x++,y++;
		}
		if(x>h) return h;
		return x-1;
	}

	matrix transform()
	{
		matrix a(l,h);
		for(int i=1;i<=a.h;i++)
		for(int j=1;j<=a.l;j++)
		{
			a.data[i][j]=data[j][i];
		}
		a.init();
		return a;
	}

	Rn cofactor(int x,int y)//子式
	{
		if((l!=h)||(x>h)||(x<1)||(y>l)||(y<1))
		{
			cout<<"no cofactor exist"<<endl;
			return zero;
		}
		matrix tmp(h-1,l-1);
		int a=0,b=0;
		for(int i=1;i<=h;i++)
		{
		    if(i==x){ a=1;continue;}
			for(int j=1;j<=l;j++)
			{
			if(j==y){ b=1;continue;}
			tmp.data[i-a][j-b]=data[i][j];
			}
			b=0;
		}
		Rn ans=tmp.determinant();
		if(((x+y)%2)==1&&(!(ans.zi==longx(0))))  ans.zi.hao*=-1;
		return  ans;
	}

	matrix adjugate()
	{
		matrix ans(h,l);
		if(h!=l) {cout<<"no adjugate matrix existed!"<<endl;return ans;}
		int t=rank();
		if(t<h-1)
		{
			for(int i=1;i<=h;i++)
			for(int j=1;j<=l;j++)
			ans.data[i][j]=zero;
			ans.init();
			return ans;
		}
		else
		{
			for(int i=1;i<=h;i++)
			for(int j=1;j<=l;j++)
			ans.data[i][j]=cofactor(j,i);
			ans.init();
			return ans;
		}
	}

	void tranh(int x,int y,Rn g)
	{
		for(int i=1;i<=l;i++)
		{
			data[y][i]=data[y][i]+g*data[x][i];
		}
		return;
	}

	void tranl(int x,int y,Rn g)
	{
		for(int i=1;i<=h;i++)
		{
			data[i][y]=data[i][y]+g*data[i][x];
		}
		return;
	}

	pair<matrix,matrix> Quadratic_standardization();
	polynomial characteristic_polynomial();
	matrix Hessenberg();
    vector<polynomial> invariant_factor();
    polynomial minimal_polynomial();
    matrix frobenius_normalform();

};

istream& operator>>(istream& in,matrix& max)
{
	//cout<<"please input the name of the matrix:"<<endl;
//	in>>max.name;
	cout<<"Number of row and col:" <<endl;
	in>>max.h>>max.l; max.set(max.h,max.l);
	cout<<"Elements:"<<endl;
	for(int i=1;i<=max.h;i++)
	for(int j=1;j<=max.l;j++)
	{
	if(i==1) max.maxlen[j]=-1;
	in>>max.data[i][j];
	int t=max.data[i][j].length();
	if(t>max.maxlen[j]) max.maxlen[j]=t;
    }
    return in;
}

ostream& operator<<(ostream& out,const matrix& max)
{
	//max.init(); //cout<<"matrix "<<name<<":"<<endl;
	for(int i=1;i<=max.h;i++){
	for(int k=1;k<=blank;k++) cout<<" ";
	for(int j=1;j<=max.l;j++){
	out<<max.data[i][j];
	Rn e=max.data[i][j];
	int p=e.length();
	int t=max.maxlen[j]-p+1;//cout<<"ww";
	for(int k=1;k<=t;k++) out<<" ";
	}out<<endl;
	}
	return out;
}

class Matrix{

	public:
	static matrix I[maxmat];
	static matrix Z[maxmat];

	Matrix()
	{
	    for(int i=1;i<=maxmat-1;i++)
    	{//cout<<"saas";
    	    I[i].set(i,i);Z[i].set(i,i);
    	    int shi=i/10,ge=i%10;
			I[i].name="I";Z[i].name="Z";
			if(shi!=0)
			{
			I[i].name+=char(shi+int('0'));I[i].name+=char(ge+int('0'));
			Z[i].name+=char(shi+int('0'));I[i].name+=char(ge+int('0'));
			}
    	    else I[i].name+=char(ge+int('0'));

    		for(int j=1;j<=i;j++)
    		for(int k=1;k<=i;k++)
			{
				if(j==k) I[i].data[j][k]=one;
				else     I[i].data[j][k]=zero;
				Z[i].data[j][k]=zero;
			}
		}
	}
};

matrix Matrix::I[maxmat];
matrix Matrix::Z[maxmat];

class lequation{
public:
	matrix a;
	matrix aug;
	//vectorx b;
	lequation(){}
	void input()
	{
		//cout<<"linear equation solving system"<<endl<<"coefficient matrix:"<<endl;
		cin>>a;aug=a;aug.l++;
		cout<<"constant vector:"<<endl;
		Rn x;
		for(int i=1;i<=a.h;i++)
		{
			cin>>x;aug.data[i].push_back(x);
		}
	}

//	void repeat()
//	{
//		cout<<"coefficient matrix:";a.print();
//		cout<<"constant vector:";b.print();
//	}

	void solve()
	{
	    matrix g=aug;
		int x=a.rank();int y=g.rank();//cout<<x<<" "<<y;
		//a.determinant().print();
		int h=g.h,l=g.l;
		if(x!=y){cout<<"no solution to this equation!"<<endl;return;}
		int su[maxl];//编号为i的位置现在的分量编号是多少
		int place[maxl];
		for(int i=1;i<=l-1;i++) {su[i]=i;place[i]=i;}
		for(int i=1;i<=x;i++)
		{
			if(g.data[i][i].zi==longx(0))
			{
			    for(int k=i;k<=l-1;k++)
				{
					int flag=0;
					for(int j=i;j<=h;j++)
				    {
					  if((j==i)&&(k==i)) continue;
					  if(!(g.data[j][k].zi==longx(0)))
					  {
						  g.swaph(j,i);
						  g.swapl(k,i);
						  int tmp= su[k];su[k]=su[i];su[i]=tmp;
						  place[su[k]]=k;place[su[i]]=i;
						  flag=1;break;
					  }
				    }
				    if(flag)break;
				}
			 }

			 for(int j=i+1;j<=h;j++)
			 {
			 	Rn t=g.data[j][i]/g.data[i][i];
			 	for(int k=i+1;k<=l;k++)
			 	g.data[j][k]=g.data[j][k]-g.data[i][k]*t;
			 }

		}

		for(int i=x;i>=2;i--)
		{
			for(int j=i-1;j>=1;j--)
			{
			Rn t=g.data[j][i]/g.data[i][i];
			for(int k=i+1;k<=l;k++)
			g.data[j][k]=g.data[j][k]-g.data[i][k]*t;
			}
		}	 //g.init();g.print();

		if(x==l-1){
			cout<<"Only one solution:"<<endl;
			cout<<"(";
			for(int i=1;i<=l-1;i++)
			{
				Rn ans=g.data[place[i]][l-1]/g.data[i][i];
				ans.print();cout<<" ";
			}
			cout<<")";
			return;
		}

		cout<<"Solution space dimension: "<<l-1-x<<endl;
		int flag=0;
		for(int i=1;i<=aug.h;i++)
        {
        	if(aug.data[i][aug.l].zi!=longx(0))
        	{
        		flag=1;break;
			}
		}

		vectorx ans;ans.n=l-1;
		if(flag)
		{
		   cout<<"Specific solution:"<<endl;
		   for(int i=1;i<=x;i++)
	       {
	    	   ans.data[su[i]]=g.data[i][l]/g.data[i][i];
	       }
	       for(int i=x+1;i<=l-1;i++)
	       {
	    	   ans.data[su[i]]=zero;
		   }
           ans.print();
		}
		cout<<endl;
	//	for(int i=1;i<=3;i++)cout<<place[i]<<endl;
		cout<<"Basic set of solutions"<<endl;
		for(int i=1;i<=l-1-x;i++)//枚举解的个数
		{
			for(int j=l-1;j>=x+1;j--)//枚举后半部分解的分量
			{
				if(j==l-i) ans.data[su[j]]=one;
				else ans.data[su[j]]=zero;
			}
			for(int j=1;j<=x;j++)
			ans.data[su[j]]=(-g.data[j][l-i])/g.data[j][j];
			cout<<ans;
			cout<<endl;
		}
	}
};

extern polynomial pzero;
class polynomial{
	public:
	int deg=0;
	string name;
	vector<Rn> data;
	polynomial(){}
	polynomial(Rn x)  {data.push_back(x);deg=0;}
	polynomial(int d,vector<Rn> a){deg=d;data=a;}
	friend istream&operator>>(istream& in,polynomial& po);
	friend ostream&operator<<(ostream& out,const polynomial& po);
	polynomial operator+(polynomial x)
	{
		polynomial ans;
		if(deg<x.deg)
		{
		    ans.deg=x.deg;
			for(int i=0;i<=deg;i++)   ans.data.push_back(data[i]+x.data[i]);
			for(int i=deg+1;i<=x.deg;i++)  ans.data.push_back(x.data[i]);
			return ans;
		}
		if(deg>x.deg)
		{
		    ans.deg=deg;
			for(int i=0;i<=x.deg;i++)   ans.data.push_back(data[i]+x.data[i]);
			for(int i=x.deg+1;i<=deg;i++)  ans.data.push_back(data[i]);
			return ans;
		}
		if(deg==x.deg)
		{
			for(int i=0;i<=deg;i++)
			ans.data.push_back(data[i]+x.data[i]);
			for(int i=deg;i>=0;i--)
			{
				if(!(ans.data[i].zi==longx(0)))
				{
					ans.deg=i;return ans;
				}
				ans.data.pop_back();
			}
			ans.data.push_back(zero),ans.deg=0;
			//if(ans.data[ans.deg]==zero&&ans.deg!=0) cout<<"老天爷呀"<<endl;
			return ans;
		}
	}

	polynomial operator-(polynomial x)
	{
		polynomial ans;
		if(deg<x.deg)
		{
		    ans.deg=x.deg;
			for(int i=0;i<=deg;i++)   ans.data.push_back(data[i]-x.data[i]);
			for(int i=deg+1;i<=x.deg;i++)  ans.data.push_back(-x.data[i]);
			return ans;
		}
		if(deg>x.deg)
		{
		    ans.deg=deg;
			for(int i=0;i<=x.deg;i++)   ans.data.push_back(data[i]-x.data[i]);
			for(int i=x.deg+1;i<=deg;i++)  ans.data.push_back(data[i]);
			return ans;
		}
		if(deg==x.deg)
		{
			for(int i=0;i<=deg;i++)
			ans.data.push_back(data[i]-x.data[i]);
			for(int i=deg;i>=0;i--)
			{
				if(!(ans.data[i].zi==longx(0)))
				{
					ans.deg=i;return ans;
				}
				ans.data.pop_back();
			}
			ans.data.push_back(zero),ans.deg=0;

			return ans;

		}
	}

	polynomial operator-()
	{
		polynomial ans=*this;
		for(int i=0;i<=deg;i++)
		{
			if(!(ans.data[i]==zero)) ans.data[i].zi.hao*=-1;
		}
		return ans;
	}

	int operator==(polynomial tmp)
	{
		if(deg!=tmp.deg) return 0;
		for(int i=0;i<=deg;i++)
		{
			if(!(data[i]==tmp.data[i])) return 0;
		}
		return 1;
	}

	polynomial operator/(polynomial x)
	{
		polynomial ans,tmp=*this;
		if(tmp.deg<x.deg)  {ans.deg=0;ans.data.push_back(zero);return ans;}
		ans.deg=tmp.deg-x.deg;ans.data.resize(ans.deg+1);
		for(int i=ans.deg;i>=0;i--)
		{
			ans.data[i]=tmp.data[x.deg+i]/x.data[x.deg];
			for(int j=x.deg-1;j>=0;j--)
			{//cout<<"sddsds";
				tmp.data[i+j]=tmp.data[i+j]-ans.data[i]*x.data[j];
			}
		}

		return ans;
	 }

	polynomial operator/(Rn x)
	{
		polynomial ans;
		ans.deg=deg;
		ans.data.resize(deg+1);
		for(int i=0;i<=ans.deg;i++)
		{
			ans.data[i]=data[i]/x;
		}
		return ans;
	 }


	polynomial operator%(polynomial x)
	{
		polynomial ans,tmp=*this;
		if(tmp.deg<x.deg)  return tmp;
		ans.deg=tmp.deg-x.deg;ans.data.resize(ans.deg+1);
		for(int i=ans.deg;i>=0;i--)
		{
			ans.data[i]=tmp.data[x.deg+i]/x.data[x.deg];
			for(int j=x.deg-1;j>=0;j--)
			{//cout<<"sddsds";
				tmp.data[i+j]=tmp.data[i+j]-ans.data[i]*x.data[j];
			}
		}
		tmp.data.resize(x.deg);tmp.deg=0;
		for(int i=x.deg-1;i>=0;i--)
		{
			if(!(tmp.data[i]==zero)) {tmp.deg=i;return tmp;}
			tmp.data.pop_back();
		}
		tmp.data.push_back(zero);
		return tmp;
	 }

	 pair<polynomial,polynomial> operator|(polynomial x)
	{
		polynomial ans,tmp=*this;
		if(tmp.deg<x.deg)
		{
		ans.deg=0;ans.data.push_back(zero);
		pair<polynomial,polynomial> anss;
		anss.first=ans;anss.second=tmp;return anss;
		}
		ans.deg=tmp.deg-x.deg;ans.data.resize(ans.deg+1);
		for(int i=ans.deg;i>=0;i--)
		{
			ans.data[i]=tmp.data[x.deg+i]/x.data[x.deg];
			for(int j=x.deg-1;j>=0;j--)
			{//cout<<"sddsds";
				tmp.data[i+j]=tmp.data[i+j]-ans.data[i]*x.data[j];
			}
		}
		tmp.data.resize(x.deg);tmp.deg=0;
		int flag=0;
		for(int i=x.deg-1;i>=0;i--)
		{
			if(!(tmp.data[i]==zero)) {tmp.deg=i;flag=1;break;}
			tmp.data.pop_back();
		}
		if(!flag) tmp.data.push_back(zero);
		pair<polynomial,polynomial> anss;
		anss.first=ans;anss.second=tmp;
		return anss;
	 }

	polynomial operator*(polynomial x)
	{
		if(*this==pzero||x==pzero) return pzero;
		polynomial ans;
		ans.deg=deg+x.deg;
		ans.data.resize(ans.deg+1,zero);
		for(int i=ans.deg;i>=0;i--)
		{
			int low=0>(i-x.deg)?0:i-x.deg;
			int high=(i>deg)?deg:i;
			for(int j=low;j<=high;j++)
			{
				ans.data[i]=ans.data[i]+data[j]*x.data[i-j];
			}
		}//cout<<"ss";
		//if(ans.data[ans.deg]==zero&&ans.deg!=0) cout<<"t"<<*this<<"p"<<ans<<"老天爷呀"<<endl;
	    return ans;
	}
//pol a
//2 3 4 5
//run
//a?
	polynomial Derivative_polynomial()//导多项式
	{
		polynomial ans;
		if(deg==0)
		{
		  ans.deg=0;
		  ans.data.push_back(zero);
		  return ans;
		}
		ans.deg=deg-1;
		for(int i=0;i<=ans.deg;i++)
		{
			Rn x=Rn(longx(i+1),longx(1))*data[i+1];
			ans.data.push_back(x);

		}
		return ans;
	}

	Rn discriminant()//判别式
	{
		int g=deg*(deg-1)/2;
		if(g%2==0)  return (one/data[deg])*eliminant(Derivative_polynomial());
		else return (-(one/data[deg]))*eliminant(Derivative_polynomial());
	 }

	Rn eliminant(polynomial g)//结式
	{
	    matrix tmp;tmp.set(g.deg+deg,g.deg+deg);
	    for(int i=1;i<=g.deg;i++)
	    {
	    	for(int j=1;j<=i-1;j++)
	    	tmp.data[i][j]=zero;
			for(int j=i;j<=i+deg;j++)
	    	tmp.data[i][j]=data[deg-j+i];
	    	for(int j=i+deg+1;j<=tmp.l;j++)
	    	tmp.data[i][j]=zero;
		}
		for(int i=g.deg+1;i<=tmp.h;i++)
	    {
	    	for(int j=1;j<=i-g.deg-1;j++)
	    	tmp.data[i][j]=zero;
			for(int j=i-g.deg;j<=i;j++)
	    	tmp.data[i][j]=g.data[i-j];
	    	for(int j=i+1;j<=tmp.l;j++)
	    	tmp.data[i][j]=zero;
		}
		tmp.init();
		//cout<<tmp;
		return tmp.determinant();
	}

	Rn operator()(Rn& x)
	{
		Rn v=data[deg];
		for(int i=deg-1;i>=0;i--)
		{
			v=v*x+data[i];
		}
		return v;
	 }

	matrix operator()(matrix& x)
	{
	    //cout<<"s";
		if(x.h!=x.l)
		{
			  cout<<"improper operation!"<<endl;
		}
		else
		{
			  matrix v=Matrix::I[x.h]*data[deg];
			  for(int i=deg-1;i>=0;i--)
			  {
				  v=v*x+Matrix::I[x.h]*data[i];
			  }
			  return v;
	    }

	 }

	void snormalization()
	{
		for(int i=deg-1;i>=0;i--)
		data[i]=data[i]/data[deg];
		data[deg]=one;
		return;
	}

	polynomial normalization()
	{
		polynomial tmp=*this;
		for(int i=tmp.deg-1;i>=0;i--)
		tmp.data[i]=tmp.data[i]/tmp.data[deg];
		tmp.data[deg]=one;
		return tmp;
	}

};

vector<Rn> e0={zero};
vector<Rn> e1={one};
polynomial pone(0,e1);
polynomial pzero(0,e0);


istream& operator>>(istream& in,polynomial& po)
{
	in>>po.deg;po.data.resize(1+po.deg);
	for(int i=0;i<=po.deg;i++)
	{
	  in>>po.data[po.deg-i];
	}
	return in;
}

ostream& operator<<(ostream& out,const polynomial& po)
{
	//out<<"s"<<po.deg<<"s"<<po.data[po.deg].mu<<"s";
	if(po.deg==0)
	{
		out<<po.data[0];return out;
	}
	if(po.deg==1)
	{
		Rn tmp1=po.data[1];
		Rn tmp0=po.data[0];
		if(!(tmp1.zi==longx(0)))
	   {
	    if(tmp1==one) out<<"x";
	    else if(tmp1==-one) out<<"-x";
	    else out<<po.data[1]<<"x";
	    }
	    if(tmp0.zi==longx(0)) return out;
	    if(tmp0.zi.hao==1)
	    out<<"+";
		out<<po.data[0];
	    return out;
	}

    Rn d=po.data[po.deg];
	if(d==one) out<<"x^"<<po.deg;
	else if(d==-one) out<<"-x^"<<po.deg;
	else out<<po.data[po.deg]<<"x^"<<po.deg;

	for(int i=po.deg-1;i>=2;i--)
	{
	    d=po.data[i];
		if(d.zi==longx(0))
		continue;
		if(d.zi.hao==1)
		out<<"+";
		if(d==one) out<<"x^"<<i;
		else if(d==-one) out<<"-x^"<<i;
		else out<<po.data[i]<<"x^"<<i;
	}

	Rn tmp1=po.data[1];
    Rn tmp0=po.data[0];
	if(!(tmp1.zi==longx(0)))
	{
	if(tmp1.zi.hao==1)
	out<<"+";
	if(tmp1==one) out<<"x";
	else if(tmp1==-one) out<<"-x";
	else out<<po.data[1]<<"x";
	}
	if(tmp0.zi==longx(0)) return out;
	if(tmp0.zi.hao==1)
	out<<"+";
	out<<po.data[0];
	return out;
}

polynomial gcd(polynomial a,polynomial b)
{

   // a.print();cout<<" ";b.print();cout<<endl;
    //cout<<a<<endl<<endl<<b<<endl<<endl;
	if(a==pzero) return b;
	if(b==pzero) return a;	//a.print();cout<<"  ";//b.print();cout<<" "<<a.len;cout<<endl;
	if(a.deg>b.deg)
	{polynomial tmp=a;a=b;b=tmp;}
	polynomial  t=b%a;///cout<<"sss";
	if(t==pzero){return a.normalization();}
	return gcd(t,a);
}


class fraction
{
public:
    polynomial mu=pone;
	polynomial zi;

	fraction(){mu=pone;}
	fraction(polynomial zi0,polynomial mu0)
	{
	if(mu0==pzero) {cout<<"improper construction"<<endl;return;}
	//cout<<endl<<zi0<<endl<<mu0<<endl;
	   zi=zi0;mu=mu0;
	}

	friend istream& operator>>(istream& in,fraction& fra);
	friend ostream& operator<<(ostream& out,fraction& fra);

	void huajian()
	{
		polynomial yinzi=gcd(zi,mu);//zi.print();mu.print();//yinzi.print();cout<<endl;
		zi=zi/yinzi;mu=mu/yinzi;
	}

	fraction operator+(fraction x)
	{
		polynomial yinzi=gcd(mu,x.mu);
		polynomial t=x.mu/yinzi;
		polynomial mu_new=mu*t ;
		polynomial zi_new=zi*t+x.zi*(mu/yinzi);
		fraction tmp(zi_new,mu_new);
		return tmp;
	}

	fraction operator-(fraction x)
	{
		polynomial yinzi=gcd(mu,x.mu);
		polynomial t=x.mu/yinzi;
		polynomial mu_new=mu*t ;
		polynomial zi_new=zi*t-x.zi*(mu/yinzi);
		fraction tmp(zi_new,mu_new);
		return tmp;
	}

	fraction operator-()
	{
		fraction tmp=*this;
		tmp.zi=-tmp.zi;
		return tmp;
	}

	fraction operator*(fraction x)
	{
//		polynomial yinzi1=gcd(mu,x.zi);
//		polynomial yinzi2=gcd(zi,x.mu);cout<<yinzi1<<endl<<yinzi2;
		fraction tmp(zi*x.zi,mu*x.mu);
		return tmp;
	}

	fraction operator/(fraction x)
	{
	//	pmatrix a;
		fraction tmp(zi*x.mu,mu*x.zi);
		return tmp;
	}

};

istream& operator>>(istream& in,fraction& fra)
{
	in>>fra.zi>>fra.mu;
	fra.huajian();
	return in;
}

ostream& operator<<(ostream& out, fraction& fra)
{

	if(fra.mu.deg!=0)  {cout<<fra.zi<<"|"<<fra.mu;}else {polynomial x=fra.zi/fra.mu;cout<<x;}
	return out;
}

class Ematrix
{
	public:
	int h,l;
	vector<vector<fraction> > data;
	int pan[maxl];
	Ematrix(){};
	Ematrix(matrix &x)
	{

		int flag=1;
		if(x.h!=x.l)  {cout<<"improper construction of Ematrix!"<<endl;flag=0;}
		if(flag)
		{
		    h=x.h;l=x.l;
			data.resize(h+1,vector<fraction>(l+1));
			for(int i=1;i<=h;i++)
			for(int j=1;j<=l;j++)
			{
				if(i!=j)
				{
					data[i][j].zi.deg=0;
					data[i][j].zi.data.push_back(-x.data[i][j]);
				}
				else
				{
					data[i][j].zi.deg=1;
					data[i][j].zi.data.push_back(-x.data[i][j]);
					data[i][j].zi.data.push_back(one);
				}
			}
		}

		for(int i=1;i<=h;i++)pan[i]=0;
	}

	void swaph(int x,int y)
	{
	    data[x].swap(data[y]);
	}

	void swapl(int x,int y)
	{
	    fraction tmp;
		for(int i=1;i<=h;i++)
		{
			tmp=move(data[i][x]);
			data[i][x]=move(data[i][y]);
			data[i][y]=move(tmp);
		}
	}

	polynomial determinant1()
	{
		Ematrix tmp=*this;
		int hao=1;
		for(int i=1;i<=h;i++)
		{//cout<<i;
		    //cout<<tmp.data[i][i];
			if(tmp.data[i][i].zi==pzero)
			{//cout<<i;
				for(int j=i+1;j<=h;j++)
				{
					if(!(tmp.data[j][i].zi==pzero))
					{
						tmp.swaph(i,j);	hao=-hao;break;
					}
				}
			}
			for(int j=i+1;j<=h;j++)
			{
				fraction g=tmp.data[j][i]/tmp.data[i][i];
				for(int k=i+1;k<=l;k++)
				{
					tmp.data[j][k]=	tmp.data[j][k]-g*tmp.data[i][k];
				}
			}
		}

		fraction t;t.zi=pone;
		for(int i=1;i<=h;i++)
		{
			t=t*tmp.data[i][i];
		}
		if(hao<0) t.zi=-t.zi;
		return t.zi/t.mu;
	}

	polynomial dfs(int r)
	{
    if(r==1)
	for(int i=1;i<=h;i++)
    if(pan[i]==0)  return data[i][h-r+1].zi;
    polynomial ans=pzero;
	int flag=1;
      for(int i=1;i<=h;i++)
      {
        if(pan[i]==0)
        {
         flag=1-flag;
         pan[i]=1;
	     if(flag) {ans=ans-(data[i][h-r+1].zi*dfs(r-1));pan[i]=0;}
	     else     {ans=ans+(data[i][h-r+1].zi*dfs(r-1));pan[i]=0;}

        }
      }
      return ans;
    }

	polynomial determinant2()
	{
    return dfs(h);
    }

    void clear(int x)
    {
    	if(data[x][x].zi.deg==0)
    	{
    		 for(int j=x+1;j<=l;j++)
			{
			    polynomial g=data[x][j].zi/data[x][x].zi;
				data[x][j].zi=pzero;
			    for(int i=x+1;i<=h;i++)
    			{
				   data[i][j].zi=data[i][j].zi-g*data[i][x].zi;
			    }
			}
			    for(int i=x+1;i<=h;i++)
    			{
				   data[i][x].zi=pzero;
			    }
//	 cout<<x<<"s"<<endl;
//	 for(int i=1;i<=h;i++)
//     {
//     for(int j=1;j<=l;j++)
//	 cout<<data[i][j]<<" ";
//	 cout<<endl;
//	 }
		return;
		}

		int f1=1,f2=1;
    	while((f1+f2)!=0)
    	{
		    f1=0;f2=0;
    		for(int i=x+1;i<=l;i++)//检查行是否消完
    		{
    			pair<polynomial,polynomial> g=data[x][i].zi|data[x][x].zi;
				if(!(g.second==pzero))
				{
				  f1=1;
				  data[x][i].zi=g.second;
				  for(int j=x+1;j<=h;j++)
				  data[j][i].zi=data[j][i].zi-data[j][x].zi*g.first;
				  swapl(x,i);
				  break;
				}
			}

			for(int i=x+1;i<=h;i++)//检查列是否消完
    		{
    			pair<polynomial,polynomial> g=data[i][x].zi|data[x][x].zi;
				if(!(g.second==pzero))
				{
				  f2=1;
				  data[i][x].zi=g.second;
				  for(int j=x+1;j<=l;j++)
				  data[i][j].zi=data[i][j].zi-data[x][j].zi*g.first;
				  swaph(x,i);
				  break;
				}
			}
		}

		for(int i=x+1;i<=h;i++)
		{
		  polynomial g=data[i][x].zi/data[x][x].zi;
		  data[i][x].zi=pzero;
		   for(int j=x+1;j<=l;j++)
		   {
		       data[i][j].zi=data[i][j].zi-g*data[x][j].zi;
		   }
		}

		for(int i=x+1;i<=h;i++)
		{
		   data[x][i].zi=pzero;
		}



//	cout<<x<<endl;
//    for(int i=1;i<=h;i++)
//     {
//     for(int j=1;j<=l;j++)
//	 cout<<data[i][j]<<" ";
//	 cout<<endl;
//	 }
		return;
	}
};

polynomial matrix::characteristic_polynomial()
{
   Ematrix x(*this);
   return x.determinant2();
}

matrix matrix::Hessenberg()
{
   matrix tmp=*this;
   for(int i=1;i<=h;i++)
   {
   	    int j=i+1;
		for(int k=i+1;k<=h;k++){if(!(tmp.data[k][i]==zero)) {j=k;break;}}
		if(j!=i+1){
			tmp.swaph(i+1,j);
			tmp.swapl(i+1,j);
		}
		if(i+1<=h&&tmp.data[i+1][i]==zero) continue;
		for(int j=i+2;j<=h;j++)
		{
			Rn g=tmp.data[j][i]/tmp.data[i+1][i];
			for(int k=1;k<=h;k++)
			tmp.data[j][k]=tmp.data[j][k]-g*tmp.data[i+1][k];
			for(int k=1;k<=h;k++)
			tmp.data[k][i+1]=tmp.data[k][i+1]-g*tmp.data[k][j];
	    }
   }
   tmp.init();
   return tmp;
}

vector<polynomial> matrix::invariant_factor()
{    //cout<<"33";
     Ematrix t(*this);
//     for(int i=1;i<=h;i++)
//     for(int j=1;j<=l;j++)
//	 cout<<t.data[i][j]<<endl;
     if(h!=l)
     {
     	cout<<"improper requirement!"<<endl;
	 }
	 for(int r=1;r<=h-1;r++)
	 {
//	 	cout<<r<<"sd";
//	 for(int i=1;i<=h;i++)
//     {
//    cout<<endl;
//	 for(int j=1;j<=l;j++)
//     cout<<t.data[i][j]<<" ";
//	 }
	 	int flag=1;int minn=t.data[r][r].zi.deg;
	 	int length=t.data[r][r].zi.data[t.data[r][r].zi.deg].length();
		int x=r,y=r;
	 	for(int i=r;i<=h;i++)
	 	for(int j=r;j<=l;j++)
	 	{
		    if(t.data[i][j].zi==pzero) continue;
		    int f=t.data[i][j].zi.deg;
	 		if(f<minn||(f==minn&&t.data[i][j].zi.data[f].length()<length))
	 		{
	 			minn=t.data[i][j].zi.deg;
	 			length=t.data[i][j].zi.data[f].length();
	 			x=i,y=j;
			}
		 }
		if(x!=r) t.swaph(x,r);
		if(y!=r) t.swapl(y,r);

		while(flag)
		{
			t.clear(r);
			flag=0;
			for(int i=r+1;i<=h;i++)
			{
				if(flag) break;
				for(int j=r+1;j<=l;j++)
			    {
					  polynomial g=t.data[i][j].zi%t.data[r][r].zi;
					  if(!(g==pzero))
					  {
						 flag=1;
						 for(int k=r+1;k<=l;k++)
						 {
						   if(k==j) continue;
						   t.data[r][k].zi=t.data[i][k].zi;
						 }
						 t.data[r][j].zi=g;
						 t.swapl(r,j);
						 break;
					  }
			    }
			}
		}
//		cout<<r<<" ";
//		cout<<t.data[r][r].zi<<endl;
     }
	 vector<polynomial> ans;
	 ans.push_back(pzero);
	 for(int i=1;i<=h;i++)
	 {
	 t.data[i][i].zi.snormalization();
	 ans.push_back(t.data[i][i].zi);
	 }
	 return ans;
}

polynomial matrix::minimal_polynomial()
{
	vector<polynomial> ans=invariant_factor();
	return ans[h];
}

matrix matrix::frobenius_normalform()
{
	vector<polynomial> g=invariant_factor();//cout<<"ss";
	matrix ans;ans.set(h,l);
	for(int i=1;i<=h;i++)
	for(int j=1;j<=l;j++)
	ans.data[i][j]=zero;
	int x=1;
	for(int i=1;i<=h;i++)
	{
		//cout<<i;
		if(g[i].deg==0) continue;
		for(int j=x+1;j<=x+g[i].deg-1;j++)
		ans.data[j][j-1]=one;
		int t=0;
		for(int j=x;j<=x+g[i].deg-1;j++)
		{
			ans.data[j][x+g[i].deg-1]=-g[i].data[t];t++;
		}
		x+=g[i].deg;
	}
	ans.init();
	return ans;
}


pair<matrix,matrix> matrix::Quadratic_standardization()
{
    pair<matrix,matrix> ans;ans.first.h=ans.second.h=0;
    ans.first.init();ans.second.init();
	int u=0;if(h!=l) u=1;
	for(int i=1;i<=h;i++)for(int j=1;j<=l;j++)if(data[i][j]!=data[j][i])  u=1;
	if(u)  {cout<<"Not a symmetric matrix!"<<endl;return ans;}
	else
	{
		matrix I=Matrix::I[h];
		matrix tmp=*this;
		for(int i=1;i<=h-1;i++)
		{

			if(tmp.data[i][i]==zero)
			{//cout<<"ssss";
				int f=1;
				for(int j=i+1;j<=h;j++)
				{
					if(tmp.data[j][j]!=zero)
					{
						tmp.swaph(i,j);
						tmp.swapl(i,j);
						I.swaph(i,j);
						f=0;break;
					}
				}
//				3 3
//				0 1 2
//				1 0 -2
//				2 -2 0
				for(int j=i+1;j<=h;j++)
				{
				    if(!f) break;
					for(int k=i;k<j;k++)
				    {
					  if(tmp.data[j][k]!=zero)
					  {//cout<<j<<"kk "<<k;
						tmp.tranl(k,j,one);
						tmp.tranh(k,j,one);
						tmp.swaph(i,j);
						tmp.swapl(i,j);
						I.tranh(k,j,one);
						I.swaph(i,j);
						f=0;break;
					   }
				    }
				}
				if(f)
				{
					tmp.init();I.init();
		            ans.first =tmp;
		            ans.second=I;
		            return ans;
				}
		    }

			for(int j=i+1;j<=h;j++)
			{
			    Rn p=-(tmp.data[j][i]/tmp.data[i][i]);
				tmp.tranh(i,j,p);
				//cout<<tmp;
				tmp.tranl(i,j,p);
				//cout<<tmp;
				I.tranh(i,j,p);
			}
		}
		tmp.init() ;
		ans.first =tmp;
		ans.second=I.transform();
		return ans;
	}
}

Rn factorial(Rn &x,int t)
{    //cout<<"s"<<x.mu<<"s"<<x.zi.hao;
	if(!(x.mu==longx(1))||x.zi.hao==-1)
	{//cout<<"s";
		cout<<"math error!"<<endl;
		return one;
	}
	longx ans=x.zi;
	if(x.zi==longx(0))  return one;
	longx r=longx((x.zi)%longx(t));
	if(r==longx(0)) r=longx(t);
	longx begin=x.zi-longx(t),end=r-longx(t);
	longx i;
	for( i=begin;i>end;i=i-longx(t) )
	{
		ans=ans*i;
	}
	return Rn(ans,longx(1));
}

//pollardrho
longx quick_powerL(longx base, int power)//
{
	if(power==0)
	{
		if(base!=longx(0)) return longx(1);  else{cout<<"math error!"<<endl;}
	}
	else
	{
	longx result=base;
	power--;
	while (power > 0)
	{
		if (power & 1)
		result =result*base;
		power >>= 1;
		base = base*base;
	}
	return result;
	}
}

Rn  quick_powerR(Rn base, int power)//
{
	int f=0;
	if(power==0)
	{
		if(!(base==zero)) return one; else{cout<<"math error!"<<endl;}
	}
	else
	{
	if(power<0) {f=1;power=-power;}
	   Rn result=base;
	   power--;
	   while (power > 0)
	   {
	      if (power & 1)
		  result =result*base;
		  power >>= 1;
		  base = base*base;
	   }
	if(f) return one/result;
	return result;
	}
}

matrix quick_powerM(matrix base, int power)
{
	if(power<=0)
	{cout<<"math error"<<endl;}
	else
	{
	   matrix result=base;
	   power--;
	   while (power > 0)
	   {
		    if (power & 1)
		    result =result*base;
		    power >>= 1;
	    	base = base*base;
	   }
	return result;
	}
}

polynomial  quick_powerP(polynomial base, int power)//
{
	if(power<=0)
	{
		cout<<"math error"<<endl;
	}
	else
	{
	   polynomial result=base;
	   power--;
	   while (power > 0)
	   {
		    if (power & 1)
		    result =result*base;
		    power >>= 1;
	    	base = base*base;
	   }
	   return result;
	}
}

polynomial exgcd(polynomial a,polynomial b,polynomial &x,polynomial &y)
{
	if(b==pzero)
	{
		x=pone/a.data[a.deg];y=pzero;
		return a/a.data[a.deg];
	}
	polynomial r=exgcd(b,a%b,x,y);
	polynomial tmp=y;
	y=x-(a/b)*y;
	x=tmp;
	return r;
}

longx exgcd(longx a,longx b,longx &x,longx &y)
{
	if(b==longx(0))
	{
		x=longx(1);y=longx(0);
		return a;
	}
	longx r=exgcd(b,a%b,x,y);
	longx tmp=y;
	y=x-(a/b)*y;
	x=tmp;
	return r;
}

int prio(char x)
{
    if(x=='+'||x=='-') return 1;
    if(x=='*'||x=='/') return 2;
    if(x=='^'||x=='%') return 3;
    if(x=='{'||x=='!'||x=='?') return 4;
    return 0;
}

int pan(char x)
{

	if(x>='0'&&x<='9') return 1;
	if(x=='.') return 1;
	if(x>='a'&&x<='z') return 2;
	if(x>='A'&&x<='Z') return 2;
	return 0;
}

int num(char x)
{
		if(x=='!'||x=='?') return 1;
		return 2;
}

int find(string x,int t)
{
	int m=x.length();
	for(int i=t;i<=m-1;i++)
	{
		if(pan(x.at(i))==0) return i-t;
	}
	return m-t;
}
char storechar[16]={'+','-','*','/','^','!','(',')','[',']','{','}','?','%',' ','.'};
char storechar1[13]={'+','-','*','/','^','(',')','[',']','%','!',' ','.'};
int hefa(char x)
{
	if(x>='a'&&x<='z') return 1;
	if(x>='A'&&x<='Z') return 1;
	if(x>='0'&&x<='9') return 1;
	for(int i=0;i<=15;i++)
	if(x==storechar[i]) return 1;
	return 0;
}

int hefa1(char x)
{
	if(x>='a'&&x<='z') return 1;
	if(x>='A'&&x<='Z') return 1;
	if(x>='0'&&x<='9') return 1;
	for(int i=0;i<=12;i++)
	if(x==storechar1[i]) return 1;
	return 0;
}

class calculator{

	public:
    vector<longx> dataL;
	vector<Rn> dataR;
    vector<matrix> dataM;
    vector<polynomial> dataP;
    int result=0;
    int OOP=1;
    void showdata()
    {
    	cout<<"Bit reserved:"<<shuwei<<endl;
	    int x0=dataL.size();
    	int x1=dataR.size();
    	int x2=dataM.size();
    	int x3=dataP.size();
		if(x0!=0)
        {
        cout<<"long integer:"<<endl;
		for(int i=0;i<x0;i++)
		cout<<dataL[i].name<<": "<<dataL[i]<<endl;
		}
		if(x1!=0)
        {
	        cout<<"Rational number:"<<endl;
	        if(OOP==1)
			for(int i=0;i<x1;i++)
			cout<<dataR[i].name<<": "<<dataR[i]<<endl;
			else
			{
			for(int i=0;i<x1;i++){cout<<dataR[i].name<<": ";dataR[i].zhiprint();cout<<endl; }
			OOP=1;
			}
		}
		if(x2!=0)
        {
        cout<<"Martix:"<<endl;
		for(int i=0;i<x2;i++)
		cout<<dataM[i].name<<": "<<endl<<dataM[i];
		}
        if(x3!=0)
        {
        cout<<"Polynomial:"<<endl;
		for(int i=0;i<x3;i++)
		cout<<dataP[i].name<<": "<<dataP[i]<<endl;
	    }
		return;
	}
    int searchL(string x,longx & L)
    {
    	int t=dataL.size() ;
    	for(int i=0;i<=t-1;i++)
    	if(dataL[i].name==x)
		{
			L=dataL[i];
			return i;
		}
		return -1;
	}

	int searchR(string x,Rn & R)
    {
    	int t=dataR.size() ;
    	for(int i=0;i<=t-1;i++)
    	if(dataR[i].name==x)
		{
			R=dataR[i];
			return i;
		}
		return -1;
	}

	int searchM(string x,matrix & M)
    {
    	int t=dataM.size() ;
    	for(int i=0;i<=t-1;i++)
    	if(dataM[i].name==x)
		{
			M=dataM[i];
			return i;
		}
		return -1;
	}

	int searchP(string x,polynomial & P)
    {
    	int t=dataP.size() ;
    	for(int i=0;i<=t-1;i++)
    	if(dataP[i].name==x)
		{
			P=dataP[i];
			return i;
		}
		return -1;
	}

	void clear()
	{
		result=0;
		int x0=dataL.size();
		int x1=dataR.size();
    	int x2=dataM.size();
    	int x3=dataP.size();
    	for(int i=0;i<x0;i++)
    	dataL.pop_back() ;
		for(int i=0;i<x1;i++)
    	dataR.pop_back() ;
    	for(int i=0;i<x2;i++)
    	dataM.pop_back() ;
    	for(int i=0;i<x3;i++)
    	dataP.pop_back() ;
    	return;
	}

	string ans_name()
	{
		if(result==0) return "ans0";
		int h=result;
		string f="ans";
		while(h>0)
		{
			f+=char(h%10+int('0'));
			h/=10;
		}
		return f;
	}

	void cal_integer(string x)
	{
		vector<pair<string,int>> infix;
		int len=x.length();

		//表达式初始化,在表达式中添加l0,删去空格
		for(int i=0;i<len;i++)
		{
		    if(hefa(x.at(i))==0) {cout<<"expression error!";return;}
			if(x.at(i)=='-'||x.at(i)=='+')
			{
				if(i==0)
				{
					x.insert(0,1,'0'); len++;continue;
				}
				if(i>=1)
				{
				  if(x.at(i-1)=='(')
				  {
				  	x.insert(i,1,'0'); len++;continue;
				  }
				}
			}
			if(x.at(i)==' ')
			{
				x.erase(i,1);i--;
				len--;continue;
			}
		}
		int index=0;
		//cout<<len;
		//将长表达式分拆
		while(index<=len-1)//0是符号,1是输进去的数,2是变量的字母代号
		{
			//cout<<index<<endl;
			pair<string,int> tmp;
			if(pan(x.at(index))==0) //运算符号
			{
			tmp.first=x.substr(index,1);
			tmp.second=0;
			index++;
			infix.push_back(tmp);
			}
			else if(pan(x.at(index))==1)//数本身
			{
			int y=find(x,index);
			tmp.first=x.substr(index,y);
			tmp.second=1;
			index+=y;
			infix.push_back(tmp);
			}
			else if(pan(x.at(index))==2)//字母代号
			{
			int y=find(x,index);
			tmp.first=x.substr(index,y);
			tmp.second=2;
			index+=y;
			infix.push_back(tmp);
			}
		}
		int k=infix.size();
//		for(int i=0;i<=k-1;i++)
//		cout<<infix[i].first<<"g g"<<infix[i].second<<endl;
        //中缀转后缀
       stack<char> symbol;//符号栈
       vector<tuple<int,longx,char> > suffix;//中缀表达式
       for(int i=0;i<=k-1;i++)
       {
       	  string data=infix[i].first;
          int h=infix[i].second;
		  //cout<<"s"<<endl;
       	  if(h==1)//数字
       	  {
       	      tuple<int,longx,char> k;
       	      longx longinteger;longinteger.input(data);
       	      get<0>(k)=1;//运算对象
       	      get<1>(k)=longinteger;
       	      suffix.push_back(k);
		     }
		  if(h==2)//名字
       	  {
       	      tuple<int,longx,char> k;
       	      longx longinteger;
       	      int g=searchL(data,longinteger);
       	      if(g==-1) {cout<<"no such object found!"<<endl;return;}
       	      get<0>(k)=1;//运算对象
       	      get<1>(k)=longinteger;
       	      suffix.push_back(k);
		     }
		  if(h==0)//符号
       	  {
       	        char d=data.at(0);
       	        if(symbol.empty()||(d=='(')) {symbol.push(d);continue;}
       	        if(d==')')
				{
				 	  while(1)
				 	  {
				 		char g=symbol.top();
				 		if(g=='(') {symbol.pop();break;}
						tuple<int,longx,char> k;
						get<0>(k)=0;//运算符号
       	                get<2>(k)=g;
       	                suffix.push_back(k);
       	                symbol.pop();
					   }
					   continue;
				}
				int l=prio(d);
			    while((!symbol.empty())&&(l<=prio(symbol.top())))
			    {
			    		char g=symbol.top();
						tuple<int,longx,char> k;
						get<0>(k)=0;//运算符号
       	                get<2>(k)=g;
       	                suffix.push_back(k);
       	                symbol.pop();
				}
				symbol.push(d);
		     }
	   }
		        while(!symbol.empty())//剩余符号输出
			    {
			    		char g=symbol.top();
						tuple<int,longx,char> k;
						get<0>(k)=0;//运算符号
       	                get<2>(k)=g;
       	                suffix.push_back(k);
       	                symbol.pop();
				}


		//开始计算
		stack<longx> integer;
		int m=suffix.size();
//		for(int i=0;i<=m-1;i++)
//		cout<<get<1>(suffix[i])<<"   "<<get<2>(suffix[i])<<endl;
		for(int i=0;i<=m-1;i++)
		{
		    tuple<int,longx,char> k=suffix[i];
		    int lei=get<0>(k);
		    if(lei==1)//数字
		    {
		    	integer.push(get<1>(k));
			 }
			if(lei==0)//运算符
			{
				longx b=integer.top();
				integer.pop();
				longx a=integer.top();
				longx ans;
				integer.pop();
				char x=get<2>(k);
				switch(x)
                {
                  case '+':{ans=a+b;break;}
                  case '-':{ans=a-b;break;}
                  case '*':{ans=a*b;break;}
                  case '/':{ans=a/b;break;}
                  case '^':{ans=quick_powerL(a,b.transtoint());break;}
                  case '%':{ans=a%b;break;}
				}
				integer.push(ans);
			 }

		}
//6985+(89-(3*6/9)+6^2*2)*(5*896+698/2*(-78))
    longx ans=integer.top();
    ans.name=ans_name();
    dataL.push_back(ans);
	result++;
	cout<<ans<<endl;
	return;
	}

	Rn cal_rationalnumber(string x)
    {
    	vector<pair<string,int> > infix;
		int len=x.length();
		//表达式初始化,在表达式中添加l0,删去空格
		for(int i=0;i<len;i++)
		{
			if(hefa(x.at(i))==0) {cout<<"expression error!";return zero;}
			if(x.at(i)=='-'||x.at(i)=='+')
			{
				if(i==0)
				{
					x.insert(0,1,'0'); len++;continue;
				}
				if(i>=1)
				{
				  if((x.at(i-1)=='(')||(x.at(i-1)=='['))
				  {
				  	x.insert(i,1,'0'); len++;continue;
				  }
				}
			}
			if(x.at(i)==' ')
			{
				x.erase(i,1);i--;
				len--;continue;
			}
			if(!hefa1(x.at(i)))
			{
				cout<<"expression error!"<<endl;
				return zero;
			}
		}
		int index=0;

		//cout<<len;
		//将长表达式分拆
		while(index<=len-1)//0是符号,1是输进去的数,2是变量的字母代号
		{
			//cout<<index<<endl;
			pair<string,int> tmp;
			if(pan(x.at(index))==0) //运算符号
			{
			tmp.first=x.substr(index,1);
			tmp.second=0;
			index++;
			infix.push_back(tmp);
			}
			else if(pan(x.at(index))==1)//数本身
			{
			int y=find(x,index);
			tmp.first=x.substr(index,y);
			tmp.second=1;
			index+=y;
			infix.push_back(tmp);
			}
			else if(pan(x.at(index))==2)//字母代号
			{
			int y=find(x,index);
			tmp.first=x.substr(index,y);
			tmp.second=2;
			index+=y;
			infix.push_back(tmp);
			}
		}
		int k=infix.size();
//		for(int i=0;i<=k-1;i++)
//		cout<<infix[i].first<<" "<<infix[i].second<<endl;
        //中缀转后缀
       stack<char> symbol;//符号栈
       vector<tuple<int,Rn,char> > suffix;//中缀表达式
       for(int i=0;i<=k-1;i++)
       {
       	  string data=infix[i].first;
          int h=infix[i].second;
		  //cout<<"s"<<endl;
       	  if(h==1)//数字
       	  {
       	      tuple<int,Rn,char> k;
       	      Rn rationalnumber;rationalnumber.input(data);
       	      get<0>(k)=1;//运算对象
       	      get<1>(k)=rationalnumber;
       	      suffix.push_back(k);
		     }
		  if(h==2)//名字
       	  {
       	      tuple<int,Rn,char> k;
       	      Rn rationalnumber;
       	      int g=searchR(data,rationalnumber);
       	      if(g==-1) {cout<<"no such object found!"<<endl;return zero;}
       	      get<0>(k)=1;//运算对象
       	      get<1>(k)=rationalnumber;
       	      suffix.push_back(k);
		     }
		  if(h==0)//符号
       	  {
       	        char d=data.at(0);
       	        if(symbol.empty()||(d=='(')||(d=='[')) {symbol.push(d);continue;}
       	        if((d==')')||(d==']'))
				{
				 	  while(1)
				 	  { //23*[-3]
				 		char g=symbol.top();//cout<<g;
				 		if(g=='(') {symbol.pop();break;}
				 		if(g=='[')
						{//cout<<"s";
						 tuple<int,Rn,char> k;
						 get<0>(k)=0;
						 get<2>(k)=g;
						 symbol.pop();
						 suffix.push_back(k);break;
						}
						tuple<int,Rn,char> k;
						get<0>(k)=0;//运算符号
       	                get<2>(k)=g;
       	                suffix.push_back(k);
       	                symbol.pop();
       	                //if(symbol.empty()) break;
					  }
					   continue;
				}
				int l=prio(d);
			    while((!symbol.empty())&&(l<=prio(symbol.top())))
			    {
			    		char g=symbol.top();
						tuple<int,Rn,char> k;
						get<0>(k)=0;//运算符号
       	                get<2>(k)=g;
       	                suffix.push_back(k);
       	                symbol.pop();
				}
				symbol.push(d);
		     }
	    }

		while(!symbol.empty())//剩余符号输出
	    {
	    		char g=symbol.top();
				tuple<int,Rn,char> k;
				get<0>(k)=0;//运算符号
                get<2>(k)=g;
                suffix.push_back(k);
                symbol.pop();
		}

		//开始计算
		stack<Rn> rational;
		int m=suffix.size();
//		for(int i=0;i<=m-1;i++)
//		cout<<get<1>(suffix[i])<<"   "<<get<2>(suffix[i])<<endl;
		for(int i=0;i<=m-1;i++)
		{
		    tuple<int,Rn,char> k=suffix[i];
		    int lei=get<0>(k);
		    if(lei==1)//数字
		    {
		    	rational.push(get<1>(k));
			 }
			if(lei==0)//运算符
			{
			    Rn ans;
				char x=get<2>(k);
				switch(x)
                {
                  case '+':{ Rn b=rational.top();rational.pop();Rn a=rational.top(); ans=a+b;rational.pop();break;}
                  case '-':{ Rn b=rational.top();rational.pop();Rn a=rational.top(); ans=a-b;rational.pop();break;}
                  case '*':{ Rn b=rational.top();rational.pop();Rn a=rational.top(); ans=a*b;rational.pop();break;}
                  case '/':{ Rn b=rational.top();rational.pop();Rn a=rational.top(); ans=a/b;rational.pop();break;}
                  case '^':{ Rn b=rational.top();rational.pop();Rn a=rational.top(); rational.pop();if(!(b.mu==longx(1))) {cout<<"power limited!"<<endl;break;}ans=quick_powerR(a,b.zi.transtoint());break;}
				  case '[':{ Rn a=rational.top();ans=a.abs();rational.pop();break;}
				  case '!':{ Rn a=rational.top();rational.pop();if(a.mu!=1) {cout<<"math error!";return zero;} int v=1;while(get<2>(suffix[i+1])=='!'){i++;v++;}ans=factorial(a,v);break;}
				}
				rational.push(ans);
			 }
		}
//6985+(89-(3*6/9)+6^2*2)*(5*896+698/2*(-78))
	return rational.top();
	}

    string begin[maxl],end[maxl];
	int variable_number,r;
	int type[maxl];
	string exp;

	Rn dfssigma_pai(int x)
    {

    	if(x==variable_number+1) return cal_rationalnumber(exp);
    	Rn start=cal_rationalnumber(begin[x]),desti=cal_rationalnumber(end[x]);
		//cout<<x<<" "<<start<<" "<<desti<<endl;
    	if(start.mu!=longx(1)||desti.mu!=longx(1)) {cout<<"math error!";return zero;}
		if(type[x]==1)
		{
		   Rn ans=zero;dataR[r+x-1].zi=start.zi;
    	   while((dataR[r+x-1].zi<desti.zi)||(dataR[r+x-1].zi==desti.zi))
    	   {
	    		ans=ans+dfssigma_pai(x+1);
	    		dataR[r+x-1].zi=dataR[r+x-1].zi+longx(1);
           }
           return ans;
		}
		if(type[x]==2)
		{
		   Rn ans=one;dataR[r+x-1].zi=start.zi;
    	   while((dataR[r+x-1].zi<desti.zi)||(dataR[r+x-1].zi==desti.zi))
    	   {
	    		ans=ans*dfssigma_pai(x+1);
	    		dataR[r+x-1].zi=dataR[r+x-1].zi+longx(1);
           }
		   return ans;
		}
	}

	void cal_sigma_pai()//连乘连加计算器
	{
		Rn x;
		cout<<"type 1:sigma   type 2:pai"<<endl;
		cout<<"total variable number?"<<endl;
		cin>>variable_number;
		r=dataR.size();
		for(int i=1;i<=variable_number;i++)
		{
			cout<<"type"<<i<<"? ";
			cin>>type[i];
			cout<<"variable"<<i<<"_name:";
			cin>>x.name;
			dataR.push_back(x);
			cout<<"begin:";
			cin>>begin[i];
			cout<<"end:";
			cin>>end[i];
		}
		cout<<"your formula:"<<endl;
		cin>>exp;//cout<<exp;

		Rn ans=dfssigma_pai(1);//cout<<ans;
		ans.name=ans_name();result++;
		dataR.resize(r);
		dataR.push_back(ans);
		cout<<"answer:"<<ans;
		return;
	}

	void cal_iteration()//迭代计算器
	{
		cout<<"total variable number?"<<endl;
		cin>>variable_number;
		int r=dataR.size();
		for(int i=1;i<=variable_number;i++)
		{
			Rn x;
			cout<<"variable"<<i<<"_name:";
			cin>>begin[i];
			x.name=begin[i];
			cout<<"begin:";
			cin>>x;
			dataR.push_back(x);
		}
		cout<<"Recursive relations:"<<endl;
		for(int i=1;i<=variable_number;i++)
		{  cout<<begin[i]<<"=:";cin>>end[i];  }
		cout<<"number of terms:";int n;cin>>n;
		Rn tmp[maxl];
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=variable_number;j++)
			{
				tmp[j]=cal_rationalnumber(end[j]);
				//cout<<tmp[j];
			}
			for(int j=1;j<=variable_number;j++)
			{
				dataR[j+r-1].zi=tmp[j].zi;
				dataR[j+r-1].mu=tmp[j].mu;
			}
		}
		for(int i=1;i<=variable_number;i++)
		{cout<<dataR[i+r-1].name<<"= "<<dataR[i+r-1]<<" = ";dataR[i+r-1].zhiprint();cout<<endl;}
		return;
	}


	void cal_comprehensive(string x)//综合计算器
	{
		vector<pair<string,int> > infix;
		int len=x.length();
		for(int i=0;i<len;i++)
		{
			   char y=x.at(i);
			   if(hefa(y)==0) {cout<<"expression error!";return;}
			   if(y==' ')
			   {
					x.erase(i,1);i--;
					len--;continue;
			   }
			   if(y=='{')
			   {
			   	    x.insert(i+1,1,'(');len++;
			   }
			   if(y=='}')
			   {
			   	    x.insert(i,1,')');
			   	    x.erase(i+1,1);
			   }
		}
		//表达式初始化,在表达式中添加l0,删去空格
		for(int i=0;i<len;i++)
		{
			if(x.at(i)=='-'||x.at(i)=='+')
			{
				if(i==0)
				{
					x.insert(0,1,'0');
					x.insert(0,1,'(');
					x.insert(3,1,'1');
					x.insert(4,1,')');
					x.insert(5,1,'*');
					len+=5;
					continue;
				}
				if(i>=1)
				{
				  if(x.at(i-1)=='(')
				  {
				    x.insert(i,1,'0');
				  	x.insert(i,1,'(');
				  	x.insert(i+3,1,'1');
					x.insert(i+4,1,')');
					x.insert(i+5,1,'*');
					len+=5;
					  continue;
				  }
				}
			}
		}
		int index=0;
		//cout<<len;
		//将长表达式分拆
		while(index<=len-1)//0是符号,1是输进去的数,2是变量的字母代号
		{
			//cout<<index<<endl;
			pair<string,int> tmp;
			if(pan(x.at(index))==0) //运算符号
			{
			tmp.first=x.substr(index,1);
			tmp.second=0;
			index++;
			infix.push_back(tmp);
			}
			else if(pan(x.at(index))==1)//数本身
			{
			int y=find(x,index);
			tmp.first=x.substr(index,y);
			tmp.second=1;
			index+=y;
			infix.push_back(tmp);
			}
			else if(pan(x.at(index))==2)//字母代号
			{
			int y=find(x,index);
			tmp.first=x.substr(index,y);
			tmp.second=2;
			index+=y;
			infix.push_back(tmp);
			}
		}

		int n=infix.size();
//		cout<<"zhongzhui"<<endl;
//		for(int i=0;i<=k-1;i++)
//		cout<<infix[i].first<<" "<<infix[i].second<<endl;

		//中缀转后缀
       stack<char> symbol;//符号栈
       vector<tuple<int,int,char> > suffix;//后缀表达式
       vector<Rn> storeR;int lR=0;
       vector<matrix> storeM;int lM=0;
       vector<polynomial> storeP;int lP=0;
       for(int i=0;i<=n-1;i++)
       {
       	  string data=infix[i].first;//数据
          int h=infix[i].second;//类型
		  //cout<<"s"<<endl;
       	  if(h==1)//数字
       	  {
       	      tuple<int,int,char>  k;
       	      Rn rationalnumber;
			  rationalnumber.input(data);
       	      storeR.push_back(rationalnumber);
       	      get<0>(k)=1;//数字
       	      get<1>(k)=lR;
       	      suffix.push_back(k);
			  lR++;
		     }
		  else if(h==2)//名字
       	  {
       	      tuple<int,int,char> k;
       	      Rn rationalnumber;
        	  matrix matrixx;
        	  polynomial poly;
       	      int g1=searchR(data,rationalnumber),g2=0,g3=0;
       	      if(g1==-1) g2=searchM(data,matrixx);
       	      if(g2==-1) g3=searchP(data,poly);//cout<<poly;
       	      if((g1==-1)&&(g2==-1)&&(g3==-1)) {cout<<"no such object found!"<<endl;}
       	      if(g1!=-1)
       	      {
       	      	 storeR.push_back(rationalnumber) ;
       	      	 get<0>(k)=1;//有理数
       	         get<1>(k)=lR;
				 lR++;
       	         suffix.push_back(k);
			  }
			  else if(g2!=-1)
			  {
			  	 storeM.push_back(matrixx) ;
			  	 get<0>(k)=2;//矩阵
       	         get<1>(k)=lM;
				 lM++;
       	         suffix.push_back(k);
			  }
			  else if(g3!=-1)
			  {
			  	 storeP.push_back(poly) ;
			  	 get<0>(k)=3;//多项式
       	         get<1>(k)=lP;
				 lP++;
       	         suffix.push_back(k);
			  }
		  }
		  else if(h==0)//符号
       	  {
       	        char d=data.at(0);
       	        if(symbol.empty()||(d=='(')) {symbol.push(d);continue;}
       	        if(d==')')
				{
				 	  while(1)
				 	  {
				 		char g=symbol.top();
				 		if(g=='(') {symbol.pop();break;}
						tuple<int,int,char> k;
						get<0>(k)=0;//运算符号
       	                get<2>(k)=g;
       	                suffix.push_back(k);
       	                symbol.pop();
					   }
					   continue;
				}
				int l=prio(d);
			    while((!symbol.empty())&&(l<=prio(symbol.top())))
			    {
			    		char g=symbol.top();
						tuple<int,int,char> k;
						get<0>(k)=0;//运算符号
       	                get<2>(k)=g;
       	                suffix.push_back(k);
       	                symbol.pop();
				}
				symbol.push(d);
		     }
	   }
        while(!symbol.empty())//剩余符号输出
	    {
    		char g=symbol.top();
			tuple<int,int,char> k;
			get<0>(k)=0;//运算符号
            get<2>(k)=g;
            suffix.push_back(k);
            symbol.pop();
		}

		//开始计算
//3 3
//1 2 3 4 5 6 7 8 9
//3 3
//1 2 3 4 5 6 7 8 9
//a*a
		stack<pair<int,int> > object;
		int m=suffix.size();
//		cout<<"houzhui"<<endl;
//		for(int i=0;i<=m-1;i++)
//		cout<<get<0>(suffix[i])<<" "<<get<1>(suffix[i])<<" "<<get<2>(suffix[i])<<endl;
		for(int i=0;i<=m-1;i++)
		{
		    tuple<int,int,char>  k=suffix[i];
		    int lei=get<0>(k);
		    if(lei>0)//数字或矩阵
		    {
		        pair<int,int> p;
		        p.first=lei;
		        p.second=get<1>(k);
		        object.push(p);
			}
			if(lei==0)//运算符
			{
				if(object.empty()) {cout<<"expression error!"<<endl;return;}
				pair<int,int> ans;
				char x=get<2>(k);
				int n=num(x);
				if(n==2)
				{

						pair<int,int>  b=object.top();
						object.pop();
						pair<int,int>  a=object.top();
						object.pop();
					    int x1=a.first;int x2=b.first;//1是有理数,2是矩阵
						if(x=='+')
						{
							if(x1==1&&x2==1)//数加数
							{
								ans.first=1;
								ans.second=lR;
								lR++;
								storeR.push_back(storeR[a.second]+storeR[b.second]);
							}
							else if(x1==2&&x2==2)//矩阵加矩阵
							{
								ans.first=2;
								ans.second=lM;
								lM++;
								storeM.push_back(storeM[a.second]+storeM[b.second]);
							}
							else if(x1==3&&x2==3)
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back(storeP[a.second]+storeP[b.second]);
							}
                            else if(x1==3&&x2==1)
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back(storeP[a.second]+polynomial(storeR[b.second]));
							}
							else if(x1==3&&x2==1)
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back(polynomial(storeR[a.second])+storeP[b.second]);
							}
							//else if(x1==3)
						}
						else if(x=='-')
						{
							if(x1==1&&x2==1)//数减数
							{
								ans.first=1;
								ans.second=lR;
								lR++;
								storeR.push_back(storeR[a.second]-storeR[b.second]);
							}
							else if(x1==2&&x2==2)//矩阵减矩阵
							{
								ans.first=2;
								ans.second=lM;
								lM++;
								storeM.push_back(storeM[a.second]-storeM[b.second]);
							}
							else if(x1==3&&x2==3)
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back(storeP[a.second]-storeP[b.second]);
							}
                            else if(x1==3&&x2==1)
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back(storeP[a.second]-polynomial(storeR[b.second]));
							}
							else if(x1==3&&x2==1)
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back(polynomial(storeR[a.second])-storeP[b.second]);
							}
						}

						else if(x=='*')
						{
							if(x1==1&&x2==1)//数乘数
							{
							    ans.first=1;
								ans.second=lR;
								lR++;
								storeR.push_back(storeR[a.second]*storeR[b.second]);
							}
							else if(x1==2&&x2==2)//矩阵乘矩阵
							{
								ans.first=2;
								ans.second=lM;
								lM++;
								storeM.push_back(storeM[a.second]*storeM[b.second]);
							}
							else if(x1==2&&x2==1)//矩阵乘数
							{
								ans.first=2;
								ans.second=lM;
								lM++;
								storeM.push_back(storeM[a.second]*storeR[b.second]);
							}
							else if(x1==1&&x2==2)//数乘矩阵
							{
								ans.first=2;
								ans.second=lM;
								lM++;
								storeM.push_back(storeM[a.second]*storeR[b.second]);
							}
							else if(x1==3&&x2==3)//多项式乘多项式
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back(storeP[a.second]*storeP[b.second]);
							}
							else if(x1==1&&x2==3)//多项式乘数
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back( storeP[b.second]*storeR[a.second] );
							}
							else if(x1==3&&x2==1)//数乘多项式
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back( storeP[a.second]*storeR[b.second]);
							}
						}

						else if(x=='/')
						{
							if(x1==1&&x2==1)
							{
								ans.first=1;
								ans.second=lR;
								lR++;
								storeR.push_back(storeR[a.second]/storeR[b.second]);
							}
							else if(x1==2&&x2==1)
							{
								ans.first=2;
								ans.second=lM;
								lM++;
								storeM.push_back(storeM[a.second]*(one/storeR[b.second]));
							}
							else if(x1==1&&x2==3)//数除以零次次多项式
							{
								ans.first=3;
								if(storeP[b.second].deg!=0)
								{
									cout<<"math error!"<<endl;return;
								}
								ans.second=lR;
								lR++;
								storeR.push_back( storeR[a.second]/storeP[b.second].data[0] );
							}
							else if(x1==3&&x2==1)// 多项式除以数
							{
								ans.first=3;
								ans.second=lP;
								lP++;
								storeP.push_back( storeP[a.second]/storeR[b.second]);
							}
						}

						else if(x=='^')
						{
							if(x1==1&&x2==1)
							{
								ans.first=1;
								{
		                        if(!(storeR[b.second].mu==longx(1))) {cout<<"power limited!"<<endl;break;}
								ans.second=lR;lR++;
								storeR.push_back(quick_powerR(storeR[a.second],storeR[b.second].zi.transtoint()));
							    }
							}

							else if(x1==2&&x2==1)
							{
								ans.first=2;
		                        if(!(storeR[b.second].mu==longx(1))) {cout<<"power limited!"<<endl;break;}
								ans.second=lM;lM++;
								matrix base=storeM[a.second];
								int power=storeR[b.second].zi.transtoint();
			                    if(power<=0) {cout<<"math error"<<endl;return;}
			                    else if(power==1) storeM.push_back(base);
			                    else
			                    {
			                       matrix result=base;
			                       power--;
			                       while (power > 0)
			                       { //cout<<"S2";
				                      if (power & 1)
				                      result =result*base;
				                      power >>= 1;
			    	                  base = base*base;
			                        }
								   storeM.push_back(result); //cout<<"s88sss";
			                    }
							}

							else if(x1==3&&x2==1)
							{
								ans.first=3;
		                        if(!(storeR[b.second].mu==longx(1))) {cout<<"math error!"<<endl;break;}
								ans.second=lP;lP++;
								polynomial base=storeP[a.second];
								int power=storeR[b.second].zi.transtoint();
			                    if(power<=0) {cout<<"math error"<<endl;return;}
			                    else if(power==1) storeP.push_back(base);
			                    else
			                    {
			                       polynomial result=base;
			                       power--;
			                       while (power > 0)
			                       { //cout<<"S2";
				                      if (power & 1)
				                      result =result*base;
				                      power >>= 1;
			    	                  base = base*base;
			                        }
								   storeP.push_back(result); //cout<<"s88sss";
			                    }
							}
						}
						else if(x=='{')
						{
							if(x1==3&&x2==1)
							{
								ans.first=1;
								ans.second=lR;lR++;
								storeR.push_back(storeP[a.second](storeR[b.second]));
							}
							if(x1==3&&x2==2)
							{   //cout<<"rtt";
								ans.first=2;
								ans.second=lM;lM++;
								storeM.push_back(storeP[a.second](storeM[b.second]));
							}
						}
				}
				if(n==1)
				{
					if(x=='!')
					{
						pair<int,int> a=object.top(); object.pop(); int x0=a.first;

						if(x0==1)
						{
				            int v=1;
					        while(get<2>(suffix[i+1])=='!')
					        {
					    	    i++;v++;
						    }//cout<<"s";
					    	ans.first=1;
					    	ans.second=lR;lR++;
					    	storeR.push_back(factorial(storeR[a.second],v));
						}

						else
						{
							cout<<"math error"<<endl;return;
						}
					}

					if(x=='?')
					{
						pair<int,int> a=object.top(); object.pop(); int x0=a.first;
						if(x0==3)
						{
						   	 ans.first =3;
						   	 ans.second=lP;lP++;
						   	 storeP.push_back(storeP[a.second].Derivative_polynomial());
						}
						else
						{
							cout<<"math error"<<endl;return;
						}
					}

				}
				object.push(ans);
			 }
		}

    pair<int,int> ans=object.top();

         if(ans.first==1) {storeR[ans.second].name=ans_name();dataR.push_back(storeR[ans.second]);cout<<storeR[ans.second];}
    else if(ans.first==2) {storeM[ans.second].name=ans_name();dataM.push_back(storeM[ans.second]);cout<<storeM[ans.second];}
    else if(ans.first==3) {storeP[ans.second].name=ans_name();dataP.push_back(storeP[ans.second]);cout<<storeP[ans.second];}
	result++;
	return;
    }

    void create(string tmp)
    {
    	int w;
    	if(tmp.substr(0,3)=="set")
		{
		string shu=tmp.substr(4);
		shuwei=transint(shu);
		return;
		}

		if(tmp.substr(0,3)=="int")
		{
		string name=tmp.substr(4);
		longx g;w=searchL(name,g);
		if(w!=-1) cin>>dataL[w];
		else {g.name=name; cin>>g;dataL.push_back(g);}
		return;
		}

	    if(tmp.substr(0,3)=="num")
		{
		string name=tmp.substr(4);
		Rn g;w=searchR(name,g);
		if(w!=-1) cin>>dataR[w];
		else {g.name=name; cin>>g;dataR.push_back(g);}
		return;
		}

	    if(tmp.substr(0,3)=="mat")
		{
		string name=tmp.substr(4);
		matrix g;w=searchM(name,g);
		if(w!=-1) {cin>>dataM[w];}
		else {g.name=name; cin>>g;dataM.push_back(g);}
		return;
		}

	    if(tmp.substr(0,3)=="pol")
		{
		string name=tmp.substr(4);
		polynomial g;w=searchP(name,g);
		if(w!=-1) cin>>dataP[w];
		else {g.name=name; cin>>g;dataP.push_back(g);}
		return;
		}
		return;
	}

};

void main_controller()
{
	calculator main;
	int f=0;string tmp;
    cout<<"Welcome to the mini Matrix Laboratory made in China!"<<endl;
	cout<<"function 1:Caculation of rational number,matrix and polynomial"<<endl;
	cout<<"function 2:Greatest common divisor and multiplication inverse"<<endl;
	cout<<"function 3:Solving linear equations"<<endl;
	cout<<"function 4:Operations of polynomial"<<endl;
	cout<<"function 5:Operations of matrix"<<endl;
	system("pause");
	int b=0;
	while(f!=-1)
	{
        system("cls");
	    cout<<"comprehensive caculator of rational number,matrix and polynomial!"<<endl;
	    cout<<"f1:caculators,f2 divisor,f3 equations,f4 polynomial,f5 matrix"<<endl;
	    fenge();
	    main.showdata();
	    fenge();
		cout<<"instructions:"<<endl;
		getline(cin,tmp);
		if(b)  {getline(cin,tmp);}
		b=0;
		int len=tmp.length();
		if(len>=5){main.create(tmp);}
		if(tmp=="t") main.OOP=0;
		if(tmp=="run")
		{
			cout<<"please input your expression!"<<endl;
	        getline(cin,tmp);
	        main.cal_comprehensive(tmp);
	        system("pause");
	        continue;
		}
		if(tmp=="end") return;
		if(tmp=="clear") main.clear();
		if(tmp=="f1")
		{
		    f=1;
			while(f==1)
			{
			system("cls");
			int g=0;
			string t;
			cout<<"function 1:Caculation"<<endl;
			fenge();
			cout<<"1: integer calculator "<<"2: rational calculator "<<endl;
			cout<<"3: sigma_pai calculator in lR "<<"4: iteration calculator in lR"<<endl;
			cout<<"please choose one calculator among these four ones"<<endl;
			cin>>t;
			if(t=="t") main.OOP=1;
			if(t=="b")
			{
			   f=0;b=1;
			}
			if(t.at(0)>='0'&&t.at(0)<='9') g=int(t.at(0)-'0');
			int first=0;
            while(g==1)
            {
			    system("cls");
            	string tm;
            	cout<<"1: integer calculator "<<endl;
            	fenge();
            	main.showdata();
            	fenge();
            	cout<<"instructions:"<<endl;
				getline(cin,tm);//cout<<tm<<"ss";system("pause");
				if(!first) {getline(cin,tm);first=1;}
				int lenn=tm.size();
				if(lenn>=5)
	            {main.create(tm);}

	            if(tm=="run")
	            {
	            	cout<<"please input your expression!"<<endl;
	            	getline(cin,tm);
	            	main.cal_integer(tm);
	            	system("pause");
	            	continue;
				}
				if(tm=="end") return;
				if(tm=="b") g=0;
				if(tm=="t") main.OOP=0;
				if(tm=="clear") main.clear();
			}
			while(g==2)
            {
            	system("cls");
            	string tm;
            	cout<<"2: rational calculator "<<endl;
            	fenge();
            	main.showdata();
            	fenge();
            	cout<<"instructions:"<<endl;
				getline(cin,tm);
				if(!first) {getline(cin,tm);first=1;}
				int lenn=tm.size();
				if(lenn>=5)
	            {
				main.create(tm);
				}
	            if(tm=="run")
	            {
	            	cout<<"please input your expression!"<<endl;
	            	getline(cin,tm);
	            	Rn ans=main.cal_rationalnumber(tm);
	            	ans.name=main.ans_name();
	            	main.dataR.push_back(ans);
	            	cout<<ans;
					main.result++;
					cout<<endl;
	            	system("pause");
	            	continue;
				}
				if(tm=="end") return;
				if(tm=="b") g=0;
				if(tm=="t") main.OOP=0;
				if(tm=="clear") main.clear();
			}
			while(g==3)
            {
            	system("cls");
            	string tm;
				cout<<"3: sigma_pai calculator in lR"<<endl;
            	fenge();
				main.showdata();
            	fenge();

            	cout<<"instructions"<<endl;
            	getline(cin,tm);
            	int lenn=tm.size();
				if(lenn>=5)
	            {
				main.create(tm);
				}
            	if(!first) {getline(cin,tm);first=1;}
            	if(tm=="run") {main.cal_sigma_pai();cout<<endl;system("pause");}
				if(tm=="end") return;
				if(tm=="b") g=0;
				if(tm=="t") main.OOP=0;
				if(tm=="clear") main.clear();
			 }
			while(g==4)
            {
            	system("cls");
            	string tm;
				cout<<"4: iteration calculator in lR"<<endl;
            	fenge();
				main.showdata();
            	fenge();
            	cout<<"instructions"<<endl;
            	getline(cin,tm);
            	int lenn=tm.size();
				if(lenn>=5)
	            {
				main.create(tm);
				}
            	if(!first) {getline(cin,tm);first=1;}
            	if(tm=="run") {main.cal_iteration();system("pause");}
				if(tm=="end") return;
				if(tm=="b") g=0;
				if(tm=="t") main.OOP=0;
				if(tm=="clear") main.clear();
			 }
			}
		}
		else if(tmp=="f2")
		{
			f=2;
			while(f==2)
			{
			system("cls");
			cout<<"function 2: Greatest common divisor and multiplication inverse"<<endl;
			cout<<"please choose integer(1) or polynomial(2)"<<endl;
			fenge();
			string tm;
			cout<<"instructions"<<endl;
			cin>>tm;
			if(tm=="1")
			{
				longx x,y,a,b;
			    cout<<"integer x:";
			    cin>>x;
			    cout<<"integer y:";
			    cin>>y;
			    longx d=exgcd(x,y,a,b);
			    fenge();
			    cout<<"greatest common divisor d="<<d<<endl;
			    cout<<"one solution to ax+by=d is"<<endl;
			    cout<<"a="<<a;cout<<"   b="<<b<<endl;
			    system("pause");
			}
			if(tm=="2")
			{
				polynomial x,y,a,b;
			    cout<<"polynomial f(x):";
			    cin>>x;
			    cout<<"polynomial g(x):";
			    cin>>y;
			    polynomial d=exgcd(x,y,a,b);
			    fenge();
			    cout<<"greatest common divisor d(x)="<<d<<endl;
			    cout<<"one solution to u(x)f(x)+v(x)g(x)=d(x) is"<<endl;
			    cout<<"u(x)= "<<a<<endl<<"v(x)= "<<b<<endl;
			    system("pause");
			}
			if(tm=="end") return;
			if(tm=="b")
			{
			   f=0;b=1;
			}
			if(tm=="t") main.OOP=0;
			if(tm=="clear") main.clear();
			}
		}
		else if(tmp=="f3")
		{
			f=3;
	        while(f==3)
	        {
	        	string tm;
	        	system("cls");
				cout<<"Linear equation solving system"<<endl;
				fenge();
				main.showdata();
				fenge();
				cout<<"instructions:"<<endl;
				getline(cin,tm);
				int lenn=tm.size();
				if(lenn>=5)
	            {
				main.create(tm);
				}
	            if(tm=="run")
				{
					lequation equ;
					string h;
					cout<<"coefficient matrix: a new one (1) or use existing ones (2) ?"<<endl;
                    cin>>h;
                    if(h=="1")
                    {
                    	equ.input();
                    	equ.solve();
					}
                    if(h=="2")
                    {
                    	cout<<"name?  ";
						string p;cin>>p;
						int w=main.searchM(p,equ.a);
						if(w==-1)
						{
							cout<<"no such object found!" <<endl;
						}
						else
						{
							equ.aug=equ.a;equ.aug.l++;
						    cout<<"constant vector:"<<endl;
						    for(int i=1;i<=equ.aug.h;i++)
						    {
							   Rn q;cin>>q;
							   equ.aug.data[i].push_back(q);
						    }
						    equ.solve();cout<<endl;
						}
					}
					system("pause");
				}
				if(tm=="end") return;
			    if(tm=="b") f=0;
			    if(tm=="t") main.OOP=0;
			    if(tm=="clear") main.clear();
		    }

		}
		else if(tmp=="f4")
		{
			f=4;int first=0;
			while(f==4)
			{
			    system("cls");
				string tm;
				cout<<"Operations of polynomial"<<endl;
				cout<<"1:derivative 2:discriminant 3:eliminant 4:normalization"<<endl;
				fenge();
				main.showdata();
				fenge();
				cout<<"instructions:"<<endl;
				if(first==1) getline(cin,tm);
				first=0;
				getline(cin,tm);//cout<<tm<<"ss";//system("pause");
				int lenn=tm.size();
				if(lenn>=5)
	            {
				    main.create(tm);
				}
				if(lenn==1)
				{
					int g=int(tm.at(0))-int('0');
					if(g==1)
					{
						 string l;polynomial a,b;
					     cout<<"polynomial:a new one(1) or an old one(2) ?"	<<endl;
					     cin>>l;
					     if(l=="1")
					     {
					     	cout<<"please input your polynomail"<<endl;
							cin>>a;
					     	cout<<"Derivative_polynomial  "<<a.Derivative_polynomial()<<endl;first=1;system("pause");
						 }
					     else if(l=="2")
					     {
					     	cout<<"name?";string g;cin>>g;
					     	int w=main.searchP(g,a);
					     	if(w==-1) {cout<<"no such object found!" <<endl;system("pause");continue;}
					     	else  {cout<<"Derivative_polynomial  "<<a.Derivative_polynomial()<<endl;first=1;system("pause");}
					     }
					}
					else if(g==2)
					{
						 string l;polynomial a,b;
					     cout<<"polynomial:a new one(1) or an old one(2) ?"	<<endl;
					     cin>>l;
					     if(l=="1")
					     {
					     	cout<<"please input your polynomail"<<endl;
					     	cin>>a;//cout<<"ss";
					     	cout<<"discriminant:  "<<a.discriminant()<<endl;first=1;system("pause");
						 }
					     else if(l=="2")
					     {
					     	cout<<"name?";string g;cin>>g;
					     	int w=main.searchP(g,a);
					     	if(w==-1) {cout<<"no such object found!" <<endl;system("pause");continue;}
					     	else {cout<<"discriminant:  "<<a.discriminant()<<endl;first=1;system("pause");}
					     }
					}
					else if(g==3)
					{
						 string l;polynomial a,b;
					     cout<<"polynomialA:a new one(1) or an old one(2) ?"	<<endl;
					     cin>>l;
					     if(l=="1") {cout<<"please input your polynomail"<<endl;cin>>a;}
					     else if(l=="2")
					     {
					     	cout<<"name?";string g;cin>>g;
					     	int w=main.searchP(g,a);
							if(w==-1) {cout<<"no such object found!" <<endl;first=1;system("pause");continue;}
					     }
					     else continue;

					     cout<<"polynomialB:a new one(1) or an old one(2) ?"	<<endl;
					     cin>>l;
					     if(l=="1"){cout<<"please input your polynomail"<<endl;cin>>b;}
					     else if(l=="2")
					     {
					     	cout<<"name?";string g;cin>>g;
					     	int w=main.searchP(g,b);
					     	if(w==-1) {cout<<"no such object found!" <<endl;first=1;system("pause");continue;}
					     }
					     else continue;
					     cout<<"eliminant:  "<<a.eliminant(b)<<endl;first=1;system("pause");
					}
					else if(g==4)
					{
						 string l;polynomial a,b;
					     cout<<"polynomial:a new one(1) or an old one(2) ?"	<<endl;
					     cin>>l;
					     if(l=="1")
					     {
					     	cin>>a;
					     	cout<<"normalization:  "<<a.normalization()<<endl;first=1;
					     	system("pause");
						 }
					     else if(l=="2")
					     {
					     	cout<<"name?";string g;cin>>g;
					     	int w=main.searchP(g,a);
					     	if(w==-1) {cout<<"no such object found!" <<endl;first=1;system("pause");continue;}
					     	else  {cout<<"normalization:  "<<a.normalization()<<endl;;first=1;system("pause");}
					     }
					}
				}
				if(tm=="end") return;
			    if(tm=="b") f=0;
			    if(tm=="t") main.OOP=0;
			    if(tm=="clear") main.clear();
			}
		}
		else if(tmp=="f5")
		{
			f=5;
			while(f==5)
			{
			system("cls");
			cout<<"Matrix laboratory"<<endl;
			cout<<"1: Transform, 2: Determinant, 3: Algebraic cofactor, 4: Inverse"<<endl;
			cout<<"5: Rank, 6: Characteristic polynomial, 7: Minimal polynomial"<<endl;
			cout<<"8: Turn to Heisenberg matrix, 9: Invariant factor, 10: Frobenius normal form"<<endl;
			cout<<"11: Quadratic simplification"<<endl;
			string tm;
			fenge();
			main.showdata();
			fenge();
			getline(cin,tm);
			int lenn=tm.size();//cout<<lenn;//system("pause");
			if(tm=="end") return;
			if(tm=="b") f=0;
			if(tm=="t") main.OOP=0;
			if(tm=="clear") main.clear();
			if(lenn>=5)
	        {
			    main.create(tm);
			}
			else if(lenn<=2)
			{
			    int g=0;
				if(lenn==2){if(tm.at(0)>='0'&&tm.at(0)<='9'&&tm.at(1)>='0'&&tm.at(1)<='9') g=10*(int(tm.at(0))-int('0'))+int(tm.at(1))-int('0');}
				else if(lenn==1){if(tm.at(0)>='0'&&tm.at(0)<='9')  g=int(tm.at(0))-int('0');}
				if(g==0) continue;
				//cout<<"please input the matrix you want to operate on"<<endl;

				if(g==1)
				{
					system("cls");
					cout<<"Transform:"<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
					}
					matrix kk=object.transform();
					kk.name=main.ans_name();
					main.dataM.push_back(kk);main.result++;
					cout<<"transform:  "<<endl<<kk;system("pause");
					g=0;
				}

				if(g==2)
				{
					system("cls");
					cout<<"Determinant:"<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
					if(h=="t") main.OOP=0;
			        if(h=="b") continue;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
					}
					Rn kk=object.determinant();
					kk.name=main.ans_name();
					main.dataR.push_back(kk);main.result++;
					cout<<"determinant:  "<<kk<<endl;system("pause");
					g=0;
				}

				if(g==3)
				{
					system("cls");
					cout<<"Algebraic cofactor:"<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
					}
					int hh,ll;
					cout<<"row: ";cin>>hh;
					cout<<"col: ";cin>>ll;
					Rn kk=object.cofactor(hh,ll);
					kk.name=main.ans_name();
					main.dataR.push_back(kk);main.result++;
					cout<<"Algebraic cofactor("<<hh<<","<<ll<<"):  "<<kk<<endl;system("pause");
					g=0;
				}

				if(g==4)
				{
					system("cls");
					cout<<"Inverse:  "<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
				    }
					matrix kk=object.inverse();
					kk.name=main.ans_name();
					main.dataM.push_back(kk);main.result++;
					cout<<"Inverse:  "<<endl<<kk;system("pause");
					g=0;
				}

				if(g==5)
				{
					system("cls");
					cout<<"Rank:  "<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
				    }
					cout<<"Rank:  "<<object.rank()<<endl;system("pause");
					g=0;
				}

				if(g==6)
				{
					system("cls");
					cout<<"Characteristic polynomial:  "<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
				    }
				    polynomial ans=object.characteristic_polynomial();
				    ans.name=main.ans_name();
					main.dataP.push_back(ans);main.result++;
					cout<<"Characteristic polynomial:  "<<endl<<ans<<endl;system("pause");
					g=0;
				}

				if(g==7)
				{
					system("cls");
					cout<<"Minimal polynomial:  "<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
				    }
					polynomial ans=object.minimal_polynomial();
				    ans.name=main.ans_name();
					main.dataP.push_back(ans);main.result++;
					cout<<"Minimal polynomial:  "<<endl<<ans<<endl;system("pause");
					g=0;
				}

				if(g==8)
				{
					system("cls");
					cout<<"Turn to Heisenberg matrix:  "<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
				    }
				    matrix ans=object.Hessenberg();
				    ans.name=main.ans_name();
					main.dataM.push_back(ans);main.result++;
					cout<<"Heisenberg matrix:  "<<endl<<ans<<endl;system("pause");
					g=0;
				}

				if(g==9)
				{
					system("cls");
					cout<<"Invariant factor:  "<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
				    }
					cout<<"Invariant factor:  "<<endl;
					vector<polynomial> ans=object.invariant_factor();
					for(int i=1;i<=object.h;i++)
					cout<<ans[i]<<endl;
					system("pause");
					g=0;
				}

				if(g==10)
				{
					system("cls");
					cout<<"Frobenius normal form:  "<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
				    }
				    matrix ans=object.frobenius_normalform();
				    ans.name=main.ans_name();
					main.dataM.push_back(ans);main.result++;
					cout<<"Frobenius normal form:  "<<endl<<ans;
					system("pause");
					g=0;
				}

				if(g==11)
				{
					system("cls");
					cout<<"Quadratic simplification:  "<<endl;
					fenge();
			        main.showdata();
			        fenge();
					cout<<"matrix: a new one (1) or an old one (2)?"<<endl;
					string h;cin>>h;
					matrix object;
					if(h=="end") return;
			        if(h=="b") continue;
			        if(h=="t") main.OOP=0;
					if(h=="1") {cin>>object;}
					if(h=="2")
					{
						cout<<"name? "; string name;cin>>name;
						int m=main.searchM(name,object);
						if(m==-1)
						{
							cout<<"no such object found!"<<endl;system("pause");
							continue;
						}
				    }
				    pair<matrix,matrix> ans=object.Quadratic_standardization();
				    matrix ans1=ans.first;
					matrix ans2=ans.second;
					if(ans1.h!=0&&ans2.h!=0)
					{
					 ans1.name=main.ans_name();main.result++;
				     ans2.name=main.ans_name();main.result++;
					 main.dataM.push_back(ans1);
					 main.dataM.push_back(ans2);
					 cout<<"simplificated diagonal matrix:  "<<endl<<ans1;
					 cout<<"the transfomation matrix C:"<<endl<<ans2;
					}
					system("pause");
					g=0;
				}
				}

			}
			}
		}
	return;
}



int main()
{

//freopen("a.in","r",stdin);
Matrix t;
//cout<<a.mu.len;
//longx x;cin>>x;cout<<x.len;
//longx y;cin>>y;cout<<y.len;
//longx z=gcd(x,y);
//longx p=x/z;
//cout<<p.len;



//calculator x;
//x.cal_iteration();
//matrix a;cin>>a;
//cin>>t;
//x.cal_pai();
//	longx t=longx(6);
//	t.name="t";
//	x.dataL.push_back(t) ;
//	x.dataM.push_back(Matrix::I[7]);
//	x.dataP.push_back(pone);
//	x.dataR.push_back(zero) ;
//	x.showdata();
//	longx m;cin>>m;
//	cout<<quick_power(m);
//longx m;cin>>m;
//cout<<m.transtoint();
//matrix a,b;a.name='a';b.name='b';
//cin>>a>>b;
//x.dataM.push_back(a) ;
//x.dataM.push_back(b) ;
//cout<<a<<b;
//string m;
//getline(cin,m);
//getline(cin,m);
main_controller();
//Rn x;int y;
//cin>>x>>y;
//cout<<factorial(x,y);
//cout<<m<<endl;

//x.cal_matrix(m);
//3 3
//1 2 3 4 5 6 7 8 9
//3 3
//1 2 3 4 5 6 7 8 9
//a*a
//polynomial x;
//cin>>x;
//polynomial y=quick_powerP(x,97);
//cout<<y;

//longx a,b,x,y,c;
//Rn g;
//cin>>a>>g;x=a/g;
//cout<<x;
//cin>>a>>b;c=exgcd(a,b,x,y);
//cout<<c<<endl<<x<<endl<<y;
//lequation x;
//x.input();
//x.solve();
return 0;
}

//a*b
//mat
//a
//3 3
//1 2 3
//4 5 6
//7 8 9
//mat
//b
//3 3
//1 2 3
//4 5 6
//7 8 9
//run

//A
//3 3
//0 0 0
//0 0 0
//0 0 0

//A
//4 4
//3 -1 1 -7
//9 -3 -7 -1
//0 0 4 -8
//0 0 2 -4


//
//A
//4 4
//3.4 4.5 5.6667 6.7
//3.556 3.456 2.34 5.6
//3/6 7/123 9/44 8.9
//3.4 4.5 5.6 6.7
//B
//3 3
//12 4.5 5.6667
//6.576 3.456 2.34
//3/7 7/183 9/74

//A
//4 4
//14 25 5 56
//46 56 23 77
//78 88 39 66
//28 34 14 11

//B
//9 9
//6 4 5 7 6 4 6 3 7
//6 3 2 5 6 3 5 4 5
//3 7 9 2 6 7 8 6 4
//4 2 2 9 4 1 9 8 3
//4 4 5 7 6 4 9 4 5
//6 5 2 3 6 2 9 6 7
//1 2 3 4 5 6 7 9 8
//6 5 2 5 5 2 5 6 9
//7 7 9 9 2 2 1 1 9
//A
//7 7
//1 1 1 1 1 1 1
//1 1 1 1 1 1 1
//1 1 7 1 1 1 1
//1 1 1 1 2 1 1
//1 1 1 1 4 1 1
//1 1 6 1 1 1 1
//1 1 1 1 1 1 1
//A
//7 7
//1 1 1 1 1 1 1
//1 1 1 1 1 1 1
//1 1 7 1 1 1 1
//1 1 1 1 2 1 1
//1 1 1 1 4 1 1
//1 1 6 1 1 1 1
//1 1 1 1 1 1 1
//B
//7 7
//6 4 5 4 6 4 7
//6 3 2 6 6 3 8
//3 7 9 6 6 7 9
//4 2 8 9 4 1 6
//4 6 9 7 6 4 6
//6 5 2 3 6 2 5
//7 8 9 6 5 4 3

//
//x^6-35x^5+209x^4-224x^3-153x^2+1078x-38
//
//

//A
//3 3
//1 2 3
//4 5 6
//7 8 9

//A 3 3 1 2 3 4 5 6 7 8 9
//3 0 0 0
//A 4 5
//1 3 -2 4 1
//2 6 0 5 2
//4 11 8 0 5
//1 3 2 1 1
//4 7 5 3 -2
//A 3 5
//1 2 -1 3 1
//2 4 -2 6 3
//-1 -2 1 -1 3 3 2 6 4


//今日目标;特征多项式和特征值
//1082983245/2847614647  -1595075089/2847614647 4824965/2847614647   36932545/2847614647  -50368908/2847614647 1523528417/2847614647  23413109/2847614647   -807140113/2847614647
//-39830273/2847614647   151830586/2847614647   53422/2847614647     -3055460/2847614647  -86718/2847614647    -122829108/2847614647  4942926/2847614647    16873841/2847614647
//175712411/2847614647   -179751953/2847614647  31004798/2847614647  1608933/2847614647   416590/2847614647    38591039/2847614647    -23745630/2847614647  -65233552/2847614647
//1981474080/2847614647  -2047239780/2847614647 -8236290/2847614647  52422021/2847614647  4307965/2847614647   606836680/2847614647   -245554005/2847614647 -739382236/2847614647
//73775190/2847614647    -123265381/2847614647  -1185226/2847614647  1158555/2847614647   49791067/2847614647  52855282/2847614647    9523828/2847614647    -59870253/2847614647
//-94431002/91858537     96596741/91858537      486568/91858537      -819422/91858537     -205202/91858537     -27991329/91858537     11696514/91858537     33549826/91858537
//2071001236/2847614647  -3069059153/2847614647 -25604658/2847614647 34302485/2847614647  -1719860/2847614647  1468220224/2847614647  98032020/2847614647   -767638602/2847614647
//-2264905331/2847614647 3240246700/2847614647  -7672834/2847614647  -78310807/2847614647 1261161/2847614647   -1819042435/2847614647 -71886177/2847614647  1384298959/2847614647

相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空