Changeset 825e0e in git


Ignore:
Timestamp:
Jan 19, 2011, 4:05:48 PM (13 years ago)
Author:
Frank Seelisch <seelisch@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
8c097e100503580a34ad9e198d2f1c1adaad7576
Parents:
18ae66333ebe27dd7d6bcd362823ffedc8a103b2
Message:
intvec matching routines for Viktor in extra.cc

git-svn-id: file:///usr/local/Singular/svn/trunk@13798 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/extra.cc

    r18ae663 r825e0e  
    631631        }
    632632      }
     633  /*==================== intvec matching ======================*/
     634      /* Given two non-empty intvecs, the call
     635            'system("intvecMatchingSegments", ivec, jvec);'
     636         computes all occurences of jvec in ivec, i.e., it returns
     637         a list of int indices k such that ivec[k..size(jvec)] = jvec.
     638         If no such k exists (e.g. when ivec is shorter than jvec), an
     639         intvec with the single entry 0 is being returned. */
     640      if(strcmp(sys_cmd, "intvecMatchingSegments")==0)
     641      {
     642        if ((h       != NULL) && (h->Typ()       == INTVEC_CMD) &&
     643            (h->next != NULL) && (h->next->Typ() == INTVEC_CMD) &&
     644            (h->next->next == NULL))
     645        {
     646          intvec* ivec = (intvec*)h->Data();
     647          intvec* jvec = (intvec*)h->next->Data();
     648          intvec* r = new intvec(1); (*r)[0] = 0;
     649          int validEntries = 0;
     650          for (int k = 0; k <= ivec->rows() - jvec->rows(); k++)
     651          {
     652            if (memcmp(&(*ivec)[k], &(*jvec)[0],
     653                       sizeof(int) * jvec->rows()) == 0)
     654            {
     655              if (validEntries == 0)
     656                (*r)[0] = k + 1;
     657              else
     658              {
     659                r->resize(validEntries + 1);
     660                (*r)[validEntries] = k + 1;
     661              }
     662              validEntries++;
     663            }
     664          }
     665          res->rtyp = INTVEC_CMD;
     666          res->data = (void*)r;
     667          return FALSE;
     668        }
     669        else
     670        {
     671          Werror("expected two non-empty intvecs as arguments");
     672          return TRUE;
     673        }
     674      }
     675      /* Given two non-empty intvecs, the call
     676            'system("intvecOverlap", ivec, jvec);'
     677         computes the longest intvec kvec such that ivec ends with kvec
     678         and jvec starts with kvec. The length of this overlap is being
     679         returned. If there is no overlap at all, then 0 is being returned. */
     680      if(strcmp(sys_cmd, "intvecOverlap")==0)
     681      {
     682        if ((h       != NULL) && (h->Typ()       == INTVEC_CMD) &&
     683            (h->next != NULL) && (h->next->Typ() == INTVEC_CMD) &&
     684            (h->next->next == NULL))
     685        {
     686          intvec* ivec = (intvec*)h->Data();
     687          intvec* jvec = (intvec*)h->next->Data();
     688          int ir = ivec->rows(); int jr = jvec->rows();
     689          int r = jr; if (ir < jr) r = ir;   /* r = min{ir, jr} */
     690          while ((r >= 1) && (memcmp(&(*ivec)[ir - r], &(*jvec)[0],
     691                                     sizeof(int) * r) != 0))
     692            r--;
     693          res->rtyp = INT_CMD;
     694          res->data = (void*)r;
     695          return FALSE;
     696        }
     697        else
     698        {
     699          Werror("expected two non-empty intvecs as arguments");
     700          return TRUE;
     701        }
     702      }
    633703  /*==================== Hensel's lemma ======================*/
    634704      if(strcmp(sys_cmd, "henselfactors")==0)
Note: See TracChangeset for help on using the changeset viewer.