(终有一天,我们能够实现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