#include #include #include #include #include #include #include using namespace std; using namespace GiNaC; const symbol & get_symbol(const string & s) { static map directory; map::iterator i = directory.find(s); if (i != directory.end()) return i->second; else return directory.insert(make_pair(s, symbol(s))).first->second; } // #define CREATE_VARIABLE_NAME(index) a##index symbol x("x"), y("y"), z("z"),w("w"); symbol s("s"), t("t"); symbol a("a"), b("b"), c("c"), d("d"); static int deg; vector f(4); int get_idx(int i,int j){ return i*deg+j; } //组合数来生成计算minor void generateCombination(vector& candidates, int start, int p, vector& combination, vector>& result) { if (p == 0) { result.push_back(combination); return; } for (int i = start; i < candidates.size(); ++i) { combination.push_back(candidates[i]); generateCombination(candidates, i + 1, p - 1, combination, result); combination.pop_back(); } } vector > getCombinations(int k, int p) { vector > result; vector candidates; for (int i = 0; i < k; ++i) { candidates.push_back(i); } vector combination; generateCombination(candidates, 0, p - 1, combination, result); return result; } matrix random_matrix(int n,int m,int k){ matrix cur(n,m); int rem;// if(k>10) rem=2; else rem=10; for(int i=0;i factor_parser(ex f,parser &reader){ vector ans; if(!is_a(f)) { ans.push_back(f); return ans; } int cnt=0; string cur=""; int i=0; stringstream ss; ss<(ed-st); st=ed; std::cout << duration.count() << " ms" << std::endl; } int main() { freopen("a.out","w",stdout); auto st = std::chrono::high_resolution_clock::now(); symtab table; table["s"] = s; table["t"] = t; parser reader(table); // random //Ex 4.6 //Cone f[0]=reader("-t*(-s^2 + 1)"); f[1]=reader("2*s*t"); f[2]=reader(" t*(s^2 + 1)"); f[3]=reader(" s^2 + 1"); //Ex 4.2 // f[0]=reader("(2*t^2 - 6*t + 4)*s^2 + 4*(t - 1)*s + 1"); // f[1]=reader(" -2*(t^2 - 3*t + 1)*s^2 + (4*t - 2)*s"); // f[2]=reader(" (t^2 - 4*t + 3)*s^2 - 2*(t - 1)^2 * s"); // f[3]=1; // f[0]=(2*pow(t,2)-6*t+4)*pow(s,2)+4*(t-1)*s+1; // f[1]=-2*(pow(t,2)-3*t+1)*pow(s,2)+(4*t-2)*s; // f[2]=(pow(t,2)-4*t+3)*pow(s,2)-2*pow((t-1),2)*s; // f[3]=1; // Ex 6.1 Correct! // f[0]=s+3+t; // f[1]=1+t*s*s+t; // f[2]=s*s-3*s+2*s*t+1; // f[3]=s+s*t+3*t; //Ex 6.2 Correct! // f[0]=s*s+t; // f[1]=t*(s*s+1)+s*s+1; // f[2]=-s*s*s+2*s*s*t+s*s+1; // f[3]=t*(s*s*s+3)+1; //Ex 6.3 // f[0]=-pow(s,3)*(t*t-1); // f[1]=(s+2)*s*t; // f[2]=-pow(t,3)*(pow(s,2)-4); // f[3]=pow(s,3); //Ex 6.4 // f[0]=reader("4*s^3 + s*t^2 + 4*s^2 - 12*s*t + t^2 + s + 1"); // f[1]=reader("4*s^4 + s^2*t^2 + s^2 + 6*t"); // f[2]=reader("6*t^2"); // f[3]=reader("4*s^2 + t^2 + 1"); //Ex 6.5 // f[0]=reader("4*s^3 + s*t^2 + 4*s^2 - 12*s*t + t^2 + s + 1"); // f[1]=reader("4*s^4 + s^2*t^2 + s^2 + 6*t"); // f[2]=reader("6*t^2"); // f[3]=reader("4*s^2 + t^2 + 1"); for(int i=0;i<4;i++) cout<=d2)//保证ex4.2是3,1,理论上应该是>= v1=d1-1,v2=2*d2-1;//s v1,t v2 else v1=2*d1-1,v2=d2-1; // cout< basefunc; //O(2*d1*d2) for(int i=0;i<=v2;i++) { for(int j=0;j<=v1;j++){ basefunc.push_back(pow(s,j)*pow(t,i)); } } // for(int i=0;i matbasefunc;//存储乘后的结果,用来解线性方程组 lst matbasefunc_lst; //O((d2+v2)*(d2+v2)) 近似于 O(d1*d2) for(int i=0;i<=(d2+v2);i++) for(int j=0;j<=(d1+v1);j++) { matbasefunc.push_back(pow(s,j)*pow(t,i)); matbasefunc_lst.append(pow(s,j)*pow(t,i)); } //生成用来求解的未知数变量 //O(d1*d2) vector matvar; for(int i=0;i<4;i++) for(int j=0;j<2*d1*d2;j++){ string cur="a"; cur=cur+to_string(get_idx(i,j)); matvar.push_back(get_symbol(cur)); } lst eqns={}; lst vars={}; //添加到vars当中 for(int i=0;i l; for(int i=0;i<4;i++) { ex cur=0; for(int j=0;j mp;//ex不支持比较,声明map的时候必须像这样声明 for (const auto& term : mulres) {//遍历多项式中的每一项 ex cur; //coeff无法求两个symbol对应的度数,因此需要用除法来求解 int curd1=term.degree(s),curd2=term.degree(t); ex pl=pow(s,curd1)*pow(t,curd2); cur=quo(term,pl,x);//计算商 if(mp.find(pl)!=mp.end()) mp[pl]=mp[pl]+cur; else mp[pl]=cur; // cout< freevar; for (int i=0;i ff; ff.push_back(x); ff.push_back(y); ff.push_back(z); ff.push_back(w); if(flag==1) { for(int i=0;i<4;i++) { for(int j=0;j<2*d1*d2;j++) { ex varans=rhs(curans[get_idx(i,j)]); if(varans!=0)//取出答案 { M(j,p-1)=M(j,p-1)+varans*ff[i]; N(j,p-1)=N(j,p-1)+varans*f[i]; } } } } // cout< ni;//用于存储所有可能的minor //计算H,相当于计算矩阵所有可能的p-1 *p-1维度的minor,然后求解GCD //先递归找到所有的列组合 vector > combinations = getCombinations(k, p); // matrix calmat=ex_to(sub_matrix(N,0,p-2,0,p-2)); // cout<(reduced_matrix(curmat,i,p-1)); ni.push_back(determinant(calmat)); } cout<(factor(quickH)); cout< h=factor_parser(quickH,reader); for(auto &i:h) if(!is_a(i))//skip numeric cout< order; for(auto &i:h){//处理每一个h int s_deg=i.degree(s); int t_deg=i.degree(t); } return 0; }