How were they able to figure out that this happened? They deliberately things so that they dont find the right range. I have been here for a long time, but I am only answering now.
HISTORY = [
(1, 1), (2, 3), (3, 7), (4, 8), (5, 21), (6, 49), (7, 76), (8, 224), (9, 467), (10, 514),
(11, 1155), (12, 2683), (13, 5216), (14, 10544), (15, 26867), (16, 51510),
(17, 95823), (18, 198669), (19, 357535), (20, 863317), (21, 1811764),
(22, 3007503), (23, 5598802), (24, 14428676), (25, 33185509),
(26, 54538862), (27, 111949941), (28, 227634408), (29, 400708894),
(30, 1033162084), (31, 2102388551), (32, 3093472814), (33, 7137437912),
(34, 14133072157), (35, 20112871792), (36, 42387769980), (37, 100251560595),
(38, 146971536592), (39, 323724968937), (40, 1003651412950),
(41, 1458252205147), (42, 2895374552463), (43, 7409811047825),
(44, 15404761757071), (45, 19996463086597), (46, 51408670348612),
(47, 119666659114170), (48, 191206974700443), (49, 409118905032525),
(50, 611140496167764), (51, 2058769515153876), (52, 4216495639600700),
(53, 6763683971478124), (54, 9974455244496707), (55, 30045390491869460),
(56, 44218742292676575), (57, 138245758910846492), (58, 199976667976342049),
(59, 525070384258266191), (60, 1135041350219496382), (61, 1425787542618654982),
(62, 3908372542507822062), (63, 8993229949524469768),
(64, 17799667357578236628), (65, 30568377312064202855), (66, 46346217550346335726),
(67, 132656943602386256302)
]
# The constant in hex: 0x80000000000000000 (2^67)
CONST = 147573952589676412928
for puzzle, key in HISTORY:
hex_key = hex(key)
# Multiply key by 1.004 (as in your earlier example)
multiplied = key * 1.004
# Check if multiplied value is near a multiple of CONST
ratio = multiplied CONST
print(f"Puzzle {puzzle}:")
print(f" Private Key (dec): {key}")
print(f" Private Key (hex): {hex_key}")
print(f" Multiplied by 1.004: {multiplied:.2f}")
print(f" Ratio to CONST (0x800...): {ratio:.10f}")
print("-" * 50)
The private keys in hex do not directly align with 0x80000000000000000 (no obvious masking or shifting).
--------------------------------------------------
Puzzle 63:
Private Key (dec): 8993229949524469768
Private Key (hex): 0x7cce5efdaccf6808
Multiplied by 1.004: 9029202869322567680.00
Ratio to CONST (0x800...): 0.0611842585
--------------------------------------------------
Puzzle 64:
Private Key (dec): 17799667357578236628
Private Key (hex): 0xf7051f27b09112d4
Multiplied by 1.004: 17870866027008548864.00
Ratio to CONST (0x800...): 0.1210976986
--------------------------------------------------
Puzzle 65:
Private Key (dec): 30568377312064202855
Private Key (hex): 0x1a838b13505b26867
Multiplied by 1.004: 30690650821312462848.00
Ratio to CONST (0x800...): 0.2079679393
--------------------------------------------------
Puzzle 66:
Private Key (dec): 46346217550346335726
Private Key (hex): 0x2832ed74f2b5e35ee
Multiplied by 1.004: 46531602420547723264.00
Ratio to CONST (0x800...): 0.3153104027
--------------------------------------------------
Puzzle 67:
Private Key (dec): 132656943602386256302
Private Key (hex): 0x730fc235c1942c1ae
Multiplied by 1.004: 133187571376795795456.00
Ratio to CONST (0x800...): 0.9025140890
--------------------------------------------------
The keys are randomly generated (or pseudo-randomly derived from an unknown seed).
--------
import math
# Historical data: (puzzle_number, private_key_in_decimal)
HISTORY = [
(1, 1), (2, 3), (3, 7), (4, 8), (5, 21), (6, 49), (7, 76), (8, 224), (9, 467), (10, 514),
(11, 1155), (12, 2683), (13, 5216), (14, 10544), (15, 26867), (16, 51510),
(17, 95823), (18, 198669), (19, 357535), (20, 863317), (21, 1811764),
(22, 3007503), (23, 5598802), (24, 14428676), (25, 33185509),
(26, 54538862), (27, 111949941), (28, 227634408), (29, 400708894),
(30, 1033162084), (31, 2102388551), (32, 3093472814), (33, 7137437912),
(34, 14133072157), (35, 20112871792), (36, 42387769980), (37, 100251560595),
(38, 146971536592), (39, 323724968937), (40, 1003651412950),
(41, 1458252205147), (42, 2895374552463), (43, 7409811047825),
(44, 15404761757071), (45, 19996463086597), (46, 51408670348612),
(47, 119666659114170), (48, 191206974700443), (49, 409118905032525),
(50, 611140496167764), (51, 2058769515153876), (52, 4216495639600700),
(53, 6763683971478124), (54, 9974455244496707), (55, 30045390491869460),
(56, 44218742292676575), (57, 138245758910846492), (58, 199976667976342049),
(59, 525070384258266191), (60, 1135041350219496382), (61, 1425787542618654982),
(62, 3908372542507822062), (63, 8993229949524469768),
(64, 17799667357578236628), (65, 30568377312064202855), (66, 46346217550346335726),
(67, 132656943602386256302)
]
# Calculate exact bit flips between consecutive puzzles
EXACT_FLIPS = []
for i in range(1, len(HISTORY)):
prev_num, prev_key = HISTORY[i-1]
curr_num, curr_key = HISTORY[i]
flips = bin(prev_key ^ curr_key).count('1')
EXACT_FLIPS.append((prev_num, curr_num, flips))
print(f"Puzzle {prev_num}→{curr_num}: {flips} bit flips")
print("\nFull flip count table:")
print("Start → End | Bit Flips")
print("-----------------------")
for entry in EXACT_FLIPS:
print(f"{entry[0]:3} → {entry[1]:3} | {entry[2]:3}")
Puzzle 49→50: 29 bit flips
Puzzle 50→51: 25 bit flips
Puzzle 51→52: 27 bit flips
Puzzle 52→53: 26 bit flips
Puzzle 53→54: 30 bit flips
Puzzle 54→55: 31 bit flips
Puzzle 55→56: 31 bit flips
Puzzle 56→57: 33 bit flips
Puzzle 57→58: 28 bit flips
Puzzle 58→59: 30 bit flips
Puzzle 59→60: 31 bit flips
Puzzle 60→61: 25 bit flips
Puzzle 61→62: 35 bit flips
Puzzle 62→63: 34 bit flips
Puzzle 63→64: 34 bit flips
Puzzle 64→65: 37 bit flips
Puzzle 65→66: 35 bit flips
Puzzle 66→67: 31 bit flips
But bit flips between consecutive private keys are very interesting.
