#include <stdio.h>
unsigned char f(unsigned char x) {
return ((x << 1) ^ (x>127) ^ x ^ (x >> 1) ^ ((x & 1) << 7)) + x;
}
void iterate(unsigned char s[5]) {
unsigned char new_s[5];
int i;
new_s[0] = f(s[3]) + s[4] + s[1] + f(s[2]);
new_s[1] = f(s[4]) + s[0] + s[2] + f(s[3]);
new_s[2] = f(s[0]) + s[1] + s[3] + f(s[4]);
new_s[3] = f(s[1]) + s[2] + s[4] + f(s[0]);
new_s[4] = f(s[2]) + s[3] + s[0] + f(s[1]);
for (i=0; i<5; i++) {
s[i] = new_s[i];
}
}
int main() {
int i, j;
unsigned char s[5] = { 0, 1, 2, 3, 4 };
unsigned char t[5];
/* Start by iterating a million times */
for (i=0; i<1000000; i++) iterate(s);
/* Store the updated seed values */
for (i=0; i<5; i++) t[i]=s[i];
/* Now see if they come up again */
for (j=1; j<1000000000; j++) {
iterate(s);
if (s[0]==t[0] && s[1]==t[1] && s[2]==t[2] && s[3]==t[3] && s[4]==t[4]) {
printf("Stuck in a loop of length %d\n",j
); for (i
=0; i
<5; i
++) printf("%hhu ",s
[i
]); return 0;
}
}
/* We probably won't end up here */
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp1bnNpZ25lZCBjaGFyIGYodW5zaWduZWQgY2hhciB4KSB7CiAgcmV0dXJuICgoeCA8PCAxKSBeICh4PjEyNykgXiB4IF4gKHggPj4gMSkgXiAoKHggJiAxKSA8PCA3KSkgKyB4Owp9Cgp2b2lkIGl0ZXJhdGUodW5zaWduZWQgY2hhciBzWzVdKSB7CiAgdW5zaWduZWQgY2hhciBuZXdfc1s1XTsKICBpbnQgaTsKICBuZXdfc1swXSA9IGYoc1szXSkgKyBzWzRdICsgc1sxXSArIGYoc1syXSk7CiAgbmV3X3NbMV0gPSBmKHNbNF0pICsgc1swXSArIHNbMl0gKyBmKHNbM10pOwogIG5ld19zWzJdID0gZihzWzBdKSArIHNbMV0gKyBzWzNdICsgZihzWzRdKTsKICBuZXdfc1szXSA9IGYoc1sxXSkgKyBzWzJdICsgc1s0XSArIGYoc1swXSk7CiAgbmV3X3NbNF0gPSBmKHNbMl0pICsgc1szXSArIHNbMF0gKyBmKHNbMV0pOwogIGZvciAoaT0wOyBpPDU7IGkrKykgewogICAgc1tpXSA9IG5ld19zW2ldOwogIH0KfQoKaW50IG1haW4oKSB7CiAgaW50IGksIGo7CiAgdW5zaWduZWQgY2hhciBzWzVdID0geyAwLCAxLCAyLCAzLCA0IH07CiAgdW5zaWduZWQgY2hhciB0WzVdOwogIAogIC8qIFN0YXJ0IGJ5IGl0ZXJhdGluZyBhIG1pbGxpb24gdGltZXMgKi8KICBmb3IgKGk9MDsgaTwxMDAwMDAwOyBpKyspIGl0ZXJhdGUocyk7CiAgCiAgLyogU3RvcmUgdGhlIHVwZGF0ZWQgc2VlZCB2YWx1ZXMgKi8KICBmb3IgKGk9MDsgaTw1OyBpKyspIHRbaV09c1tpXTsKICAKICAvKiBOb3cgc2VlIGlmIHRoZXkgY29tZSB1cCBhZ2FpbiAqLwogIGZvciAoaj0xOyBqPDEwMDAwMDAwMDA7IGorKykgewogICAgaXRlcmF0ZShzKTsKICAgIGlmIChzWzBdPT10WzBdICYmIHNbMV09PXRbMV0gJiYgc1syXT09dFsyXSAmJiBzWzNdPT10WzNdICYmIHNbNF09PXRbNF0pIHsKICAgICAgcHJpbnRmKCJTdHVjayBpbiBhIGxvb3Agb2YgbGVuZ3RoICVkXG4iLGopOwogICAgICBmb3IgKGk9MDsgaTw1OyBpKyspIHByaW50ZigiJWhodSAiLHNbaV0pOwogICAgICBwdXRjaGFyKCdcbicpOwogICAgICByZXR1cm4gMDsKICAgIH0KICB9CiAgCiAgLyogV2UgcHJvYmFibHkgd29uJ3QgZW5kIHVwIGhlcmUgKi8KICBwdXRzKCJObyByZXBldGl0aW9ucyIpOwogIAogIHJldHVybiAwOwp9Cg==