Beispiel #1
0
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;
}
Beispiel #2
0
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);
}
Beispiel #3
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++;
    }
Beispiel #4
0
/* 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;
}