static GEN bound_for_coeff(long m, GEN rr, GEN *maxroot) { long i,r1, lrr=lg(rr); GEN p1,b1,b2,B,M, C = matpascal(m-1); for (r1=1; r1 < lrr; r1++) if (typ(rr[r1]) != t_REAL) break; r1--; rr = gabs(rr,0); *maxroot = vecmax(rr); for (i=1; i<lrr; i++) if (gcmp(gel(rr,i), gen_1) < 0) gel(rr,i) = gen_1; for (b1=gen_1,i=1; i<=r1; i++) b1 = gmul(b1, gel(rr,i)); for (b2=gen_1 ; i<lrr; i++) b2 = gmul(b2, gel(rr,i)); B = gmul(b1, gsqr(b2)); /* Mahler measure */ M = cgetg(m+2, t_VEC); gel(M,1) = gel(M,2) = gen_0; /* unused */ for (i=1; i<m; i++) { p1 = gadd(gmul(gcoeff(C, m, i+1), B),/* binom(m-1, i) */ gcoeff(C, m, i)); /* binom(m-1, i-1) */ gel(M,i+2) = ceil_safe(p1); } return M; }
int main(int argc, char *argv[]) { vec_t v; //int *pk; int k; logopen("l_dpq.log","w"); v=vecnew(int); logcheck(veccount(v) == 0); vecset(int,v,0,37); vecset(int,v,1,5); vecset(int,v,2,79); //logtable(v); vecsort(v,intcmp); logcheck(vecsorted(v)); //logtable(v); vecset(int,v,0,3); vecset(int,v,1,57); vecset(int,v,2,79); //logtable(v); vecsort(v,intcmp); logcheck(vecsorted(v)); //logtable(v); logtrace("random vector (small)"); srand(time(0)); for (k=0;k<=18;k++) { vecset(int,v,k,((rand() & 0xF) <<2)+k); } logtable(v); logclock { vecsort(v); } logcheck(vecsorted(v)); logtable(v); logtrace("random vector (large)"); #define N 1000 for (k=0;k<=N;k++) { vecset(int,v,k,((rand() & 0xF) <<24)+k); } logtrace("done (%d on %d)",veccount(v), vecmax(v)); //logtable(v); logclock { vecsort(v); } //logtable(v); logtrace("sorted vector"); for (k=0;k<=N;k++) { vecset(int,v,k,10000000+k); } //logtable(v); logtrace("done"); logclock { vecsort(v); } //logtable(v); vecfree(v); logclose(); exit(0); }
Mesh::Mesh(const char* off_filename) : _normals(0), _min(INFINITY, INFINITY, INFINITY), _max(-INFINITY, -INFINITY, -INFINITY), _fullyTriangulated(true) { _filename = off_filename; { QStringList sl = _filename.split('/'); _name = sl.at(sl.size() - 1).split(".").at(0); } QFile file(_filename); if (not file.open(QIODevice::ReadOnly | QIODevice::Text)) { THROW(MeshException, QString("Unable to open file \'%1\' for reading.").arg(file.errorString())); } QTextStream in(&file); int lineNumber = 0; QString line; do { line = in.readLine(); lineNumber++; } while (not line.isEmpty() and line.at(0) == '#'); // is signature correct? line.truncate(3); if(line.isNull() or (line != "OFF" and line != "off")) THROW(MeshException, QString("\'%1\'' is not an OFF file ").arg(off_filename)); lineNumber++; // skip comments do { line = in.readLine(); lineNumber++; } while(not line.isNull() and line.at(0) == '#'); QStringList lst = line.split(' '); // get vertex_count face_count edge_count size_t vertex_count = lst.at(0).toULong(), face_count = lst.at(1).toULong();//, edge_count = lst.at(2).toULong(); resetMinMax(); // process vertices for (size_t i = 0; i < vertex_count and not in.atEnd(); i++) { lineNumber++; float coord[3]; in >> coord[0] >> coord[1] >> coord[2]; if (in.status() != QTextStream::Ok) THROW(MeshException, QString(" in %1:%1 failed to read coordinate.").arg(off_filename, QString::number(lineNumber))); _vertices.push_back(QVector3D(coord[0], coord[1], coord[2])); } // process faces for(size_t i = 0; i < face_count and not in.atEnd(); i++) { unsigned firstIndex, lastIndex; int poly_type; in >> poly_type; if (in.status() == QTextStream::Ok) { if(poly_type != 3) _fullyTriangulated = false; unsigned vertexIndex; for(int i = 0; i < poly_type; i++) { lastIndex = vertexIndex; in >> vertexIndex; if (in.status() == QTextStream::Ok) { if (i == 0) firstIndex = vertexIndex; else if (i > 2) // this triangulation should work for convex polygons { _triangleIndices.push_back(firstIndex); _triangleIndices.push_back(lastIndex); } _min = vecmin(_min, _vertices[vertexIndex]); _max = vecmax(_max, _vertices[vertexIndex]); _triangleIndices.push_back(vertexIndex); } else THROW(MeshException, QString("in %1:%2 polygon is not a Triangle.").arg(off_filename, QString::number(lineNumber))); } } else THROW(MeshException, QString("in %1:%2 failed to read number of vertices.").arg(off_filename, QString::number(lineNumber))); lineNumber++; }
/* d = requested degree for subfield. Return DATA, valid for given pol, S and d * If DATA != NULL, translate pol [ --> pol(X+1) ] and update DATA * 1: polynomial pol * 2: p^e (for Hensel lifts) such that p^e > max(M), * 3: Hensel lift to precision p^e of DATA[4] * 4: roots of pol in F_(p^S->lcm), * 5: number of polynomial changes (translations) * 6: Bezout coefficients associated to the S->ff[i] * 7: Hadamard bound for coefficients of h(x) such that g o h = 0 mod pol. * 8: bound M for polynomials defining subfields x PD->den * 9: *[i] = interpolation polynomial for S->ff[i] [= 1 on the first root S->firstroot[i], 0 on the others] */ static void compute_data(blockdata *B) { GEN ffL, roo, pe, p1, p2, fk, fhk, MM, maxroot, pol; primedata *S = B->S; GEN p = S->p, T = S->T, ff = S->ff, DATA = B->DATA; long i, j, l, e, N, lff = lg(ff); if (DEBUGLEVEL>1) fprintferr("Entering compute_data()\n\n"); pol = B->PD->pol; N = degpol(pol); roo = B->PD->roo; if (DATA) /* update (translate) an existing DATA */ { GEN Xm1 = gsub(pol_x[varn(pol)], gen_1); GEN TR = addis(gel(DATA,5), 1); GEN mTR = negi(TR), interp, bezoutC; gel(DATA,5) = TR; pol = translate_pol(gel(DATA,1), gen_m1); l = lg(roo); p1 = cgetg(l, t_VEC); for (i=1; i<l; i++) gel(p1,i) = gadd(TR, gel(roo,i)); roo = p1; fk = gel(DATA,4); l = lg(fk); for (i=1; i<l; i++) gel(fk,i) = gsub(Xm1, gel(fk,i)); bezoutC = gel(DATA,6); l = lg(bezoutC); interp = gel(DATA,9); for (i=1; i<l; i++) { if (degpol(interp[i]) > 0) /* do not turn pol_1[0] into gen_1 */ { p1 = translate_pol(gel(interp,i), gen_m1); gel(interp,i) = FpXX_red(p1, p); } if (degpol(bezoutC[i]) > 0) { p1 = translate_pol(gel(bezoutC,i), gen_m1); gel(bezoutC,i) = FpXX_red(p1, p); } } ff = cgetg(lff, t_VEC); /* copy, don't overwrite! */ for (i=1; i<lff; i++) gel(ff,i) = FpX_red(translate_pol((GEN)S->ff[i], mTR), p); } else { DATA = cgetg(10,t_VEC); fk = S->fk; gel(DATA,5) = gen_0; gel(DATA,6) = shallowcopy(S->bezoutC); gel(DATA,9) = shallowcopy(S->interp); } gel(DATA,1) = pol; MM = gmul2n(bound_for_coeff(B->d, roo, &maxroot), 1); gel(DATA,8) = MM; e = logint(shifti(vecmax(MM),20), p, &pe); /* overlift 2^20 [for d-1 test] */ gel(DATA,2) = pe; gel(DATA,4) = roots_from_deg1(fk); /* compute fhk = hensel_lift_fact(pol,fk,T,p,pe,e) in 2 steps * 1) lift in Zp to precision p^e */ ffL = hensel_lift_fact(pol, ff, NULL, p, pe, e); fhk = NULL; for (l=i=1; i<lff; i++) { /* 2) lift factorization of ff[i] in Qp[X] / T */ GEN F, L = gel(ffL,i); long di = degpol(L); F = cgetg(di+1, t_VEC); for (j=1; j<=di; j++) F[j] = fk[l++]; L = hensel_lift_fact(L, F, T, p, pe, e); fhk = fhk? shallowconcat(fhk, L): L; } gel(DATA,3) = roots_from_deg1(fhk); p1 = mulsr(N, gsqrt(gpowgs(utoipos(N-1),N-1),DEFAULTPREC)); p2 = gpowgs(maxroot, B->size + N*(N-1)/2); p1 = gdiv(gmul(p1,p2), gsqrt(B->PD->dis,DEFAULTPREC)); gel(DATA,7) = mulii(shifti(ceil_safe(p1), 1), B->PD->den); if (DEBUGLEVEL>1) { fprintferr("f = %Z\n",DATA[1]); fprintferr("p = %Z, lift to p^%ld\n", p, e); fprintferr("2 * Hadamard bound * ind = %Z\n",DATA[7]); fprintferr("2 * M = %Z\n",DATA[8]); } if (B->DATA) { DATA = gclone(DATA); if (isclone(B->DATA)) gunclone(B->DATA); } B->DATA = DATA; }