Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int main(void)
- {
- unsigned char q[9]; q[9]=3;
- unsigned long long X = 0;
- unsigned long long *y = (unsigned long long*)q;
- unsigned long long Z0,Z1;
- unsigned long long N0 = 0xfedcba9876543210;
- unsigned long long C = 0xf8f7f6f5f4f3f2f1;
- unsigned long long M0[16], M1[16];
- for (int i=0; i<16; i++)
- {
- M0[i] = (1ULL<<(4*i))-1;
- unsigned long long t = ~M0[i];
- M1[i] = t & (t<<4);
- }
- // prepare the 40320 entries for the second table
- unsigned int* p2 = new unsigned int[40320];
- p2[0]=0x76543210;
- for (int i=0; i<8; i++) q[i]=0;
- int ix = 1;
- while (ix!=40320)
- {
- q[0]++;
- int j = 0 ;
- while (q[j]==(8-j)) { q[j]=0; q[j+1]++; j++; }
- unsigned long long N = 0x76543210;
- unsigned long long Z0 = 0;
- for (int j=0; j<8; j++)
- {
- Z0 |= ((N>>(4*q[j]))&0xf)<<(4*j);
- N = (N & M0[q[j]]) | ((N & M1[q[j]])>>4);
- }
- p2[ix]=Z0; ix++;
- }
- for (int i=0; i<8; i++) q[i]=0;
- while (q[7]!=8)
- {
- q[0]++;
- int j = 0;
- while (q[j]==(16-j)) { q[j]=0; q[j+1]++; j++; }
- unsigned long long N = N0;
- Z0 = (N>>(4*q[0]))&0xf;
- N = (N & M0[q[0]]) | ((N & M1[q[0]])>>4);
- for (int j=1; j<8; j++)
- {
- // printf("pre-%d %16llx %16llx\n", j, Z0, N);
- Z0 |= ((N>>(4*q[j]))&0xf)<<(4*j);
- N = (N & M0[q[j]]) | ((N & M1[q[j]])>>4);
- }
- // now we have the left-hand number in Z0
- // for the right-hand number we do something similar
- for (int u=0; u<40320; u++)
- {
- Z1 = 0;
- for (int k=0; k<8; k++)
- {
- unsigned int ix = (p2[u]>>(4*k))&0xf;
- unsigned int T = (N>>(4*ix))&0xf;
- unsigned int T1 = T<<(4*k);
- Z1 |= T1;
- }
- if (Z0<Z1)
- {
- unsigned long long prod = Z0*Z1;
- unsigned long long msk = 0;
- for (int k=0; k<16; k++)
- {
- msk |= 1<<((prod>>(4*k))&0xf);
- }
- if (msk == 0xffff)
- printf("%llx %llx %llx %llx\n", Z0, Z1, prod, msk);
- }
- }
- }
- printf("%llx\n",X);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement