Hashtron inference: Difference between revisions
Content added Content deleted
(added Raku programming solution) |
(New post.) |
||
Line 224: | Line 224: | ||
14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 |
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 |
15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 |
||
</pre> |
|||
=={{header|C++}}== |
|||
<syntaxhighlight lang="c++"> |
|||
#include <cstdint> |
|||
#include <iomanip> |
|||
#include <iostream> |
|||
#include <vector> |
|||
const uint64_t MASK = 0xFFFFFFFF; |
|||
uint64_t hash(const uint64_t& number, const uint64_t& salt, const uint64_t& max_value) { |
|||
// Mixing stage 1, mix 'number' with 'salt' using subtraction |
|||
uint64_t m = ( number - salt ) & MASK; |
|||
// Hashing stage, use xor shift with prime coefficients |
|||
m ^= ( m << 2 ) & MASK; |
|||
m ^= ( m << 3 ) & MASK; |
|||
m ^= ( m >> 5 ) & MASK; |
|||
m ^= ( m >> 7 ) & MASK; |
|||
m ^= ( m << 11 ) & MASK; |
|||
m ^= ( m << 13 ) & MASK; |
|||
m ^= ( m >> 17 ) & MASK; |
|||
m ^= ( m << 19 ) & MASK; |
|||
// Mixing stage 2, mix 'number' with 'salt' using addition |
|||
m += salt; |
|||
m &= MASK; |
|||
// Modular stage using Lemire's fast alternative to modulo reduction |
|||
return ( ( m * max_value ) >> 32 ) & MASK; |
|||
} |
|||
uint64_t inference(const uint64_t& command, const uint64_t& bits, const std::vector<std::vector<uint64_t>>& program) { |
|||
uint64_t result = 0; |
|||
if ( program.size() == 0 ) { |
|||
return result; |
|||
} |
|||
for ( uint64_t j = 0; j < bits; ++j ) { |
|||
uint64_t number = ( command & MASK ) | ( ( j & 0xFF ) << 16 ); |
|||
const uint64_t salt_1 = program[0][0]; |
|||
uint64_t max_value = program[0][1]; |
|||
number = hash(number, salt_1, max_value); |
|||
for ( uint64_t i = 1; i < program.size(); ++i ) { |
|||
const uint64_t salt_2 = program[i][0]; |
|||
const uint64_t max = program[i][1]; |
|||
max_value -= max; |
|||
number = hash(number, salt_2, max_value); |
|||
} |
|||
number &= 1; |
|||
if ( number != 0 ) { |
|||
result |= ( 1 << j ); |
|||
} |
|||
} |
|||
return result; |
|||
} |
|||
int main() { |
|||
uint64_t command = 42; |
|||
uint64_t bits = 64; |
|||
std::vector<std::vector<uint64_t>> program = { { 0, 2 } }; |
|||
std::cout << "Test demo: " << inference(command, bits, program) << std::endl << std::endl; |
|||
bits = 4; |
|||
program = { |
|||
{ 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 } |
|||
}; |
|||
std::cout << "Square root demo for commands in 0..255:" << std::endl; |
|||
for ( command = 0; command < 256; ++command ) { |
|||
std::cout << std::setw(2) << inference(command, bits, program) << ( ( command % 16 == 15 ) ? "\n" : " " ); |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
{{ out }} |
|||
<pre> |
|||
Test demo: 18446744073709551615 |
|||
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> |
</pre> |
||