Advertisement
fivemack

Pandigital hex product finder

Jun 12th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5. unsigned char q[9]; q[9]=3;
  6. unsigned long long X = 0;
  7. unsigned long long *y = (unsigned long long*)q;
  8.  
  9. unsigned long long Z0,Z1;
  10. unsigned long long N0 = 0xfedcba9876543210;
  11. unsigned long long C = 0xf8f7f6f5f4f3f2f1;
  12.  
  13. unsigned long long M0[16], M1[16];
  14. for (int i=0; i<16; i++)
  15. {
  16. M0[i] = (1ULL<<(4*i))-1;
  17. unsigned long long t = ~M0[i];
  18. M1[i] = t & (t<<4);
  19. }
  20.  
  21. // prepare the 40320 entries for the second table
  22. unsigned int* p2 = new unsigned int[40320];
  23. p2[0]=0x76543210;
  24.  
  25. for (int i=0; i<8; i++) q[i]=0;
  26. int ix = 1;
  27. while (ix!=40320)
  28. {
  29. q[0]++;
  30. int j = 0 ;
  31. while (q[j]==(8-j)) { q[j]=0; q[j+1]++; j++; }
  32. unsigned long long N = 0x76543210;
  33. unsigned long long Z0 = 0;
  34. for (int j=0; j<8; j++)
  35. {
  36. Z0 |= ((N>>(4*q[j]))&0xf)<<(4*j);
  37. N = (N & M0[q[j]]) | ((N & M1[q[j]])>>4);
  38. }
  39. p2[ix]=Z0; ix++;
  40. }
  41.  
  42. for (int i=0; i<8; i++) q[i]=0;
  43. while (q[7]!=8)
  44. {
  45. q[0]++;
  46. int j = 0;
  47. while (q[j]==(16-j)) { q[j]=0; q[j+1]++; j++; }
  48. unsigned long long N = N0;
  49. Z0 = (N>>(4*q[0]))&0xf;
  50. N = (N & M0[q[0]]) | ((N & M1[q[0]])>>4);
  51. for (int j=1; j<8; j++)
  52. {
  53. // printf("pre-%d %16llx %16llx\n", j, Z0, N);
  54. Z0 |= ((N>>(4*q[j]))&0xf)<<(4*j);
  55. N = (N & M0[q[j]]) | ((N & M1[q[j]])>>4);
  56. }
  57. // now we have the left-hand number in Z0
  58. // for the right-hand number we do something similar
  59. for (int u=0; u<40320; u++)
  60. {
  61. Z1 = 0;
  62. for (int k=0; k<8; k++)
  63. {
  64. unsigned int ix = (p2[u]>>(4*k))&0xf;
  65. unsigned int T = (N>>(4*ix))&0xf;
  66. unsigned int T1 = T<<(4*k);
  67. Z1 |= T1;
  68. }
  69. if (Z0<Z1)
  70. {
  71. unsigned long long prod = Z0*Z1;
  72. unsigned long long msk = 0;
  73. for (int k=0; k<16; k++)
  74. {
  75. msk |= 1<<((prod>>(4*k))&0xf);
  76. }
  77. if (msk == 0xffff)
  78. printf("%llx %llx %llx %llx\n", Z0, Z1, prod, msk);
  79. }
  80. }
  81. }
  82. printf("%llx\n",X);
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement