/*使用双数组trie树查表为动态规划程序搜使用的数据初始化*/ void put_values(){ //清零 values[0][0]=0;values[0][1]=0; values[0][2]=0;values[0][3]=0; /*每一个字的unigram,与它邻接的共3个字的标注有关,每个字有4种标注, 所以需要赋予12个不同的特征值*/ for(int i=0;i<len;i++){ int* p=find_u(sequence[i]); if(p==NULL){ if(i+1<len){ values[i+1][0]=0;values[i+1][1]=0; values[i+1][2]=0;values[i+1][3]=0; } continue; } if(i>0){ values[i-1][0]+=*(p++);values[i-1][1]+=*(p++); values[i-1][2]+=*(p++);values[i-1][3]+=*(p++); }else p+=4; values[i][0]+=*(p++);values[i][1]+=*(p++); values[i][2]+=*(p++);values[i][3]+=*(p++); if(i+1<len){ values[i+1][0]=*(p++);values[i+1][1]=*(p++); values[i+1][2]=*(p++);values[i+1][3]=*(p++); } } /*每一个字的bigram,与它邻接的共4个字的标注有关,每个字有4种标注, 所以需要赋予16个不同的特征值*/ for(int i=0;i<len-1;i++){ //用双数组trie树找到该bigram对应的16个特征的特征值指针 int* p=find_b(sequence[i],sequence[i+1]); if(p==NULL)continue; if(i>0){ values[i-1][0]+=*(p++);values[i-1][1]+=*(p++); values[i-1][2]+=*(p++);values[i-1][3]+=*(p++); }else p+=4; values[i][0]+=*(p++);values[i][1]+=*(p++); values[i][2]+=*(p++);values[i][3]+=*(p++); values[i+1][0]+=*(p++);values[i+1][1]+=*(p++); values[i+1][2]+=*(p++);values[i+1][3]+=*(p++); if(i+2<len){ values[i+2][0]+=*(p++);values[i+2][1]+=*(p++); values[i+2][2]+=*(p++);values[i+2][3]+=*(p++); } } };
int *dijkstra_algorithm(float **graph) { int i, u, v, alt; // utility variables int Q[GRAPHSIZE] = {0}; // empty Q float dist[GRAPHSIZE]; for (i = 0; i < GRAPHSIZE; i++) dist[i] = INFINITY; int visited [GRAPHSIZE] = {0}; // mark all nodes as unvisited int previous[GRAPHSIZE] = {0}; // previous node in optimal path // from source dist[0] = 0; // distance from source to itself is zero Q [0] = 1; // start off with the source node while (not_empty(Q)) { u = find_u(Q, dist, visited); // see function desc if (u == TARGET) // terminate once target is reached break; Q[u] = 0; // remove this node from Q visited[u] = 1; // mark it as visited for (v = 0; v < GRAPHSIZE; v++) { if (!graph[u][v] == INFINITY) // neighbours only continue; alt = dist[u] + graph[u][v]; // accumulate shortest distance // from source if (alt < dist[v]) { dist[v] = alt; // keep the shortest distance // from source to v previous[v] = u; if (!visited[v]) // add unvisited v to Q Q[v] = 1; // to be processed } } } return read_path(previous); }
/* * gen_priv_key() */ void gen_priv_key(const unsigned int seed) { uint1024 a,one; int i; if (verbose>1) puts(" Generating items"); srandom(seed); uint_to_1024(priv_sum,0); for (i=0; i<ITEMS; i++) { uint_to_1024(private_key[i],0); while (cmp1024(private_key[i],priv_sum)<=0) { shl1024(private_key[i],4); uint_to_1024(a,(uint) (16.0*random()/RAND_MAX)); add1024(private_key[i],a); } add1024(priv_sum,private_key[i]); } if (verbose>1) puts(" Counting 'm'"); find_m(); if (verbose>1) puts(" Counting 'v'"); find_v(); if (verbose>1) puts(" Counting 'u'"); find_u(); if (verbose>1) puts(" Checking u*v=1 (mod m)"); cpy1024(a, u); mul1024modN(a,v,m); uint_to_1024(one,1); if (cmp1024(one,a)) { puts("!! WARNING !! u*v != 1 (mod m) !! WARNING !!"); puts("This key will provide only one-way trip !"); if (verbose>1) puts("E.g. it's usable only for encryption, not decryption !"); } }
// ********* MAIN ************ int main() { struct initializations init = initials(); truncate_file(); // spacetime Metric metric(init.m, init.a, init.q); cout << endl << metric.name << ":" << endl << "m = " << metric.m << endl << "a = " << metric.a << endl << "q = " << metric.q << endl << endl; // emfield EMField emfield(metric); // particle init.u[init.change] = find_u(metric, &init, init.x, init.u); Particle initparticle(0, init.teilchen_masse, init.teilchen_ladung, init.x, init.u, metric); // spectrum myfloat emin = 2.0; myfloat emax = 13.0; myfloat start_u0 = initparticle.u[0]; vector<myfloat> freqmult(10000); for (unsigned i = 0; i < freqmult.size(); i++){ // E = u0 * freqmult myfloat energy = i * (emax - emin) / freqmult.size() + emin; freqmult[i] = energy / start_u0; } Spectrum spec(freqmult, &metric); ofstream specfile("globalspec.dat"); specfile << scientific; // per-ray data int nrays; for (nrays = init.nrays - 1; nrays >= 0; nrays--) { cout << "===========================================" << endl << "Ray index: " << nrays << endl << endl; // particle Particle particle(0, init.teilchen_masse, init.teilchen_ladung, init.x, init.u, metric); init.change = 1; init.umin = init.umin_inc; init.umax = init.umax_inc; particle.u[0] = start_u0; particle.u[3] = init.u[3] + nrays * init.u3_inc; particle.u[init.change] = find_u(metric, &init, particle.x, particle.u); cout << endl; for (unsigned mu = 0; mu < metric.dim; mu++) { cout << "x" << mu << " = " << particle.x[mu] << '\t'; cout << "u" << mu << " = " << particle.u[mu] << endl; } cout << endl; stringstream nrays_str; nrays_str << nrays; string plotfilename; plotfilename = "globalplot.dat/plot"; plotfilename += nrays_str.str(); plotfilename += ".dat"; // Iterate absorb = 0; go_ray(init, spec, metric, particle, emfield, plotfilename); cout << endl; for (unsigned mu = 0; mu < metric.dim; mu++) { cout << "x" << mu << " = " << particle.x[mu] << '\t'; cout << "u" << mu << " = " << particle.u[mu] << endl; } cout << endl; if (absorb && (absorb != absorb_max)){ cerr << "Error detected" << endl; exit(1); } cout << endl; } for (unsigned i = 0; i < spec.cnts.size(); i++){ specfile << freqmult[i] * start_u0 << '\t' << spec.cnts[i] << endl; } specfile.close(); return 0; }