6 void printBinary(unsigned long number, int T) {
11 printf("%d", (int)(number/pow(2,i))%2);
16 void supplement(long stabStateIndices[], int T, double fractionSupplement)
19 int K = round(log(T)/log(2)); // T = 2^K
21 //printf("K=%d\n", K);
23 int treeDepth, levelMaskDepth, maskIndex;
25 unsigned long levelMask;
27 unsigned long long maskList[K];
29 unsigned long given = (unsigned long)stabStateIndices[0]; // the given bitstring
31 unsigned long bitstring;
33 int bitstringCounter = 1; // bitstringCounter starts at 1 since 0 is the given bitstring
34 int bitstringCounterMax = floor(fractionSupplement*T);
38 if(bitstringCounter > bitstringCounterMax) return;
40 // first added bitstring is alpha ... alpha for alpha = 01
42 for(i=1; i<T/2; i++) {
46 //printf("%lu\n", bitstring);
47 stabStateIndices[bitstringCounter] = given^(bitstring);
49 if(bitstringCounter > bitstringCounterMax) return;
51 // second added bitstring is beta ... beta for beta = 10
53 for(i=1; i<T/2; i++) {
57 //printf("%lu\n", bitstring);
58 stabStateIndices[bitstringCounter] = given^bitstring;
60 if(bitstringCounter > bitstringCounterMax) return;
62 maskList[0] = round(pow(2,pow(2,K)))-1;
64 for(treeDepth=1; treeDepth<=K-1; treeDepth++) {
66 levelMask = round(pow(2,pow(2,K-treeDepth))-1);
67 // repeat this unit-cell mask to the other bits on levelMask
68 for(levelMaskDepth=2; levelMaskDepth<=round(pow(2,treeDepth-1)); levelMaskDepth++) {
69 levelMask += round(pow(2,pow(2,K-treeDepth+1)))*levelMask;
72 //printf("levelMask=");
73 //printBinary(levelMask, T);
75 bitstring = stabStateIndices[1] ^ levelMask;
77 for(maskIndex=0; maskIndex < (int)(pow(2,treeDepth)); maskIndex++) {
78 stabStateIndices[bitstringCounter] = bitstring;
79 for(i=0; i<treeDepth; i++){
80 // if ith binary digit of maskIndex is 1 then XOR with ith string in maskList
81 stabStateIndices[bitstringCounter] ^= ((int)(maskIndex/(pow(2,i)))%2)*maskList[i];
83 //printf("new bitstring=");
84 //printBinary(stabStateIndices[bitstringCounter], T);
86 if(bitstringCounter > bitstringCounterMax) return;
89 maskList[treeDepth] = levelMask;
96 int main(int argc, char *argv[])
99 int T = (int)pow(2,4);
100 long* stabStateIndices;
102 stabStateIndices = calloc(T+1,sizeof(long));
104 stabStateIndices[0] = (int)(pow(2,T))-1;
106 supplement(&stabStateIndices[0], T, 1.0);
110 printBinary(stabStateIndices[i], T);