#include "def.h" #include "macro.h" /* SYMMETRICA vector.c */ /* AK 160986 */ struct vector * callocvectorstruct(); static INT charvalue_bit_co(); static INT mem_counter_vec=0; static int vector_speicherindex=-1; /* AK 231001 */ static int vector_speichersize=0; /* AK 231001 */ static struct vector **vector_speicher=NULL; /* AK 231001 */ INT freevectorstruct(); #define B_LS_V(l,s,r) \ do { FREESELF(r);\ C_O_K(r,VECTOR); \ r->ob_self.ob_vector = callocvectorstruct();\ C_V_S(r,s);\ C_V_L(r,l); } while(0) #ifdef VECTORTRUE INT vec_anfang() /* AK 100893 */ { INT erg = OK; #ifdef UNDEF mem_counter_vec=0; return OK; #endif ANFANG_MEMMANAGER(vector_speicher, vector_speicherindex, vector_speichersize, mem_counter_vec); ENDR("vec_anfang"); } INT vec_ende() /* AK 100893 */ { INT erg = OK; if (no_banner != TRUE) if (mem_counter_vec != (INT)0) { fprintf(stderr,"mem_counter_vec = %ld\n",mem_counter_vec); erg += error("vec memory not freed"); } #ifdef UNDEF erg += vec_speicher_ende(); return erg; #endif ENDE_MEMMANAGER(vector_speicher, vector_speicherindex, vector_speichersize, mem_counter_vec,"vec speicher not freed"); ENDR("vec_ende"); } 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 */ /* AK 110902 V2.1 */ { #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) == COMPOSITION) || (s_o_k(a) == INTEGERVECTOR) || (s_o_k(a) == SUBSET) || (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); 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; OP l; SYMCHECK( ob == vec, "b_o_v: the two parameters are equal"); NEW_INTEGER(l,1); B_LS_V(l,ob,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); SYMCHECK(S_I_I(il) < 0,"m_l_nv:length < 0"); erg += m_il_nv(S_I_I(il),vec); ENDR("m_l_nv"); } INT m_il_nv(il,vec) INT il; OP vec; /* AK 160791 V1.3 */ /* AK 011098 V2.0 */ { INT i; INT erg = OK; SYMCHECK(il < 0,"m_il_nv:length < 0"); erg += m_il_v(il,vec); for (i=(INT)0;i>3) : (l>>3) +1); ENDR("s_bv_li"); } INT m_il_bv(il,bitvec) INT il; OP bitvec; /* AK 161294 */ /* AK 190298 V2.0 */ /* il is length in bit */ { INT erg = OK; SYMCHECK(il < 0,"m_il_bv: negativ length"); B_LS_V(callocobject(),NULL,bitvec); M_I_I(il,S_V_L(bitvec)); if (il > 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; COP("m_il_nbv(2)",bitvec); SYMCHECK(il < 0,"m_il_nbv: negativ length"); 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; OP l; COP("m_il_v(2)",vec); SYMCHECK(il < 0,"m_il_v: negativ length"); if (S_O_K(vec) == VECTOR) /* AK 261006 */ { if (S_V_LI(vec)==il) { for (i=0,l=S_V_S(vec);i S_V_LI(b)) { c = CALLOCOBJECT(); 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=0;ij;k--) *S_V_I(vec,k) = *S_V_I(vec,k-1); C_O_S(S_V_I(vec,j),zeiger); C_O_K(S_V_I(vec,j),art); }; return(OK); } CTTO(INTEGERVECTOR,VECTOR,"sort_vector(1e)",vec); ENDR("sort_vector"); } INT random_bv(a,b) OP a,b; /* AK 250194 */ /* AK 011098 V2.0 */ { INT erg = OK,i; int rand(); CTO(INTEGER,"random_bv",a); erg += m_il_bv(S_I_I(a),b); C_O_K(b,BITVECTOR); for (i=(INT)0;i 0) SYM_free(S_V_S(a)); FREEALL(S_V_L(a)); freevectorstruct(S_O_S(a).ob_vector); C_O_K(a,EMPTY); } CTO(EMPTY,"freeself_integervector(1e)",a); ENDR("freeself_integervector"); } INT freeself_hashtable(vec) OP vec; /* AK 231001 AK 100307*/ /* length > 1 */ { INT i,erg=OK,j; OP z,zj; CTO(HASHTABLE,"freeself_hashtable(1)",vec); if (S_V_II(vec,S_V_LI(vec)) > 0) { for (i=(INT)0,z=S_V_S(vec);i 0)\ {\ OP z;INT i;\ for (z = S_V_S(vec),i=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 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 eq_vector(a,b) OP a,b; /* AK 201201 */ /* AK 291104 V3.0 */ { INT erg = OK; CTO(VECTOR,"eq_vector(1)",a); if (S_O_K(b) != VECTOR) return FALSE; CTO(VECTOR,"eq_vector(2)",b); if (S_V_LI(b) != S_V_LI(a)) return FALSE; { INT i,l=S_V_LI(a); for (i=0;i= S_V_LI(b)) return(1);\ res = comp(az,bz);\ if (res != 0) return(res);\ };\ if (S_V_LI(a) < S_V_LI(b)) return -1;\ return(0);\ } INT comp_integervector(a,b) OP a,b; /* AK 011098 V2.0 *//* AK 270804 V3.0 */ { INT erg = OK; CTTTO(INTEGERVECTOR,COMPOSITION,SUBSET,"comp_integervector(1)",a); if (S_O_K(b) == VECTOR) { /* AK 080502 */ COMP_VC(a,b); } CTTTO(INTEGERVECTOR,COMPOSITION,SUBSET,"comp_integervector(2)",b); { OP za,zb; INT i; za = S_V_S(a);zb=S_V_S(b); for ( i=0; i= S_V_LI(b)) return 1; if (S_I_I(za) > S_I_I(zb)) return 1; if (S_I_I(za) == S_I_I(zb)) continue; return -1; }; if (i < S_V_LI(b)) return -1; return 0; } ENDR("comp_integervector"); } INT comp_galois(a,b) OP a,b; { INT erg = OK; CTO(GALOISRING,"comp_galois(1)",a); CTO(GALOISRING,"comp_galois(2)",b); { OP za,zb; INT i; za = S_V_S(a);zb=S_V_S(b); for ( i=0; i= S_V_LI(b)) return 1; if (S_I_I(za) > S_I_I(zb)) return 1; if (S_I_I(za) == S_I_I(zb)) continue; return -1; }; if (i < S_V_LI(b)) return -1; return 0; } ENDR("comp_galois"); } 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 erg = OK; CTO(VECTOR,"comp_vector(1)",a); CTTTO(VECTOR,INTEGERVECTOR,WORD,"comp_vector(2)",b); COMP_VC(a,b); ENDR("comp_vector"); } INT comp_word(a,b) OP a,b; /* AK 060502 from comp_vector */ { INT erg = OK; CTO(WORD,"comp_word(1)",a); CTTTO(VECTOR,INTEGERVECTOR,WORD,"comp_word(2)",b); COMP_VC(a,b); ENDR("comp_word"); } 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; COP("scan_bitvector(1)",res); 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;i= 0) /* AK 231001 */ { res=vector_speicher[vector_speicherindex--]; goto ende; } res = (struct vector *) SYM_MALLOC(sizeof(struct vector)); if (res == NULL) no_memory(); ende: mem_counter_vec++; #endif CALLOC_MEMMANAGER(struct vector, vector_speicher, vector_speicherindex, mem_counter_vec, res); return res; ENDTYP("callocvectorstruct", struct vector * ); } INT freevectorstruct(v) struct vector *v; /* AK 231001 */ { INT erg = OK; #ifdef UNDEF if (vector_speicherindex+1 == vector_speichersize) { if (vector_speichersize == 0) { vector_speicher = (struct vector **) SYM_MALLOC(100 * sizeof(struct vector *)); if (vector_speicher == NULL) { erg += error("no memory"); goto endr_ende; } vector_speichersize = 100; } else { vector_speicher = (struct vector **) SYM_realloc (vector_speicher, 2 * vector_speichersize * sizeof(struct vector *)); if (vector_speicher == NULL) { erg += error("no memory"); goto endr_ende; } vector_speichersize = 2 * vector_speichersize; } } vector_speicher[++vector_speicherindex] = v; mem_counter_vec--; #endif FREE_MEMMANAGER(struct vector *, vector_speicher, vector_speicherindex, vector_speichersize, mem_counter_vec, v); ENDR("freevectorstruct"); } #ifdef UNDEF static INT vec_speicher_ende() /* AK 230101 */ { INT erg = OK,i; for (i=0;i<=vector_speicherindex;i++) SYM_free(vector_speicher[i]); if (vector_speicher!= NULL) { COP("vec_speicher_ende:vector_speicher",vector_speicher); SYM_free(vector_speicher); } vector_speicher=NULL; vector_speicherindex=-1; vector_speichersize=0; ENDR("vec_speicher_ende"); } #endif INT b_ls_v(length,self,res) OP length, self,res; /* AK 280689 V1.0 */ /* AK 211289 V1.1 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ /* self will be freed */ { OBJECTSELF d; INT erg = OK; COP("b_ls_v(3)",res); d.ob_vector = callocvectorstruct(); erg += b_ks_o(VECTOR, d,res); /* res will be freed */ C_V_S(res,self); C_V_L(res,length); ENDR("b_ls_v"); } OP s_v_s(a) OP a; /* AK 270689 V1.0 */ /* AK 211289 V1.1 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { OBJECTSELF c; c = s_o_s(a); if (a==NULL) { error("s_v_s:object == NULL"); return(NULL); } if (c.ob_vector==NULL) { error( "s_v_s:vector pointer == NULL"); return(NULL); } if (not vectorp(a)) { /* AK 210192 */ error("s_v_s: not VECTOR"); return NULL; } return(c.ob_vector->v_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 (s_o_k(a) == HASHTABLE) { if (i > (j=s_v_li(a)) ) { fprintf(stderr,"index = %ld dimension = %ld\n",i,j); error("s_v_i hashtable:index too big"); return(NULL); } } else 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); } #define LASTOF_V(a,b)\ SYMCHECK(S_V_LI(a) == 0,"LASTOF_V:length of vector == 0");\ if (S_V_LI(a)>0) COPY(S_V_I(a,S_V_LI(a)-(INT)1),b); 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 */ { INT erg = OK; CTO(VECTOR,"lastof_vector(1)",a); CTO(EMPTY,"lastof_vector(2)",b); LASTOF_V(a,b); ENDR("lastof_vector"); } INT lastof_integervector(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 */ { INT erg = OK; CTO(INTEGERVECTOR,"lastof_integervector(1)",a); CTO(EMPTY,"lastof_integervector(2)",b); LASTOF_V(a,b); ENDR("lastof_integervector"); } 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 */ /* AK 201204 V3.0 */ { INT i, erg = OK; COP("fprint_vector(1)",f); putc('[',f); if (f == stdout) zeilenposition++; for( i = 0; i zm) zm = S_V_II(vec,i); erg += m_i_i(zm,m); ENDR("max_integervector"); } INT min_integervector(vec,m) OP vec,m; /* return copy of the minimal element */ /* AK 140703 */ { INT i; INT erg = OK; INT zm; CE2(vec,m,min_integervector); zm = S_V_II(vec,(INT)0); for(i=(INT)1;i=0;i--,za++,zb++) { if ( (not NULLP(za)) && (not NULLP(zb))) { /* AK 230904 */ CLEVER_MULT(za,zb,c); ADD_APPLY(c,d); } } FREEALL(c); } CTO(ANYTYPE,"scalarproduct_vector(e)",d); 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; CTO(VECTOR,"dec_vector(1)",a); SYMCHECK(S_V_LI(a) == 0, "dec_vector:initial length == 0"); FREESELF(S_V_I(a,S_V_LI(a)-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 */ { FREEALL(S_V_S(a)); C_V_S(a,NULL); } ENDR("dec_vector"); } INT dec_integervector(a) OP a; /* AK 230402 */ /* AK 230904 V3.0 */ { INT erg = OK; /* AK 100893 */ CTO(INTEGERVECTOR,"dec_integervector(1)",a); SYMCHECK(S_V_LI(a) == 0, "dec_integervector:initial length == 0"); { OP zz; 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 */ { FREEALL(S_V_S(a)); C_V_S(a,NULL); } } ENDR("dec_integervector"); } INT reverse_vector(a,b) OP a, b; /* AK 160802 */ /* AK 230904 V3.0 */ { INT erg = OK; CTTTO(WORD,INTEGERVECTOR,VECTOR,"reverse_vector(1)",a); CE2(a,b,reverse_vector); { INT i,j; erg += m_il_v(S_V_LI(a),b); C_O_K(b,S_O_K(a)); for (i=0,j=S_V_LI(b)-1;i right) return -1; mitte = (left+right)/2; res = COMP(a,S_V_I(b,mitte)); if (res == 0) return mitte; if (res < 0) return index_vector_binary_co(a,b,left,mitte-1); else return index_vector_binary_co(a,b,mitte+1,right); ENDR("local:index_vector_binary_co"); } 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 insert_entry_vector(a,index,b) OP a,b; INT index; /* AK 280607 */ /* new empty object add position index */ { INT erg = OK; SYMCHECK(not VECTORP(a),"insert_entry_vector(1): not VECTORP"); { INT i,j; if (a == b) { OP c; c = CALLOCOBJECT(); *c = *b; C_O_K(b,EMPTY); erg += insert_entry_vector(c,index,b); FREEALL(c); goto endr_ende; } if (index<0) erg += copy(a,b); else if (index>=S_V_LI(a)) erg += copy(a,b); else { erg += m_il_v(S_V_LI(a)+1,b); C_O_K(b,S_O_K(a)); for (i=0;i= S_V_LI(a)) goto endr_ende; FREESELF(S_V_I(a,index)); DEC_INTEGER(S_V_L(a)); if (index == S_V_LI(a)) goto endr_ende; for (i=index;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; CTO(INTEGERVECTOR,"add_apply_integervector(1)",a); CTTO(INTEGERVECTOR,VECTOR,"add_apply_integervector(2)",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=0;i--,j++) if (GET_BV_I(vec,i)==1) SET_BV_I(res,j); else UNSET_BV_I(res,j); ENDR("reverse_bitvector"); } INT einsp_bitvector(vec) OP vec; /* AK 200606 all one vector ? */ { INT erg = OK,i; CTO(BITVECTOR,"einsp_bitvector(1)",vec); for (i=S_V_LI(vec)-1;i>=0;i--) if (GET_BV_I(vec,i)==0) return FALSE; return TRUE; ENDR("einsp_bitvector"); } INT invers_bitvector(vec,res) OP vec,res; /* AK 090703 */ /* the complement */ { INT erg = OK,i; CTO(BITVECTOR,"invers_bitvector(1)",vec); CE2(vec,res,invers_bitvector); erg += m_il_bv( S_V_LI(vec), res); /* length in bit */ C_O_K(res,S_O_K(vec)); for (i=S_V_LI(vec)-1;i>=0;i--) if (GET_BV_I(vec,i)==1) UNSET_BV_I(res,i); else SET_BV_I(res,i); ENDR("invers_bitvector"); } INT inc_bitvector(v) OP v; /* AK 020698 V2.0 */ { INT erg = OK; CTO(BITVECTOR,"inc_bitvector(1)",v); if ((S_V_LI(v) % 8) == 0) { C_V_S(v, SYM_realloc(S_V_S(v), S_V_LI(v)/8 + 1)); } INC_INTEGER(S_V_L(v)); ENDR("inc_bitvector"); } INT copy_integervector(vec,res) OP vec, res; /* AK 021286 */ /* AK 280689 V1.0 */ /* AK 081289 V1.1 */ /* AK 120391 V1.2 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT erg = OK; CTO(INTEGERVECTOR,"copy_integervector(1)",vec); CTO(EMPTY,"copy_integervector(2)",res); erg += m_il_v( S_V_LI(vec), res); memcpy(S_V_S(res),S_V_S(vec), S_V_LI(vec) * sizeof(struct object)); C_O_K(res,S_O_K(vec)); ENDR("copy_integervector"); } INT copy_galois(vec,res) OP vec, res; /* AK 211106 V3.1 */ { INT erg = OK; CTO(GALOISRING,"copy_galois(1)",vec); CTO(EMPTY,"copy_galois(2)",res); erg += m_il_v( S_V_LI(vec), res); memcpy(S_V_S(res),S_V_S(vec), S_V_LI(vec) * sizeof(struct object)); C_O_K(res,S_O_K(vec)); ENDR("copy_integervector"); } INT copy_composition(vec,res) OP vec, res; /* AK 070102 */ /* identic to copy_integervector */ { INT erg = OK; CTO(COMPOSITION,"copy_composition(1)",vec); CTO(EMPTY,"copy_composition(2)",res); erg += m_il_v( S_V_LI(vec), res); memcpy(S_V_S(res),S_V_S(vec), S_V_LI(vec) * sizeof(struct object)); C_O_K(res,S_O_K(vec)); ENDR("copy_composition"); } INT comp_colex_vector(a,b) OP a,b; /* a,b vectors colex order */ /* AK V1.1 151189 */ /* AK 200891 V1.3 */ /* AK 011098 V2.0 */ { INT i = S_V_LI(a)-1; INT j = S_V_LI(b)-1; INT erg; if (not VECTORP(a)) error("comp_colex_vector:kind != VECTOR"); if (not VECTORP(b)) error("comp_colex_vector:kind != VECTOR"); 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; INT i,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 *bs1, *bs2; INT erg = OK; INT i,l; CTO(BITVECTOR,"inf_bitvector_apply(1)",bit1); CTO(BITVECTOR,"inf_bitvector_apply(2)",res); 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 sup_bitvector_apply(bit1, res) OP bit1,res; /* AK 200606 V2.0 */ { unsigned char *bs1, *bs2; INT erg = OK; INT i,l; CTO(BITVECTOR,"sup_bitvector_apply(1)",bit1); CTO(BITVECTOR,"sup_bitvector_apply(2)",res); if (S_V_LI(bit1) != S_V_LI(res)) error("sup_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("sup_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); 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--; } } C_PA_K(b,BITVECTOR); 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; } INT next_lex_vector(a,b) OP a,b; /* AK 060802 */ /* computes the next vector */ /* a and b may be equal */ /* return TRUE if there was a lexicoigraphic next vector FALSE if it is already the biggest one */ { INT erg = OK; INT i,j,k; OP m; CTTO(INTEGERVECTOR,VECTOR,"next_lex_vector(1)",a); if (a != b) erg += copy(a,b); if (S_V_LI(b) <= 1) return FALSE; /* vector has length >= 1 */ /* to left till decrease */ for (i=S_V_LI(b)-2;i>=0;i--) if (LT(S_V_I(b,i),S_V_I(b,i+1))) break; if (i==-1) return FALSE; k = i+1; for (j=i+1;j100) { INT j; /* AK 210104 */ for (j=0;i+j