#include "def.h" #include "macro.h" /* SYMMETRICA vector.c */ /* AK 160986 */ #define callocobject callocobject_trace #undef callocobject static struct vector * callocvectorstruct(); #ifdef MEMCHECK static INT mem_counter_vec; #endif /* MEMCHECK */ #ifdef VECTORTRUE INT vec_anfang() /* AK 100893 */ { #ifdef MEMCHECK mem_counter_vec=(INT)0; #endif /* MEMCHECK */ return OK; } INT vec_ende() /* AK 100893 */ { INT erg = OK; #ifdef MEMCHECK if (mem_counter_vec != (INT)0) { fprintf(stderr,"mem_counter_vec = %ld\n",mem_counter_vec); erg += error("vec memory not freed"); } #endif /* MEMCHECK */ return erg; } INT einsp_vector(a) OP a; /* AK 010692 */ /* AK 040398 V2.0 */ { INT i; for (i=(INT)0;i=0;i--) if (LT(S_V_I(a,i),S_V_I(a,i+1))) return FALSE; return TRUE; } #endif /* VECTORTRUE */ INT vectorp(a) OP a; /* AK 210192 */ /* AK 011098 V2.0 */ { #ifdef VECTORTRUE if ( (s_o_k(a) == VECTOR) || (s_o_k(a) == WORD) || (s_o_k(a) == KRANZ) || (s_o_k(a) == LAURENT) || (s_o_k(a) == COMP) || (s_o_k(a) == INTEGERVECTOR) || (s_o_k(a) == HASHTABLE) || (s_o_k(a) == FF) ) return TRUE; #endif /* VECTORTRUE */ return FALSE; } #ifdef VECTORTRUE INT m_o_v(ob,vec) OP ob,vec; /* make_object_vector */ /* AK 260488 */ /* AK 270689 V1.0 */ /* AK 211289 V1.1 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ /* input: arbitrary object output: VECTOR object with one component = copy of first parameter */ /* ob and vec may be equal */ { INT erg = OK; CE2(ob,vec,m_o_v); erg += m_il_v((INT)1,vec); erg += copy(ob,S_V_I(vec,(INT)0)); ENDR("m_o_v"); } INT b_o_v(ob,vec) OP ob,vec; /* build_object_vector */ /* AK 170590 V1.1 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT erg = OK; if (ob == vec) { erg += error("b_o_v: the two parameters are equal"); goto endr_ende; } erg += b_ls_v(callocobject(),ob,vec); M_I_I((INT)1,S_V_L(vec)); ENDR("b_o_v"); } INT m_l_nv(il,vec) OP il,vec; /* AK 160791 V1.3 */ /* AK 011098 V2.0 */ /* il and vec may be equal */ { INT erg = OK; CTO(INTEGER,"m_l_nv",il); if (S_I_I(il) < 0) { erg += error("m_l_nv:length < 0"); goto endr_ende; } erg += m_il_nv(S_I_I(il),vec); ENDR("m_l_nv"); } /* object BITVECTOR */ /* S_V_LI = length in bit S_BV_LI = length in byte */ INT s_bv_li(a) OP a; /* AK 050399 */ { INT erg = OK,l; CTO(BITVECTOR,"s_bv_li",a); C_O_K(a,VECTOR); l = s_v_li(a); C_O_K(a,BITVECTOR); return (l % 8 == 0 ? l>>3 : l>>3 +1); ENDR("s_bv_li"); } INT m_il_nv(il,vec) INT il; OP vec; /* AK 160791 V1.3 */ /* AK 011098 V2.0 */ { INT i; INT erg = OK; if (il < 0) { erg += error("m_il_nv:length < 0"); goto endr_ende; } erg += m_il_v(il,vec); for (i=(INT)0;i 0) C_V_S(bitvec,SYM_calloc(S_BV_LI(bitvec)/8+1,8)); C_O_K(bitvec,BITVECTOR); ENDR("m_il_bv"); } INT m_il_nbv(il,bitvec) INT il; OP bitvec; /* AK 161294 */ /* AK 011098 V2.0 */ { INT erg = OK,i; if (il < (INT)0) { erg += error("m_il_nbv: negativ length"); goto endr_ende; } erg += b_ls_v(callocobject(),NULL,bitvec); M_I_I(il,S_V_L(bitvec)); if (il > (INT)0) C_V_S(bitvec,SYM_calloc(S_BV_LI(bitvec)/8+1,8)); C_O_K(bitvec,BITVECTOR); ENDR("m_il_nbv"); } INT m_il_v(il,vec) INT il; OP vec; /* make_integerlength_vector */ /* AK 250587 */ /* AK 270689 V1.0 */ /* AK 211289 V1.1 */ /* AK 080291 V1.2 test on negativ test on zero length */ /* AK 200891 V1.3 */ /* AK 020398 V2.0 */ { INT erg = OK,i; if (il < (INT)0) return error("m_il_v: negativ length"); if (il == (INT)0) erg += b_ls_v(callocobject(),NULL,vec); else if (il == (INT)1) erg += b_ls_v(callocobject(),callocobject(),vec); else erg += b_ls_v(callocobject(), (OP) SYM_malloc((int)il * sizeof(struct object)),vec); M_I_I(il,S_V_L(vec)); for (i=(INT)0;i S_V_LI(b)) { c = callocobject(); erg += copy(a,c); for (i=(INT)0;i S_V_LI(b)) { erg += copy_vector(a,c); for (i=(INT)0;i S_V_LI(b)) { erg += copy_integervector(a,c); for (i=(INT)0;ij;k--) *S_V_I(vec,k) = *S_V_I(vec,k-(INT)1); C_O_S(S_V_I(vec,j),zeiger); C_O_K(S_V_I(vec,j),art); }; return(OK); } INT random_bv(a,b) OP a,b; /* AK 250194 */ /* AK 011098 V2.0 */ { INT erg = OK,i; CTO(INTEGER,"random_bv",a); erg += m_il_bv(S_I_I(a),b); C_O_K(b,BITVECTOR); for (i=(INT)0;i (INT)0) SYM_free(S_V_S(a)); erg += freeall(S_V_L(a)); SYM_free(d.ob_vector); C_O_K(a,EMPTY); ENDR("freeself_integervector"); } INT freeself_bitvector(a) OP a; /* AK 081294 */ /* AK 020698 V2.0 */ { INT erg = OK; OBJECTSELF d; CTO(BITVECTOR,"freeself_bitvector",a); d = S_O_S(a); if (S_V_S(a) != NULL) SYM_free(S_V_S(a)); erg += freeall(S_V_L(a)); SYM_free(d.ob_vector); C_O_K(a,EMPTY); ENDR("freeself_bitvector"); } INT freeself_vector(vec) OP vec; /* gibt den speicherplatz eines vectorobjects frei */ /* AK 280689 V1.0 */ /* AK 211189 V1.1 */ /* AK 130691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { OBJECTSELF d; INT i,erg=OK; OP z; if (not VECTORP(vec)) return ERROR; d = S_O_S(vec); z = S_V_S(vec); if (S_V_LI(vec) == (INT)1) freeall(S_V_S(vec)); else if (S_V_LI(vec) > (INT)0) { for (i=(INT)0;i bi) && (erg == -1)) return NONCOMPARABLE; if ((ai > bi) && (erg == 0)) { erg = 1; continue; } } return erg; ENDR("sub_comp_bv"); } INT comp_bv(a,b) OP a,b; /* AK 200395 */ /* AK 011098 V2.0 */ { INT i; INT erg = OK; CTO(BITVECTOR,"comp_bv",a); CTO(BITVECTOR,"comp_bv",b); if (S_V_LI(a) != S_V_LI(b)) error("comp_bv:different lengths"); /* for (i=0;i GET_BV_I(b,i)) return (INT)1; return (INT) 0; */ /* println(a); println(b); */ erg = (INT) memcmp((void *)S_V_S(a), (void *)S_V_S(b), (size_t)S_BV_LI(a)); /* printf("comp=%ld\n",erg); */ return erg; ENDR("comp_bv"); } INT comp_integervector(a,b) OP a,b; /* AK 011098 V2.0 */ { INT i; for ( i=(INT)0; i= S_V_LI(b)) return (INT)1; if (S_V_II(a,i) > S_V_II(b,i)) return (INT) 1; if (S_V_II(a,i) == S_V_II(b,i)) continue; return (INT) -1; }; if (i < S_V_LI(b)) return (INT) -1; return((INT)0); } INT comp_vector(a,b) OP a,b; /* AK 060488 */ /* AK 280689 V1.0 */ /* AK 201289 V1.1 */ /* AK 200891 V1.3 */ /* AK 260298 V2.0 */ { INT i,res,erg = OK; if (not VECTORP(b)) { printobjectkind(b); erg += error("comp_vector: second parameter not vector"); } for ( i=(INT)0; i= S_V_LI(b)) return((INT)1); res = comp(S_V_I(a,i),S_V_I(b,i)); if (res != (INT)0) return(res); }; if (S_V_LI(a) < S_V_LI(b)) return (INT) -1; /* AL 091194 */ return((INT)0); ENDR("comp_vector"); } INT scan_bitvector(res) OP res; /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 080591 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT i,erg =OK; OP d,e; d = callocobject(); e = callocobject(); erg += printeingabe("input of a bitvector (0-1 vector)"); erg += printeingabe("length of bit vector "); erg += scan(INTEGER,d); erg += b_l_v(d,e); for (i=(INT)0;iv_self); } OP s_v_l(a) OP a; /* AK 270689 V1.0 */ /* AK 201289 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { OBJECTSELF c; OP erg=NULL; c = s_o_s(a); if (a==NULL) { error("s_v_l:object == NULL"); return(NULL); } if (c.ob_vector==NULL) { error( "s_v_l:vector pointer == NULL"); return(NULL); } if (not vectorp(a)) { /* AK 210192 */ WTO("s_v_l",a); return NULL; } erg = c.ob_vector->v_length; if (s_o_k(erg) != INTEGER) { printobjectkind(erg); error( "s_v_l:length != INTEGER"); return(NULL); } if (s_i_i(erg) < (INT)0) { error( "s_v_l:length <0"); return(NULL); } return erg; } INT s_v_li(a) OP a; /* AK 270689 V1.0 */ /* AK 201289 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT erg = s_i_i(s_v_l(a)); return erg; } OP s_v_i(a,i) OP a; INT i; /* AK 270689 V1.0 */ /* AK 201289 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT j; if (i<(INT)0) { fprintf(stderr,"index = %ld\n",i); error("s_v_i:negative index"); return(NULL); } if (i >= (j=s_v_li(a)) ) { fprintf(stderr,"index = %ld dimension = %ld\n",i,j); error("s_v_i:index too big"); return(NULL); } return(s_v_s(a) + (i)); } INT c_v_i(a,i,b) OP a,b; INT i; /* AK 170889 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { c_o_k(s_v_i(a,i),s_o_k(b)); c_o_s(s_v_i(a,i),s_o_s(b)); return(OK); } INT s_v_ii(a,i) OP a; INT i; /* AK 270689 V1.0 */ /* AK 201289 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { return(s_i_i(s_v_i(a,i))); } INT c_v_s(a,b) OP a,b; /* AK 270689 V1.0 */ /* AK 201289 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { OBJECTSELF c; c = s_o_s(a); (c.ob_vector->v_self)=b; return(OK); } INT c_v_l(a,b) OP a,b; /* AK 270689 V1.0 */ /* AK 201289 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { OBJECTSELF c; c = s_o_s(a); (c.ob_vector->v_length)=b; return(OK); } INT lastof_vector(a,b) OP a,b; /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 020398 V2.0 */ /* a and b may be equal */ { INT erg = OK; if (not VECTORP(a)) { erg += WTO("lastof_vector",a); } else if (S_V_LI(a) == (INT)0) { erg += freeself(b); } else { erg += copy(S_V_I(a,S_V_LI(a)-(INT)1),b); } ENDR("lastof_vector"); } INT length_vector(a,b) OP a,b; /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 180691 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { return(copy(S_V_L(a),b)); } INT tex_vector(vecobj) OP vecobj; /* AK 101187 */ /* mit tex werden alle elemente ausgegeben */ /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 070291 V1.2 prints to texout */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT i,ot=texmath_yn; if (texmath_yn==0) { fprintf(texout,"\\ $["); texmath_yn = 1; } else fprintf(texout,"\\ ["); for( i = (INT)0; i0) { sprintf(t,","); t++; } erg += sprint(t,S_V_I(a,i)); if (erg != OK) { WTO("sprint_vector: wrong type of vector-entry",S_V_I(a,i)); goto endr_ende; } t += strlen(t); } sprintf(t,"]"); ENDR("sprint_vector"); } INT sprint_integervector(t,a) char *t; OP a; /* AK 240398 V2.0 */ { INT erg = OK; INT i; CTO(INTEGERVECTOR,"sprint_integervector",a); sprintf(t,"["); t++; for (i=0;i0) { sprintf(t,","); t++; } sprintf(t,"%ld",S_V_II(a,i)); t += intlog(S_V_I(a,i)); if (S_V_II(a,i) < 0) t++; } sprintf(t,"]"); ENDR("sprint_integervector"); } INT fprint_vector(f,vecobj) FILE *f; OP vecobj; /* AK 171186 */ /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 200891 V1.3 */ /* AK 190298 V2.0 */ { INT i, erg = OK; if (f == NULL) { erg += error("fprint_vector: FILE pointer = NULL"); goto endr_ende; } fprintf(f,"["); if (f == stdout) zeilenposition++; for( i = (INT)0; i row_length ) { fprintf(f,"\n"); zeilenposition = (INT)0; } } }; }; fprintf(f,"]"); if (f == stdout) zeilenposition++; ENDR("fprint_vector"); } INT objectread_bv(filename,vec) FILE *filename; OP vec; /* AK 220395 */ /* AK 011098 V2.0 */ { OP t; INT erg = OK,n; b_ls_v(callocobject(),NULL,vec); C_O_K(vec,BITVECTOR); objectread(filename,S_V_L(vec)); fgetc(filename); C_V_S(vec,SYM_calloc(S_BV_LI(vec)/8+1,8) ); n = fread(S_V_S(vec),(size_t)1,(size_t)S_BV_LI(vec),filename); if (n != S_BV_LI(vec)) { erg += error("objectread_bv: error during read"); goto endr_ende; } ENDR("objectread_bv"); } INT objectread_vector(filename,vec) FILE *filename; OP vec; /* AK 131086 */ /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT i,erg = OK; OP length; length = callocobject(); erg += objectread(filename,length); erg += b_l_v(length,vec); for (i=(INT)0;i zm) zm = S_V_II(vec,i); erg += m_i_i(zm,m); ENDR("max_integervector"); } INT max_vector(vec,m) OP vec,m; /* return copy of the maximal element */ /* AK 280689 V1.0 */ /* AK 050390 V1.1 */ /* AK 100691 V1.2 */ /* AK 070891 V1.3 */ /* AK 011098 V2.0 */ { INT i; INT erg = OK; OP zm; CE2(vec,m,max_vector); zm = S_V_I(vec,(INT)0); for(i=(INT)1;i=(INT)0;i--) { erg += mult(S_V_I(a,i),S_V_I(b,i),c); erg += add_apply(c,d); } erg += freeall(c); ende: ENDR("scalarproduct_vector"); } INT dec_vector(a) OP a; /* AK 120187 kuerzt den vector um 1 */ /* das letzte element wird gestrichen */ /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 070891 V1.3 */ /* AK 011098 V2.0 */ { INT erg = OK; /* AK 100893 */ OP zz; if (S_V_LI(a) == (INT)0 ) { erg += error("dec_vector:initial length == 0"); goto ende; } if (not EMPTYP(S_V_I(a,S_V_LI(a)-(INT)1))) /* AK 260991 */ erg += freeself(S_V_I(a,S_V_LI(a)-(INT)1)); /* freigeben des speicherplatzes des letzten vectorelements */ DEC_INTEGER(S_V_L(a)); /* verkuerzen der laenge um eins */ if (S_V_LI(a) == (INT)1) /* AK 111093 */ { zz = S_V_S(a); C_V_S(a,callocobject()); *(S_V_S(a)) = *zz; SYM_free(zz); } else if (S_V_LI(a) == (INT)0) /* AK 100893 */ { erg += freeall(S_V_S(a)); C_V_S(a,NULL); } ende: ENDR("dec_vector"); } INT append_vector(a,b,c) OP a, b, c; /* haengt den vector b an den vector a an */ /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 070891 V1.3 */ /* AK 011098 V2.0 */ { INT i,length; INT erg = OK; if ((a == c) || (b == c)) { erg += ERROR; goto endr_ende; } if (not VECTORP(b)) /* AK 291292 */ { OP d = callocobject(); erg += m_o_v(b,d); erg += append_vector(a,d,c); erg += freeall(d); goto endr_ende; } length=S_V_LI(a)+S_V_LI(b); erg += m_il_v(length,c); if (S_O_K(a) == S_O_K(b)) /* AK 030295 */ C_O_K(c,S_O_K(a)); else C_O_K(c,VECTOR); for( i=(INT)0;i right) return -1; mitte = (left+right)/2; erg = comp(a,S_V_I(b,mitte)); if (erg == 0) return mitte; if (erg < 0) return index_vector_binary_co(a,b,left,mitte-1); else return index_vector_binary_co(a,b,mitte+1,right); } INT index_vector_binary(a,b) OP a,b; /* AK 211100 */ /* assumes sorted according to comp */ { return index_vector_binary_co(a,b,0,S_V_LI(b)-1); } INT delete_entry_vector(a,index,b) OP a,b; INT index; /* AK 220296 */ /* AK 011098 V2.0 */ { INT i,j, erg = OK; if (a == b) { OP c = callocobject(); *c = *b; C_O_K(b,EMPTY); erg += delete_entry_vector(c,index,b); erg += freeall(c); goto endr_ende; } erg += m_il_v(S_V_LI(a)-1,b); for (i=0,j=0;i S_V_LI(b)) /* error wrong: < corrected AK 130199 */ { c = a; a = b; b = c; m = (INT)-1; } else m = (INT)1; /* the vector a is the shorter one */ for (i=(INT)0;i S_V_II(b,i)) return m ; for (;i (INT)0) return m * (INT)-1; return (INT)0; ENDR("comp_numeric_vector"); } INT add_apply_integervector(a,b) OP a, b; /* b = b+a */ /* AK 211289 V1.1 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT i,erg = OK; if (not VECTORP(b)) return WTT("add_apply_integervector",a,b); if (S_V_LI(a) > S_V_LI(b)) { i = S_V_LI(b); inc_vector_co(b,S_V_LI(a) - S_V_LI(b)); for (; i= (INT)0) || (j>=(INT)0); i--,j--) { if (i<(INT)0) return((INT)1); if (j<(INT)0) return((INT)-1); erg = comp(S_V_I(a,i),S_V_I(b,j)); if (erg <(INT)0) return((INT)1); if (erg >(INT)0) return((INT)-1); } return((INT)0); } /* laenge in byte */ INT unset_bv_i(a,i) OP a; INT i; /* ite bit auf 0 setzen */ /* AK 011098 V2.0 */ { INT erg = OK; CTO(BITVECTOR,"unset_bv_i",a); if (S_V_LI(a) < i) return error("unset_bv_i: index to big"); if (i< 0) return error("unset_bv_i: index negativ"); *((unsigned char *)S_V_S(a) + (i/8)) &= (~(1 << (i%8))); ENDR("unset_bv_i"); } INT set_bv_i(a,i) OP a; INT i; /* ite bit setzen */ /* AK 011098 V2.0 */ { INT erg = OK; CTO(BITVECTOR,"set_bv_i",a); if (S_V_LI(a) < i) return error("set_bv_i: index to big"); if (i< 0) return error("set_bv_i: index negativ"); *((unsigned char *)S_V_S(a) + (i/8)) |= (1 << (i%8)); ENDR("set_bv_i"); } INT get_bv_i(a,i) OP a; INT i; /* AK 011098 V2.0 */ { INT erg = OK; CTO(BITVECTOR,"set_bv_i",a); if (S_V_LI(a) < i) return error("set_bv_i: index to big"); if (i< 0) return error("set_bv_i: index negativ"); return (*(((unsigned char *)S_V_S(a) ) + i/8) >> (i%8))%2; ENDR("get_bv_i"); } INT fprint_bitvector(fp,a) OP a; FILE *fp; /* AK 011098 V2.0 */ { INT i,erg = OK; CTO(BITVECTOR,"fprint_bitvector",a); for (i=0;i 70) { printf("\n"); zeilenposition = 0; } } } ENDR("fprint_bitvector"); } INT t_INTVECTOR_BITVECTOR(a,b) OP a,b; /* AK 011098 V2.0 */ /* a and b may be equal */ { INT erg = OK; unsigned char *self; INT i,j,k,l; if (not VECTORP(a)) { WTO("t_INTVECTOR_BITVECTOR",a); goto endr_ende; } CE2(a,b,t_INTVECTOR_BITVECTOR); /* a is INTVECTOR object */ l = S_V_LI(a); erg += m_il_bv(l,b); for (i=0;i=0;i--) bs2[i] ^= bs1[i] ; ENDR("exor_bitvector_apply"); } INT inf_bitvector_apply(bit1, res) OP bit1,res; /* AK 011098 V2.0 */ { unsigned char *self, *bs1, *bs2; INT erg = OK; INT i,l; if (S_V_LI(bit1) != S_V_LI(res)) error("inf_bitvector_apply:diff lengths"); l = S_V_LI(bit1); bs1 = (unsigned char *) S_V_S(bit1); bs2 = (unsigned char *) S_V_S(res); for (i=0;i<= (l/8);i++) bs2[i] &= bs1[i] ; ENDR("inf_bitvector_apply"); } INT t_BITVECTOR_INTVECTOR(a,b) OP a,b; /* AK 011098 V2.0 */ { unsigned char *self; INT i,j,k; if (a == b) return ERROR; /* a is INTVECTOR object */ self = (unsigned char *) S_V_S(a); m_il_v(S_V_LI(a),b); for (i=0,j=0,k=1;i 0) il = S_PA_LI(a) + S_PA_II(a,S_PA_LI(a)-(INT)1); /* laenge des bit vectors i n bit */ erg += b_ks_pa(BITVECTOR,callocobject(),b); erg += b_ls_v(callocobject(),NULL,S_PA_S(b)); M_I_I(il,S_PA_L(b)); C_O_K(S_PA_S(b),BITVECTOR); if (il == 0) goto endr_ende; self = (unsigned char *) SYM_calloc(il/64+1,8); C_V_S(S_PA_S(b),self); for (i=(INT)0,j=S_PA_LI(a)-1,k=S_PA_II(a,S_PA_LI(a)-1);i S_PA_II(a,j)) { SET_BV_I(S_PA_S(b),i); k--; } else { j--; } } if (k != 0) return error("t_VECTOR_BIT: internal error tVB-0"); if (j != -1) return error("t_VECTOR_BIT: internal error tVB-1"); ENDR("t_VECTOR_BIT"); } static INT maxpart_bitvector_part_i(a) OP a; /* AK 011098 V2.0 */ { INT i,j=0; for (i=0;i<=S_V_LI(a);i++) { if (GET_BV_I(a,i) != (INT)1) break; } /* d.h. i ist die 0 */ for (;i<=S_V_LI(a);i++) if (GET_BV_I(a,i) == (INT)1) j++; return j; /* maximaler teil */ } static INT length_bitvector_part_i(a) OP a; /* AK 011098 V2.0 */ { INT i,j=0,k; for (i=S_V_LI(a)-1;i>=0;i--) { if ((k=GET_BV_I(a,i)) != (INT)0) break; } /* d.h. i ist die letzte 1 */ for (k=(INT)0;k=0;i--) { if(GET_BV_I(S_PA_S(a),i) == 1) break; } for (;k=0;i--) { if(GET_BV_I(a,i) == 1) break; } /* hier geht die partition los */ nu = 0; for (;k= 6) ) { dimension_bit_co(a,c,sig); return OK; } i=S_V_LI(a)-1; uc = ((unsigned char *) S_V_S(a)) + (i/8); l = i%8; for (;i>=0;i--,l--) { if (l < 0) {l+=8;uc--;} if (GET_BV_I(a,i) != 0) break; /* if (GET_BIT_I(uc,l) != 0) break; */ } ol = S_V_LI(a); M_I_I(i+1,S_V_L(a)); /* i index erster wagrechter eintrag */ hakenlaenge = S_V_II(b,index); uch = ((unsigned char *) S_V_S(a)) + ((i-hakenlaenge)/8); lh = (i-hakenlaenge)%8; for (;i>=hakenlaenge;i--,l--,lh--) { if (l < 0) {l+=8;uc--;} if (lh < 0) {lh+=8;uch--;} if (GET_BV_I(a,i) != 1) continue; /* if (GET_BIT_I(uc,l) != 1) continue; */ if (GET_BV_I(a,i-hakenlaenge) != 0) continue; /* if (GET_BIT_I(uch,lh) != 0) continue; */ k = 0; for (j=i-1;j>i-hakenlaenge;j--) if (GET_BV_I(a,j) == 0) k++; /* k is leglength */ if (index == (INT)0) { if (k%2 == 1) sig *= -1; if (sig==1) inc(c); else dec(c); goto ende; } UNSET_BV_I(a,i); /* UNSET_BIT_I(uc,l);*/ SET_BV_I(a,i-hakenlaenge); /*SET_BIT_I(uch,lh);*/ if (k%2 == 0) charvalue_bit_co(a,b,c,index-1,sig); else charvalue_bit_co(a,b,c,index-1,sig* ((INT)-1)); SET_BV_I(a,i); /*SET_BIT_I(uc,l);*/ UNSET_BV_I(a,i-hakenlaenge); /*UNSET_BIT_I(uch,lh);*/ } ende: M_I_I(ol,S_V_L(a)); return OK; } #endif /* VECTORTRUE */