Your code is very good but it is brute forcing and what I am doing is not, my code generates private keys from 1 to 160 bits in a few seconds, for the first ten addresses I already have the code in a second I generate real private keys for all 10 of the puzzle.Maybe you have some ideas on how to improvise my code.
from collections import defaultdict
SOLVED_KEYS = {
1: 1, 2: 3, 3: 7, 4: 8, 5: 21, 10: 514
}
def calculate_pattern_score(keys):
score = 0
patterns = {
'mersenne': lambda k: all(x == (2**i - 1) for i, x in enumerate(k, start=1)),
'bitwise': lambda k: all(k[i] == (k[i-1] << 1) + 1 for i in range(1, len(k))),
'prime': lambda k: sum(is_prime(x) for x in k)
}
for name, check in patterns.items():
if name == 'mersenne' and check(keys):
score += 5
elif name == 'bitwise' and check(keys):
score += 3
elif name == 'prime':
score += min(check(keys), 2)
return score
def find_cycles(max_cycle=10):
cycle_scores = defaultdict(int)
puzzles = sorted(SOLVED_KEYS.items())
for cycle in range(2, max_cycle+1):
groups = defaultdict(list)
for idx, (pn, key) in enumerate(puzzles):
groups[idx//cycle].append((pn, key))
total_score = sum(
calculate_pattern_score([k for _, k in group])
for group in groups.values()
)
cycle_scores[cycle] = total_score
best_cycle = max(cycle_scores, key=cycle_scores.get)
return best_cycle, cycle_scores
def analyze_groups(cycle_length):
groups = defaultdict(list)
puzzles = sorted(SOLVED_KEYS.items())
for idx, (pn, key) in enumerate(puzzles):
group_id = idx // cycle_length
groups[group_id].append((pn, key))
print(f"\nCycle length: {cycle_length}")
for group_id, group in groups.items():
pns = [pn for pn, _ in group]
keys = [key for _, key in group]
print(f"Group {group_id+1} (Puzzles {pns}): Keys {keys}")
# Compare groups for cycle lengths 2 and 3
analyze_groups(2)
analyze_groups(3)
def is_prime(n):
if n < 2: return False
for i in range(2, int(n**0.5)+1):
if n % i == 0: return False
return True
# Run analysis
best_cycle, scores = find_cycles()
print(f"Most likely cycle length: {best_cycle}")
print("Cycle scores:", dict(scores))
%runfile /home/blackangel/untitled21.py --wdir
Cycle length: 2
Group 1 (Puzzles [1, 2]): Keys [1, 3]
Group 2 (Puzzles [3, 4]): Keys [7, 8]
Group 3 (Puzzles [5, 10]): Keys [21, 514]
Cycle length: 3
Group 1 (Puzzles [1, 2, 3]): Keys [1, 3, 7]
Group 2 (Puzzles [4, 5, 10]): Keys [8, 21, 514]
Most likely cycle length: 2
Cycle scores: {2: 10, 3: 10, 4: 2, 5: 5, 6: 2, 7: 2, 8: 2, 9: 2, 10: 2}