Hashtron inference: Difference between revisions
Content added Content deleted
(Removed my own post for correction of output.) |
m (Reposted a corrected program.) |
||
Line 654: | Line 654: | ||
} |
} |
||
}</syntaxhighlight> |
}</syntaxhighlight> |
||
===Both Demos=== |
|||
<syntaxhighlight lang="java"> |
|||
public final class HashtronInference { |
|||
public static void main(String[] args) { |
|||
int command = 42; |
|||
int bits = 64; |
|||
int[][] program = { { 0, 2 } }; |
|||
long result = inference(command, bits, program); |
|||
System.out.println("Test demo: " + Long.toUnsignedString(result)); |
|||
System.out.println(); |
|||
bits = 4; |
|||
program = new int[][] { |
|||
{ 8776, 79884 }, { 12638, 1259 }, { 9953, 1242 }, { 4658, 1228 }, { 5197, 1210 }, { 12043, 1201 }, |
|||
{ 6892, 1183 }, { 7096, 1168 }, { 10924, 1149 }, { 5551, 1136 }, { 5580, 1123 }, { 3735, 1107 }, |
|||
{ 3652, 1091 }, { 12191, 1076 }, { 14214, 1062 }, { 13056, 1045 }, { 14816, 1031 }, { 15205, 1017 }, |
|||
{ 10736, 1001 }, { 9804, 989 }, { 13081, 974 }, { 6706, 960 }, { 13698, 944 }, { 14369, 928 }, |
|||
{ 16806, 917 }, { 9599, 906 }, { 9395, 897 }, { 4885, 883 }, { 10237, 870 }, { 10676, 858 }, |
|||
{ 18518, 845 }, { 2619, 833 }, { 13715, 822 }, { 11065, 810 }, { 9590, 799 }, { 5747, 785 }, |
|||
{ 2627, 776 }, { 8962, 764 }, { 5575, 750 }, { 3448, 738 }, { 5731, 725 }, { 9434, 714 }, |
|||
{ 3163, 703 }, { 3307, 690 }, { 3248, 678 }, { 3259, 667 }, { 3425, 657 }, { 3506, 648 }, |
|||
{ 3270, 639 }, { 3634, 627 }, { 3077, 617 }, { 3511, 606 }, { 27159, 597 }, { 27770, 589 }, |
|||
{ 28496, 580 }, { 28481, 571 }, { 29358, 562 }, { 31027, 552 }, { 30240, 543 }, { 30643, 534 }, |
|||
{ 31351, 527 }, { 31993, 519 }, { 32853, 510 }, { 33078, 502 }, { 33688, 495 }, { 29732, 487 }, |
|||
{ 29898, 480 }, { 29878, 474 }, { 26046, 468 }, { 26549, 461 }, { 28792, 453 }, { 26101, 446 }, |
|||
{ 32971, 439 }, { 29704, 432 }, { 23193, 426 }, { 29509, 421 }, { 27079, 415 }, { 32453, 409 }, |
|||
{ 24737, 404 }, { 25725, 400 }, { 23755, 395 }, { 52538, 393 }, { 53242, 386 }, { 19609, 380 }, |
|||
{ 26492, 377 }, { 24566, 358 }, { 31163, 368 }, { 57174, 363 }, { 26639, 364 }, { 31365, 357 }, |
|||
{ 60918, 350 }, { 21235, 338 }, { 28072, 322 }, { 28811, 314 }, { 27571, 320 }, { 17635, 309 }, |
|||
{ 51968, 169 }, { 54367, 323 }, { 60541, 254 }, { 26732, 270 }, { 52457, 157 }, { 27181, 276 }, |
|||
{ 19874, 227 }, { 22797, 320 }, { 59346, 271 }, { 25496, 260 }, { 54265, 231 }, { 22281, 250 }, |
|||
{ 42977, 318 }, { 26008, 240 }, { 87604, 142 }, { 94647, 314 }, { 52292, 157 }, { 20999, 216 }, |
|||
{ 89253, 316 }, { 22746, 29 }, { 68338, 312 }, { 22557, 317 }, { 110904, 104 }, { 70975, 285 }, |
|||
{ 51835, 277 }, { 51871, 313 }, { 132221, 228 }, { 18522, 290 }, { 68512, 285 }, { 118816, 302 }, |
|||
{ 150865, 268 }, { 68871, 273 }, { 68139, 290 }, { 84984, 285 }, { 150693, 266 }, { 396047, 272 }, |
|||
{ 84923, 269 }, { 215562, 258 }, { 68015, 248 }, { 247689, 235 }, { 214471, 229 }, { 264395, 221 }, |
|||
{ 263287, 212 }, { 280193, 201 }, { 108065, 194 }, { 263616, 187 }, { 148609, 176 }, { 263143, 173 }, |
|||
{ 378205, 162 }, { 312547, 154 }, { 50400, 147 }, { 328927, 140 }, { 279217, 132 }, { 181111, 127 }, |
|||
{ 672098, 118 }, { 657196, 113 }, { 459383, 111 }, { 833281, 105 }, { 520281, 102 }, { 755397, 95 }, |
|||
{ 787994, 91 }, { 492444, 82 }, { 1016592, 77 }, { 656147, 71 }, { 819893, 66 }, { 165531, 61 }, |
|||
{ 886503, 57 }, { 1016551, 54 }, { 3547827, 49 }, { 14398170, 43 }, { 395900, 41 }, { 4950628, 37 }, |
|||
{ 11481175, 33 }, { 100014881, 30 }, { 8955328, 31 }, { 11313984, 27 }, { 13640855, 23 }, |
|||
{ 528553762, 21 }, { 63483027, 17 }, { 952477, 8 }, { 950580, 4 }, {918378, 2 }, { 918471, 1 } |
|||
}; |
|||
System.out.println("Square root demo for commands in 0..255:"); |
|||
for ( command = 0; command < 256; command++ ) { |
|||
System.out.print( |
|||
String.format("%2d%s", inference(command, bits, program), ( command % 16 == 15 ) ? "\n" : " " )); |
|||
} |
|||
} |
|||
public static long inference(int command, int bits, int[][] program) { |
|||
long result = 0; |
|||
if ( program.length == 0 ) { |
|||
return result; |
|||
} |
|||
for ( int j = 0; j < bits; j++ ) { |
|||
int number = command | ( j << 16 ); |
|||
final int saltOne = program[0][0]; |
|||
int maxValue = program[0][1]; |
|||
number = hash(number, saltOne, maxValue); |
|||
for ( int i = 1; i < program.length; i++ ) { |
|||
final int saltTwo = program[i][0]; |
|||
final int max = program[i][1]; |
|||
maxValue -= max; |
|||
number = hash(number, saltTwo, maxValue); |
|||
} |
|||
number &= 1; |
|||
if ( number != 0 ) { |
|||
result |= ( 1L << j ); |
|||
} |
|||
} |
|||
return result; |
|||
} |
|||
public static int hash(int number, int salt, int maxValue) { |
|||
// Mixing stage 1, mix 'number' with 'salt' using subtraction |
|||
long m = ( number - salt ) & 0xFFFFFFFFL; |
|||
// Hashing stage, use xor shift with prime coefficients |
|||
m ^= ( m << 2 ) & 0xFFFFFFFFL; |
|||
m ^= ( m << 3 ) & 0xFFFFFFFFL; |
|||
m ^= ( m >> 5 ) & 0xFFFFFFFFL; |
|||
m ^= ( m >> 7 ) & 0xFFFFFFFFL; |
|||
m ^= ( m << 11 ) & 0xFFFFFFFFL; |
|||
m ^= ( m << 13 ) & 0xFFFFFFFFL; |
|||
m ^= ( m >> 17 ) & 0xFFFFFFFFL; |
|||
m ^= ( m << 19 ) & 0xFFFFFFFFL; |
|||
// Mixing stage 2, mix 'number' with 'salt' using addition |
|||
m += salt; |
|||
m &= 0xFFFFFFFFL; |
|||
// Modular stage using Lemire's fast alternative to modulo reduction |
|||
return (int) ( ( ( m * maxValue ) >>> 32 ) & 0xFFFFFFFFL ); |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
{{ out }} |
|||
<pre> |
|||
Test demo: 14106184687260844995 |
|||
Square root demo for commands in 0..255: |
|||
0 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 |
|||
4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 |
|||
5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 |
|||
6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 |
|||
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 |
|||
8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 |
|||
9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 |
|||
10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 |
|||
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 |
|||
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 |
|||
12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 |
|||
13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 |
|||
13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 |
|||
14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 |
|||
14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 |
|||
15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 |
|||
</pre> |
|||
=={{header|Julia}}== |
=={{header|Julia}}== |