int main() { NODE nodes[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'}; EDGE edges_I[] = { {'A', 'B'}, {'A', 'F'}, {'B', 'F'}, {'F', 'H'}, {'E', 'B'}, {'E', 'D'}, {'D', 'H'}, {'D', 'C'}, {'G', 'E'}, {'G', 'C'}, {'I', 'E'}, {'I', 'C'}, }; EDGE edges_II[] = { {'A', 'B'}, {'A', 'F'}, {'B', 'F'}, {'F', 'H'}, {'E', 'B'}, {'E', 'D'}, {'D', 'H'}, {'D', 'C'}, {'G', 'E'}, {'G', 'C'}, {'I', 'E'}, {'I', 'C'}, }; knuth(nodes, edges_I, sizeof(nodes)/sizeof(NODE), sizeof(edges_I)/sizeof(EDGE)); bentley(nodes, edges_II, sizeof(nodes)/sizeof(NODE), sizeof(edges_II)/sizeof(EDGE)); return 0; }
int initv(void) { int i,d,pak,k,maxp; double dp; mpz_inits(N, TA, D, R, V, P, X, Y, DG, IG, A, B, TB, TC, TD, NULL); nbts=8*sizeof(int); printf("Input N= \n"); d=mpz_inp_str(N, stdin, 10); //待分解的整数 if((mpz_probab_prime_p(N, qsieve->NTRY) ? TRUE : FALSE)) { printf("N is prime!\n"); return (-1); } if(d<8) mm=d; // 分解基的理想大小 else if(d>20) mm=(d*d*d*d)/4096; else mm=25; dp=(double)2*(double)(mm+100); // dp:生成素数的数量 +100 *2均是为了更加保险 maxp=(int)(dp*(log(dp*log(dp)))); // 罗素上界 maxp qsieve_gprime(maxp); epr=(int *)qsieve_alloc(mm+1,sizeof(int)); k=knuth(mm,epr,N,D); if(mpz_root(R, D, 2)) //检查完全平方数 { printf("Factors are\n"); qsieve_outnum(R,stdout); qsieve_divide(N,R,N); qsieve_outnum(N,stdout); return -1; } qsieve_gprime(0); mlf=2*mm; //各种开空间,初始化 r1=(int *)qsieve_alloc((mm+1),sizeof(int)); r2=(int *)qsieve_alloc((mm+1),sizeof(int)); rp=(int *)qsieve_alloc((mm+1),sizeof(int)); b=(int *)qsieve_alloc((mm+1),sizeof(int)); e=(int *)qsieve_alloc((mm+1),sizeof(int)); logp=(unsigned char *)qsieve_alloc(mm+1,1); pr=(int *)qsieve_alloc((mlf+1),sizeof(int)); hash=(int *)qsieve_alloc((2*mlf+1),sizeof(int)); sieve=(unsigned char *)qsieve_alloc(SSIZE+1,1); x=(mpz_t *)qsieve_alloc(mm+1,sizeof(mpz_t)); y=(mpz_t *)qsieve_alloc(mm+1,sizeof(mpz_t)); z=(mpz_t *)qsieve_alloc(mlf+1,sizeof(mpz_t)); w=(mpz_t *)qsieve_alloc(mlf+1,sizeof(mpz_t)); for(i=0;i<=mm;i++) { mpz_init(x[i]); mpz_init(y[i]); } for(i=0;i<=mlf;i++) { mpz_init(z[i]); mpz_init(w[i]); } EE=(unsigned int **)qsieve_alloc(mm+1,sizeof(unsigned int *)); G=(unsigned int **)qsieve_alloc(mlf+1,sizeof(unsigned int *)); pak=1+mm/(8*sizeof(int)); for(i=0;i<=mm;i++) { b[i]=(-1); EE[i]=(unsigned int *)qsieve_alloc(pak,sizeof(int)); } for(i=0;i<=mlf;i++) G[i]=(unsigned int *)qsieve_alloc(pak,sizeof(int)); return 1; }