/* setoper.c: * A set operation library * created by Komei Fukuda, Nov.14, 1993 * modified on December 5, 1994 (set_card function replaced with a better code by David Bremner) * last modified on June 1, 2000 (set_fwrite_compl(), set_groundsize added. set_compl fixed.) */ #include "setoper.h" #include #define SETBITS (sizeof(long) * CHAR_BIT) /* (Number of chars in a long) * (number of bits in a char) */ /* Definitions for optimized set_card function by David Bremner bremner@cs.mcgill.ca */ /* Caution!!! Bremner's technique depends on the assumption that CHAR_BIT == 8. */ #define LUTBLOCKS(set) (((set[0]-1)/SETBITS+1)*(sizeof(long)/sizeof(set_card_lut_t))) static unsigned char set_card_lut[]={ 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8}; /* End of Definitions for optimized set_card */ unsigned long set_blocks(long len) { long blocks=1L; if (len>0) blocks=((long)len-1)/SETBITS+2; return blocks; } void set_initialize(set_type *setp, long length) /* Make a set with a given bit lengths */ { long i,forlim1,len; if (length<=0) len=1;else len=length; /* if negative length is requested, it generates the shortest length */ forlim1=set_blocks(len); *setp=(unsigned long *) calloc(forlim1, sizeof i); (*setp)[0]=(unsigned long) len; /* size of the ground set */ for (i=1; i=1;i--) { e1=e2=set[i]; for (j=SETBITS-1;j>=0;j--) { e1=(e1>>j); printf("%1ld",e1); e1=e2-(e1<=1;i--) { e1=e2=set[i]; for (j=SETBITS-1;j>=0;j--) { e1=(e1>>j); fprintf(f,"%1ld",e1); e1=e2-(e1<