unsigned step(unsigned state, unsigned mask, unsigned pos)
{
unsigned bit1=(mask>>8)&1, bit2=(mask>>7)&1, bit3=(mask>>6)&1,
bit4=(mask>>5)&1, bit5=(mask>>4)&1, bit6=(mask>>3)&1,
bit7=(mask>>2)&1, bit8=(mask>>1)&1, bit9=(mask>>0)&1;
switch (pos)
{
case 1:
state^=bit5<<15;
state^=bit6<<14;
state^=bit8<<11;
state^=bit9<<10;
break;
case 2:
state^=bit4<<15;
state^=bit5<<14;
state^=bit6<<13;
state^=bit7<<11;
state^=bit8<<10;
state^=bit9<<9;
break;
case 3:
state^=bit4<<14;
state^=bit5<<13;
state^=bit6<<12;
state^=bit7<<10;
state^=bit8<<9;
state^=bit9<<8;
break;
case 4:
state^=bit4<<13;
state^=bit5<<12;
state^=bit7<<9;
state^=bit8<<8;
break;
case 5:
state^=bit2<<15;
state^=bit3<<14;
state^=bit5<<11;
state^=bit6<<10;
state^=bit8<<7;
state^=bit9<<6;
break;
case 6:
state^=bit1<<15;
state^=bit2<<14;
state^=bit3<<13;
state^=bit4<<11;
state^=bit5<<10;
state^=bit6<<9;
state^=bit7<<7;
state^=bit8<<6;
state^=bit9<<5;
break;
case 7:
state^=bit1<<14;
state^=bit2<<13;
state^=bit3<<12;
state^=bit4<<10;
state^=bit5<<9;
state^=bit6<<8;
state^=bit7<<6;
state^=bit8<<5;
state^=bit9<<4;
break;
case 8:
state^=bit1<<13;
state^=bit2<<12;
state^=bit4<<9;
state^=bit5<<8;
state^=bit7<<5;
state^=bit8<<4;
break;
case 9:
state^=bit2<<11;
state^=bit3<<10;
state^=bit5<<7;
state^=bit6<<6;
state^=bit8<<3;
state^=bit9<<2;
break;
case 10:
state^=bit1<<11;
state^=bit2<<10;
state^=bit3<<9;
state^=bit4<<7;
state^=bit5<<6;
state^=bit6<<5;
state^=bit7<<3;
state^=bit8<<2;
state^=bit9<<1;
break;
case 11:
state^=bit1<<10;
state^=bit2<<9;
state^=bit3<<8;
state^=bit4<<6;
state^=bit5<<5;
state^=bit6<<4;
state^=bit7<<2;
state^=bit8<<1;
state^=bit9<<0;
break;
case 12:
state^=bit1<<9;
state^=bit2<<8;
state^=bit4<<5;
state^=bit5<<4;
state^=bit7<<1;
state^=bit8<<0;
break;
case 13:
state^=bit2<<7;
state^=bit3<<6;
state^=bit5<<3;
state^=bit6<<2;
break;
case 14:
state^=bit1<<7;
state^=bit2<<6;
state^=bit3<<5;
state^=bit4<<3;
state^=bit5<<2;
state^=bit6<<1;
break;
case 15:
state^=bit1<<6;
state^=bit2<<5;
state^=bit3<<4;
state^=bit4<<2;
state^=bit5<<1;
state^=bit6<<0;
break;
case 16:
state^=bit1<<5;
state^=bit2<<4;
state^=bit4<<1;
state^=bit5<<0;
break;
}
return state;
}
dW5zaWduZWQgc3RlcCh1bnNpZ25lZCBzdGF0ZSwgdW5zaWduZWQgbWFzaywgdW5zaWduZWQgcG9zKQp7CiAgICB1bnNpZ25lZCBiaXQxPShtYXNrPj44KSYxLCBiaXQyPShtYXNrPj43KSYxLCBiaXQzPShtYXNrPj42KSYxLAogICAgICAgICAgICAgYml0ND0obWFzaz4+NSkmMSwgYml0NT0obWFzaz4+NCkmMSwgYml0Nj0obWFzaz4+MykmMSwKICAgICAgICAgICAgIGJpdDc9KG1hc2s+PjIpJjEsIGJpdDg9KG1hc2s+PjEpJjEsIGJpdDk9KG1hc2s+PjApJjE7CiAgICBzd2l0Y2ggKHBvcykKICAgIHsKICAgIGNhc2UgMToKICAgICAgICBzdGF0ZV49Yml0NTw8MTU7CiAgICAgICAgc3RhdGVePWJpdDY8PDE0OwogICAgICAgIHN0YXRlXj1iaXQ4PDwxMTsKICAgICAgICBzdGF0ZV49Yml0OTw8MTA7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICAgICAgc3RhdGVePWJpdDQ8PDE1OwogICAgICAgIHN0YXRlXj1iaXQ1PDwxNDsKICAgICAgICBzdGF0ZV49Yml0Njw8MTM7CiAgICAgICAgc3RhdGVePWJpdDc8PDExOwogICAgICAgIHN0YXRlXj1iaXQ4PDwxMDsKICAgICAgICBzdGF0ZV49Yml0OTw8OTsKICAgICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgICBzdGF0ZV49Yml0NDw8MTQ7CiAgICAgICAgc3RhdGVePWJpdDU8PDEzOwogICAgICAgIHN0YXRlXj1iaXQ2PDwxMjsKICAgICAgICBzdGF0ZV49Yml0Nzw8MTA7CiAgICAgICAgc3RhdGVePWJpdDg8PDk7CiAgICAgICAgc3RhdGVePWJpdDk8PDg7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgc3RhdGVePWJpdDQ8PDEzOwogICAgICAgIHN0YXRlXj1iaXQ1PDwxMjsKICAgICAgICBzdGF0ZV49Yml0Nzw8OTsKICAgICAgICBzdGF0ZV49Yml0ODw8ODsKICAgICAgICBicmVhazsKICAgIGNhc2UgNToKICAgICAgICBzdGF0ZV49Yml0Mjw8MTU7CiAgICAgICAgc3RhdGVePWJpdDM8PDE0OwogICAgICAgIHN0YXRlXj1iaXQ1PDwxMTsKICAgICAgICBzdGF0ZV49Yml0Njw8MTA7CiAgICAgICAgc3RhdGVePWJpdDg8PDc7CiAgICAgICAgc3RhdGVePWJpdDk8PDY7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDY6CiAgICAgICAgc3RhdGVePWJpdDE8PDE1OwogICAgICAgIHN0YXRlXj1iaXQyPDwxNDsKICAgICAgICBzdGF0ZV49Yml0Mzw8MTM7CiAgICAgICAgc3RhdGVePWJpdDQ8PDExOwogICAgICAgIHN0YXRlXj1iaXQ1PDwxMDsKICAgICAgICBzdGF0ZV49Yml0Njw8OTsKICAgICAgICBzdGF0ZV49Yml0Nzw8NzsKICAgICAgICBzdGF0ZV49Yml0ODw8NjsKICAgICAgICBzdGF0ZV49Yml0OTw8NTsKICAgICAgICBicmVhazsKICAgIGNhc2UgNzoKICAgICAgICBzdGF0ZV49Yml0MTw8MTQ7CiAgICAgICAgc3RhdGVePWJpdDI8PDEzOwogICAgICAgIHN0YXRlXj1iaXQzPDwxMjsKICAgICAgICBzdGF0ZV49Yml0NDw8MTA7CiAgICAgICAgc3RhdGVePWJpdDU8PDk7CiAgICAgICAgc3RhdGVePWJpdDY8PDg7CiAgICAgICAgc3RhdGVePWJpdDc8PDY7CiAgICAgICAgc3RhdGVePWJpdDg8PDU7CiAgICAgICAgc3RhdGVePWJpdDk8PDQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDg6CiAgICAgICAgc3RhdGVePWJpdDE8PDEzOwogICAgICAgIHN0YXRlXj1iaXQyPDwxMjsKICAgICAgICBzdGF0ZV49Yml0NDw8OTsKICAgICAgICBzdGF0ZV49Yml0NTw8ODsKICAgICAgICBzdGF0ZV49Yml0Nzw8NTsKICAgICAgICBzdGF0ZV49Yml0ODw8NDsKICAgICAgICBicmVhazsKICAgIGNhc2UgOToKICAgICAgICBzdGF0ZV49Yml0Mjw8MTE7CiAgICAgICAgc3RhdGVePWJpdDM8PDEwOwogICAgICAgIHN0YXRlXj1iaXQ1PDw3OwogICAgICAgIHN0YXRlXj1iaXQ2PDw2OwogICAgICAgIHN0YXRlXj1iaXQ4PDwzOwogICAgICAgIHN0YXRlXj1iaXQ5PDwyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxMDoKICAgICAgICBzdGF0ZV49Yml0MTw8MTE7CiAgICAgICAgc3RhdGVePWJpdDI8PDEwOwogICAgICAgIHN0YXRlXj1iaXQzPDw5OwogICAgICAgIHN0YXRlXj1iaXQ0PDw3OwogICAgICAgIHN0YXRlXj1iaXQ1PDw2OwogICAgICAgIHN0YXRlXj1iaXQ2PDw1OwogICAgICAgIHN0YXRlXj1iaXQ3PDwzOwogICAgICAgIHN0YXRlXj1iaXQ4PDwyOwogICAgICAgIHN0YXRlXj1iaXQ5PDwxOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxMToKICAgICAgICBzdGF0ZV49Yml0MTw8MTA7CiAgICAgICAgc3RhdGVePWJpdDI8PDk7CiAgICAgICAgc3RhdGVePWJpdDM8PDg7CiAgICAgICAgc3RhdGVePWJpdDQ8PDY7CiAgICAgICAgc3RhdGVePWJpdDU8PDU7CiAgICAgICAgc3RhdGVePWJpdDY8PDQ7CiAgICAgICAgc3RhdGVePWJpdDc8PDI7CiAgICAgICAgc3RhdGVePWJpdDg8PDE7CiAgICAgICAgc3RhdGVePWJpdDk8PDA7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDEyOgogICAgICAgIHN0YXRlXj1iaXQxPDw5OwogICAgICAgIHN0YXRlXj1iaXQyPDw4OwogICAgICAgIHN0YXRlXj1iaXQ0PDw1OwogICAgICAgIHN0YXRlXj1iaXQ1PDw0OwogICAgICAgIHN0YXRlXj1iaXQ3PDwxOwogICAgICAgIHN0YXRlXj1iaXQ4PDwwOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxMzoKICAgICAgICBzdGF0ZV49Yml0Mjw8NzsKICAgICAgICBzdGF0ZV49Yml0Mzw8NjsKICAgICAgICBzdGF0ZV49Yml0NTw8MzsKICAgICAgICBzdGF0ZV49Yml0Njw8MjsKICAgICAgICBicmVhazsKICAgIGNhc2UgMTQ6CiAgICAgICAgc3RhdGVePWJpdDE8PDc7CiAgICAgICAgc3RhdGVePWJpdDI8PDY7CiAgICAgICAgc3RhdGVePWJpdDM8PDU7CiAgICAgICAgc3RhdGVePWJpdDQ8PDM7CiAgICAgICAgc3RhdGVePWJpdDU8PDI7CiAgICAgICAgc3RhdGVePWJpdDY8PDE7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDE1OgogICAgICAgIHN0YXRlXj1iaXQxPDw2OwogICAgICAgIHN0YXRlXj1iaXQyPDw1OwogICAgICAgIHN0YXRlXj1iaXQzPDw0OwogICAgICAgIHN0YXRlXj1iaXQ0PDwyOwogICAgICAgIHN0YXRlXj1iaXQ1PDwxOwogICAgICAgIHN0YXRlXj1iaXQ2PDwwOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxNjoKICAgICAgICBzdGF0ZV49Yml0MTw8NTsKICAgICAgICBzdGF0ZV49Yml0Mjw8NDsKICAgICAgICBzdGF0ZV49Yml0NDw8MTsKICAgICAgICBzdGF0ZV49Yml0NTw8MDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBzdGF0ZTsKfQ==