#include #define Ch(x, y, z) ((x & y) ^ (~x & z)) #define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) //#define f(x, y, z) ((y) ^ ((x) | ~(z))) #define f(x, y, z) ((x & y) | (z & (x | y))) //#define f(x, y, z) Maj(x, y, z) #define sel(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) int main(void) { unsigned int x, y, z; unsigned int i, j, k; for (k = 0; k <= 25; k++) for (j = 0; j < 6; j++) for (i = 0; i < 4; i++) { unsigned int ok = 0; for (x = 0; x < 2; x++) for (y = 0; y < 2; y++) for (z = 0; z < 2; z++) { unsigned int f1 = f(x, y, z); unsigned int a[4] = {0, x, y, z}; switch (j) { case 1: a[1] = x; a[2] = z; a[3] = y; break; case 2: a[1] = y; a[2] = x; a[3] = z; break; case 3: a[1] = y; a[2] = z; a[3] = x; break; case 4: a[1] = z; a[2] = x; a[3] = y; break; case 5: a[1] = z; a[2] = y; a[3] = x; break; } unsigned int f2 = sel(a[1], a[2], a[3]); a[0] = f2; if (k == 25) { if (f2 == f1) ok++; continue; } unsigned int *which = &a[i]; switch (k) { case 0: *which = ~*which; break; case 1: case 2: case 3: if (which == &a[k]) continue; *which ^= a[k]; break; case 4: case 5: case 6: if (which == &a[k - 3]) continue; *which |= a[k - 3]; break; case 7: case 8: case 9: if (which == &a[k - 6]) continue; *which &= a[k - 6]; break; case 10: case 11: case 12: if (which == &a[k - 9]) continue; *which ^= ~a[k - 9]; break; case 13: case 14: case 15: if (which == &a[k - 12]) continue; *which |= ~a[k - 12]; break; case 16: case 17: case 18: if (which == &a[k - 15]) continue; *which = ~*which | a[k - 15]; break; case 19: case 20: case 21: if (which == &a[k - 18]) continue; *which &= ~a[k - 18]; break; case 22: case 23: case 24: if (which == &a[k - 21]) continue; *which = ~*which & a[k - 21]; break; } if (which != &a[0]) f2 = sel(a[1], a[2], a[3]); if (f2 == f1) ok++; } if (ok == 8) printf("k = %u j = %u i = %u\n", k, j, i); } return 0; }