|
mcdouglasx (OP)
|
 |
November 06, 2025, 05:20:49 PM Last edit: November 20, 2025, 05:59:38 PM by mcdouglasx |
|
I've seen confusion about prefix searches for Bitcoin puzzles in this thread, and I've decided to provide a third, more detailed explanation of their function, explaining why, for "lucky hunters" the best option right now is prefix searches, as they offer a significant advantage when luck is involved. It was already concluded in this thread that in an exhaustive search comparing sequential searches versus prefix searches, there are no notable statistical advantages. However, this often confuses "treasure hunters" since most of them don't have access to GPU or CPU farms, making this comparison useless in home use. They need to change their mindset from needing to find the key at all costs when trying their luck, since exhaustively searching the entire space is pointless in both cases. With the limited resources of home computing, it's theoretically impossible to scan the entire range. This is where probabilistic search strategy comes in to increase your chances of success, since the prefix strategy is faster and consumes fewer resources, statistically increasing your probability of success in this "lottery". If your hardware is limited to a home PC or a couple of GPUs, the goal cannot be "brute force" or "sequential search". Your goal must be probabilistic efficiency. The point is not the feasibility of finding the solution, but rather that between trying sequentially versus using prefixes, prefixes are statistically superior and are THE ONLY RATIONAL OPTION. Focusing on a limited space like 71 bits, it would take home hardware many years to cover the entire range. "Sequential" searching (checking the entire range) is therefore a guaranteed path to failure due to lack of time. The puzzle finder must maximize the number of "lucky hits" per unit of time and computation. The Optimal Prefix-Block RelationshipThe essence of the prefix search strategy lies not in magic numbers, but in maintaining an optimal probabilistic relationship between two key variables: The Critical Variables:• Prefix Length (L): Number of hexadecimal characters of the target hash used as a filter • Block Size (N): Number of private keys we search for in each segment The Key Equation:16^L ≈ NWhere:• 16^L represents the total space of possible prefixes (16 hexadecimal characters per position) • N is the number of keys in each block Why Is This Relationship Optimal?• If 16^L ≫ N: Too many possible prefixes, low probability of finding matches → you lose efficiency • If 16^L ≪ N: Too many prefix matches, high risk of missing the target block → you lose accuracy The Ideal Probability:When 16^L ≈ N, the probability that at least one key in the block has the target prefix is approximately: P(match) ≈ 1 - (1 - 1/16^L)^N ≈ 63.2%
This is the optimal range where the method reaches its maximum efficiency. test scriptimport hashlib import random import time import math import statistics import scipy.stats as stats import statsmodels.stats.power as smp from math import ceil
# Configuration TOTAL_SIZE = 100_000 RANGE_SIZE = 4_096 PREFIX_LENGTH = 3 SIMULATIONS = 100000
SECP256K1_ORDER = int("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16)
print(f""" === Configuration === Total numbers: {TOTAL_SIZE:,} Block size: {RANGE_SIZE:,} Total blocks needed: {ceil(TOTAL_SIZE/RANGE_SIZE)} Prefix: {PREFIX_LENGTH} characters (16^{PREFIX_LENGTH} = {16**PREFIX_LENGTH:,} combinations) Simulations: {SIMULATIONS} secp256k1 order: {SECP256K1_ORDER} """)
def generate_h160(data): h = hashlib.new('ripemd160', str(data).encode('utf-8')) return h.hexdigest()
def shuffled_blck(total_blocks): blocks = list(range(total_blocks)) random.shuffle(blocks) return blocks
def sequential_search(dataset, block_size, target_hash, block_order): checks = 0 for block_idx in block_order: start = block_idx * block_size end = min(start + block_size, len(dataset)) for i in range(start, end): checks += 1 if generate_h160(dataset[i]) == target_hash: return {"checks": checks, "found": True, "index": i} return {"checks": checks, "found": False}
def prefix_search(dataset, block_size, prefix_len, target_hash, block_order): prefix = target_hash[:prefix_len] checks = 0 for block_idx in block_order: start = block_idx * block_size end = min(start + block_size, len(dataset)) found_prefix = False for i in range(start, end): checks += 1 current_hash = generate_h160(dataset[i]) if current_hash == target_hash: return {"checks": checks, "found": True, "index": i} if not found_prefix and current_hash.startswith(prefix): found_prefix = True break return {"checks": checks, "found": False}
def comp_cohens_d(list1, list2): if len(list1) < 2 or len(list2) < 2: return float('nan') n1, n2 = len(list1), len(list2) m1, m2 = statistics.mean(list1), statistics.mean(list2) s1, s2 = statistics.stdev(list1), statistics.stdev(list2) pooled_std = math.sqrt(((n1-1)*s1**2 + (n2-1)*s2**2) / (n1+n2-2)) if pooled_std == 0: return float('nan') return (m1 - m2) / pooled_std
def coeff_variation(data): if not data or statistics.mean(data) == 0: return float('nan') return (statistics.stdev(data) / statistics.mean(data)) * 100
def longest_streak(outcomes, letter): max_streak = current = 0 for o in outcomes: current = current + 1 if o == letter else 0 max_streak = max(max_streak, current) return max_streak
def ascii_bar(label, value, max_value, bar_length=50): bar_count = int((value / max_value) * bar_length) if max_value > 0 else 0 return f"{label:12}: {'#' * bar_count} ({value})"
def conf_interval(data, confidence=0.95): if len(data) < 2: return (0, 0) try: return stats.t.interval( confidence=confidence, df=len(data)-1, loc=statistics.mean(data), scale=stats.sem(data) ) except: return (statistics.mean(data), statistics.mean(data)) def statistical_analysis(seq_checks, pre_checks): analysis = {} analysis['seq_mean'] = statistics.mean(seq_checks) if seq_checks else 0 analysis['pre_mean'] = statistics.mean(pre_checks) if pre_checks else 0 analysis['seq_ci'] = conf_interval(seq_checks) analysis['pre_ci'] = conf_interval(pre_checks) if len(seq_checks) > 1 and len(pre_checks) > 1: analysis['t_test'] = stats.ttest_ind(seq_checks, pre_checks, equal_var=False) analysis['mann_whitney'] = stats.mannwhitneyu(seq_checks, pre_checks) analysis['cohen_d'] = comp_cohens_d(seq_checks, pre_checks) effect_size = abs(analysis['cohen_d']) if effect_size > 0: analysis['power'] = smp.tt_ind_solve_power( effect_size=effect_size, nobs1=len(seq_checks), alpha=0.05, ratio=len(pre_checks)/len(seq_checks) ) else: analysis['power'] = 0 else: analysis['t_test'] = None analysis['mann_whitney'] = None analysis['cohen_d'] = 0 analysis['power'] = 0 return analysis
def compare_methods(): results = { "sequential": {"wins": 0, "checks": [], "times": []}, "prefix": {"wins": 0, "checks": [], "times": []}, "ties": 0, "both_failed": 0 } outcome_history = [] total_blocks = ceil(TOTAL_SIZE / RANGE_SIZE) valid_cases = 0
for _ in range(SIMULATIONS): max_offset = SECP256K1_ORDER - TOTAL_SIZE - 1 offset = random.randint(0, max_offset) dataset = [offset + i for i in range(TOTAL_SIZE)] target_num = random.choice(dataset) target_hash = generate_h160(target_num) block_order = shuffled_blck(total_blocks)
start = time.perf_counter() seq_res = sequential_search(dataset, RANGE_SIZE, target_hash, block_order) seq_time = time.perf_counter() - start
start = time.perf_counter() pre_res = prefix_search(dataset, RANGE_SIZE, PREFIX_LENGTH, target_hash, block_order) pre_time = time.perf_counter() - start
if seq_res["found"] and pre_res["found"]: valid_cases += 1 results["sequential"]["checks"].append(seq_res["checks"]) results["prefix"]["checks"].append(pre_res["checks"]) results["sequential"]["times"].append(seq_time) results["prefix"]["times"].append(pre_time) if seq_res["checks"] < pre_res["checks"]: results["sequential"]["wins"] += 1 outcome_history.append("S") elif pre_res["checks"] < seq_res["checks"]: results["prefix"]["wins"] += 1 outcome_history.append("P") else: results["ties"] += 1 outcome_history.append("T") elif not seq_res["found"] and not pre_res["found"]: results["both_failed"] += 1 else: continue
def get_stats(data): if not data: return {"mean": 0, "min": 0, "max": 0, "median": 0, "stdev": 0} return { "mean": statistics.mean(data), "min": min(data), "max": max(data), "median": statistics.median(data), "stdev": statistics.stdev(data) if len(data) > 1 else 0 }
seq_stats = get_stats(results["sequential"]["checks"]) pre_stats = get_stats(results["prefix"]["checks"]) seq_time_stats = get_stats(results["sequential"]["times"]) pre_time_stats = get_stats(results["prefix"]["times"])
total_comparisons = results["sequential"]["wins"] + results["prefix"]["wins"] + results["ties"] seq_win_rate = results["sequential"]["wins"] / total_comparisons if total_comparisons > 0 else 0 pre_win_rate = results["prefix"]["wins"] / total_comparisons if total_comparisons > 0 else 0
cv_seq = coeff_variation(results["sequential"]["checks"]) cv_pre = coeff_variation(results["prefix"]["checks"])
stats_analysis = statistical_analysis( seq_checks=results["sequential"]["checks"], pre_checks=results["prefix"]["checks"] )
print(f""" === FINAL ANALYSIS === Valid cases (both found target): {valid_cases}/{SIMULATIONS}
[Performance Metrics] | Sequential | Prefix ---------------+---------------------+-------------------- Checks (mean) | {seq_stats['mean']:>12,.1f} ± {seq_stats['stdev']:,.1f} | {pre_stats['mean']:>12,.1f} ± {pre_stats['stdev']:,.1f} Time (mean ms) | {seq_time_stats['mean']*1000:>12.2f} ± {seq_time_stats['stdev']*1000:.2f} | {pre_time_stats['mean']*1000:>12.2f} ± {pre_time_stats['stdev']*1000:.2f} Min checks | {seq_stats['min']:>12,} | {pre_stats['min']:>12,} Max checks | {seq_stats['max']:>12,} | {pre_stats['max']:>12,} Coef. Variation| {cv_seq:>11.1f}% | {cv_pre:>11.1f}%
[Comparison Results] Sequential wins: {results['sequential']['wins']} ({seq_win_rate:.1%}) Prefix wins: {results['prefix']['wins']} ({pre_win_rate:.1%}) Ties: {results['ties']} Both failed: {results['both_failed']}
=== STATISTICAL ANALYSIS ===
[Confidence Intervals] Checks Sequential: {seq_stats['mean']:.1f} ({stats_analysis['seq_ci'][0]:.1f} - {stats_analysis['seq_ci'][1]:.1f}) Checks Prefix: {pre_stats['mean']:.1f} ({stats_analysis['pre_ci'][0]:.1f} - {stats_analysis['pre_ci'][1]:.1f})
[Statistical Tests] Welch's t-test: {'t = %.3f, p = %.4f' % (stats_analysis['t_test'].statistic, stats_analysis['t_test'].pvalue) if stats_analysis['t_test'] else 'N/A'} Mann-Whitney U: {'U = %.1f, p = %.4f' % (stats_analysis['mann_whitney'].statistic, stats_analysis['mann_whitney'].pvalue) if stats_analysis['mann_whitney'] else 'N/A'} Effect Size (Cohen's d): {stats_analysis['cohen_d']:.3f}
[Power Analysis] Statistical Power: {stats_analysis['power']:.1%} """)
if outcome_history: non_tie_outcomes = [o for o in outcome_history if o != "T"] streak_analysis = f""" === STREAK ANALYSIS === Longest Sequential streak: {longest_streak(outcome_history, 'S')} Longest Prefix streak: {longest_streak(outcome_history, 'P')} Expected max streak: {math.log(len(non_tie_outcomes), 2):.1f} (for {len(non_tie_outcomes)} trials) """ print(streak_analysis)
max_wins = max(results["sequential"]["wins"], results["prefix"]["wins"], results["ties"]) print("=== WIN DISTRIBUTION ===") print(ascii_bar("Sequential", results["sequential"]["wins"], max_wins)) print(ascii_bar("Prefix", results["prefix"]["wins"], max_wins)) print(ascii_bar("Ties", results["ties"], max_wins))
if __name__ == '__main__': compare_methods()
results=== FINAL ANALYSIS === Valid cases (both found target): 63761/100000
[Performance Metrics] | Sequential | Prefix ---------------+---------------------+-------------------- Checks (mean) | 49,583.6 ± 28,856.7 | 32,119.8 ± 19,013.3 Time (mean ms) | 118.70 ± 70.17 | 79.24 ± 47.81 Min checks | 1 | 1 Max checks | 99,997 | 84,519 Coef. Variation| 58.2% | 59.2%
[Comparison Results] Sequential wins: 0 (0.0%) Prefix wins: 59696 (93.6%) Ties: 4065 Both failed: 0
=== STATISTICAL ANALYSIS ===
[Confidence Intervals] Checks Sequential: 49583.6 (49359.6 - 49807.6) Checks Prefix: 32119.8 (31972.2 - 32267.4)
[Statistical Tests] Welch's t-test: t = 127.607, p = 0.0000 Mann-Whitney U: U = 2742363164.5, p = 0.0000 Effect Size (Cohen's d): 0.715
[Power Analysis] Statistical Power: 100.0%
=== STREAK ANALYSIS === Longest Sequential streak: 0 Longest Prefix streak: 148 Expected max streak: 15.9 (for 59696 trials)
=== WIN DISTRIBUTION === Sequential : (0) Prefix : ################################################## (59696) Ties : ### (4065) interpretation of the resultsThe analysis of 100,000 simulations is conclusive: Prefix is 35.3% more efficient than Sequential for each attempt. Prefix Search sacrifices reliability for speed. Loss Minimization: Most of the computation time in Sequential Search is wasted checking thousands of numbers in an incorrect block. Prefix Search avoids this by using a probability of 1 in 4,096 (for 3 characters) as a skip mechanism. Advantage Accumulation: By quickly skipping incorrect blocks, the method accumulates a massive savings in checks (approximately 17,500 per successful attempt). This maximizes the number of "lucky" attempts your hardware can make. Result: Total Dominance: The effort reduction is so significant that Prefix Search wins 93.6% of the time in a direct efficiency comparison. If you don't own a GPU farm, you have no other rational option. Sequential search is a failed brute-force strategy that exhausts your resources on useless ranges. Prefix search is an optimized luck strategy that gives you a 93.6% probability of making the most efficient use of your computation time. You must accept the risk (approximately 36% failure per partial attempt due to the "jump") in exchange for the possibility of success (approximately 64%) with minimal effort. This is the only way to tackle the vastness of the keyspace with limited resources. You sacrifice: 100% theoretical coverage (impossible to achieve anyway) You gain: 35% greater efficiency, 50% more attempts, 93% higher probability of success per resource invested.  In a search where time is the scarcest resource, sacrificing a theoretical guarantee for a practical advantage of 35% is not an option... it is an obligation. In short, prefixes influence probabilities by speeding up the search process, allowing for more attempts per unit of time. They don't change the probability of an individual attempt, but they do increase the overall probability of success by increasing the frequency of attempts. It's the rational strategy for those who rely on luck! This issue is resolved; if you want to discuss it, please start another thread.
|
|
|
|
|
kTimesG
|
 |
November 07, 2025, 08:58:42 AM |
|
Let's assume for a second this theory works. I'm not gonna bring up the countless arguments on how backward you're using some basic principles, so let's assume it works.
Now, let's implement it, but not in silly Python, but on a GPU, because you claim it is the rational choice.
It would take around 5 seconds for ANY coder on this forum to unfortunately have to tell you the sad truth:
Your code can not be parallelized, hence your entire "rational choice" essay is missing its point.
GPUs run the same code for multiple blocks of data, hence your entire "sequential vs prefix" chaotic comparison cannot even exist in that context, since:
1. There's no more sequential run of the same blocks in the same order. 2. There is no possibility to "break" / "return" in the middle of doing stuff.
I'm really not understanding why you continue with these ideas...
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 07, 2025, 01:48:19 PM |
|
Let's assume for a second this theory works. I'm not gonna bring up the countless arguments on how backward you're using some basic principles, so let's assume it works.
For this part, there is only one answer: Fallacy of ContemptI left the script for your verification; you don't need to assume anything. It's not a matter of 'assumption', it's applied probability mathematics. The Python script is a demonstration, not the final implementation. Judging the strategy by the demonstration language is like rejecting a physics equation because you wrote it on paper instead of a blackboard. The evidence in this context is compelling. Now, let's implement it, but not in silly Python, but on a GPU, because you claim it is the rational choice.
It would take around 5 seconds for ANY coder on this forum to unfortunately have to tell you the sad truth:
The same answer as before, this is a technical area, are you aware of this? Here, arguments are used to refute claims, not fallacies. Your code can not be parallelized, hence your entire "rational choice" essay is missing its point.
This is completely false. You're confusing the specific implementation of my Python script (which is sequential and didactic) with the underlying algorithm, which is highly parallelizable. The strategy is based on dividing the space into small independent blocks (e.g., N=4096) that maintain 16^L ≈ N. This is inherently parallelizable. GPUs run the same code for multiple blocks of data, hence your entire "sequential vs prefix" chaotic comparison cannot even exist in that context, since:
You're assuming that prefix search depends on sequential execution and early returns between blocks. That's not the case. Prefix strategy is about probability and mathematical efficiency, not sequential implementation. Dividing the total problem into multiple small, independent problems that maintain the relationship 16^L ≈ N completely resolves the doubt about GPU parallelization. - Multiple warps process different blocks simultaneously - Each thread within a warp checks individual keys - Prefix verification allows for thread-level early exit When programming, you think about solutions; the Python script is only to demonstrate the theory (which is completely correct). Any competent GPU programmer would understand that: -Kernels are designed for small, independent blocks. -The relationship 16^L ≈ N optimizes the use of warps. -Branch divergence is manageable when L is small. -Throughput determines efficiency, not sequential order.
|
|
|
|
|
kTimesG
|
 |
November 07, 2025, 10:31:17 PM |
|
Any competent GPU programmer would understand that:
-Kernels are designed for small, independent blocks.
-The relationship 16^L ≈ N optimizes the use of warps.
-Branch divergence is manageable when L is small.
-Throughput determines efficiency, not sequential order.
I don't believe you ever wrote a kernel, otherwise you'd know how wrong all of these statements are (except the last one). For EC, kernels are optimized for very large blocks, the larger the better. This increases throughput. The smaller the block = the worse the speed. Use of warps? I don't think you understand what warps are used for, and why they have no relevance to any of your theory. Warps are useful if you want to exchange data between threads, so I have zero clues why you even bring them up. Branch divergence? Your theory is based on the fact that "prefix probabilities" are better exactly because you break out of the loops, when compared to the exact sequential order of traversal. Good luck doing that in a kernel!!!!! You seem to not understand that for GPU, all the blocks run in parallel. Your comparison cannot even exist on a GPU because there is no "order of traversal" when you implement your code on a GPU. Throughput does indeed directly indicate efficiency, and this is exactly why a fast kernel runs huge amounts of data (not small blocks), and has zero divergences. But then again, I feel like I'm writing this up for nothing, since I'm well aware you can never change your opinions even when presented with hard facts...
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 08, 2025, 12:28:09 AM |
|
Any competent GPU programmer would understand that:
-Kernels are designed for small, independent blocks.
-The relationship 16^L ≈ N optimizes the use of warps.
-Branch divergence is manageable when L is small.
-Throughput determines efficiency, not sequential order.
I don't believe you ever wrote a kernel, otherwise you'd know how wrong all of these statements are (except the last one). For EC, kernels are optimized for very large blocks, the larger the better. This increases throughput. The smaller the block = the worse the speed. Use of warps? I don't think you understand what warps are used for, and why they have no relevance to any of your theory. Warps are useful if you want to exchange data between threads, so I have zero clues why you even bring them up. Branch divergence? Your theory is based on the fact that "prefix probabilities" are better exactly because you break out of the loops, when compared to the exact sequential order of traversal. Good luck doing that in a kernel!!!!! You seem to not understand that for GPU, all the blocks run in parallel. Your comparison cannot even exist on a GPU because there is no "order of traversal" when you implement your code on a GPU. Throughput does indeed directly indicate efficiency, and this is exactly why a fast kernel runs huge amounts of data (not small blocks), and has zero divergences. But then again, I feel like I'm writing this up for nothing, since I'm well aware you can never change your opinions even when presented with hard facts... Although your interpretation is valid, the same thing happens as with your other posts: it's generic content that doesn't apply to what we're discussing here (GET TO THE POINT!) because: 1- You're confusing CUDA 'thread blocks' with the 'search blocks' of my algorithm. 2- Warps are fundamental. 3- Divergence occurs when there's a match (1/4096 probability). In 99.98% of warps, there's zero divergence because no threads match. In the remaining 0.02%, one thread diverges, resulting in a minimal penalty. Basic statistics. 4- For example, if we use Feistel permutation, each thread block gets a unique random range. There's no 'sequentiality' to break; there's uniform probabilistic coverage. I think that makes it pretty clear.
|
|
|
|
|
kTimesG
|
 |
November 08, 2025, 08:12:28 AM Last edit: November 08, 2025, 08:24:17 AM by kTimesG |
|
Although your interpretation is valid, the same thing happens as with your other posts: it's generic content that doesn't apply to what we're discussing here (GET TO THE POINT!) because:
1- You're confusing CUDA 'thread blocks' with the 'search blocks' of my algorithm.
2- Warps are fundamental. 3- Divergence occurs when there's a match (1/4096 probability). In 99.98% of warps, there's zero divergence because no threads match. In the remaining 0.02%, one thread diverges, resulting in a minimal penalty. Basic statistics.
4- For example, if we use Feistel permutation, each thread block gets a unique random range. There's no 'sequentiality' to break; there's uniform probabilistic coverage.
I think that makes it pretty clear.
Yeah, it makes it clear that you have no idea what I was talking about, and that you don't have the slightest clue on what a kernel is, or how CUDA "threads" operate. I'll give you a hint: definitely NOT like a supercharged CPU. It's a different paradigm, which clearly you wont bother to even investigate as a principle, you'll just stick to your continued non-sense. ChatGPT will not save you when having actual serious discussion with real people who actually solve real problems, you know. This is NOT something specific to CUDA. I am saying it clearly: you cannot parallelize, in principle, something that DEPENDS on a sequential mode of operation. This includes the entire algorithm itself, irrelevant of block sizes, number of threads, or other practical things. Your entire breakthrough has no meaning once you remove the "sequential in same order" stupid limitation (which we discussed a billion times why it should not be part of the comparison itself). Why? Because I just explained on why you cannot parallelize something that contains the word "sequential". So, once you do your comparison and randomize the order, anyone can quickly see how there is ZERO benefits to the prefix version, and only the management overhead of running it. Which makes it futile to use, since the "benefits" do not exist any more (not that they ever existed, but that's another discussion). Please don't make me bring up the Scooby Doo algorithms that prove these facts...
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 08, 2025, 02:26:33 PM |
|
snip
Regarding your "you can't parallelize something sequential":You're making the logical error of confusing implementation with algorithm. The concept of prefixes is probabilistic, not sequential. The ' sequentiality' in my Python demonstration was pedagogical, not fundamental. Regarding your technical objection:You say ' you can't parallelize' but you don't show a single line of code, a mathematical proof, or a benchmark. You just repeat GPU dogmas as if they were immutable physical laws. Regarding your debate arguments:Your argument boils down to: ' Since your demonstration used sequentiality, the concept is inherently sequential.' That's like saying you can't parallelize a binary search because the initial explanation uses a sorted array. Refutation:1. Feistel + Prefixes = Natural Parallelization: Each thread processes a unique range and checks prefixes independently. 2. Zero Dependencies: There is no communication between threads, no shared state. 3. Early Exit at the Thread Level: Each thread can terminate after verifying its key. Instead of being envious of my ideas, I invite you to answer:- What technical impossibility do you see in launching 10,000 threads, each verifying a different range?- Why is it statistically not advantageous to perform 4,096 quick checks (using the relationship 16^L ≈ N) versus 4,096 full checks?Until you answer these specific technical questions, you are just repeating unsubstantiated mantras. The mathematical principles remain; your understanding of parallelization needs to delve deeper than typical GPU use cases.
Seriously, I can't believe you're going to refute my arguments in this thread by going down technical lines that, if you look at them objectively, are 100% reasonable and applicable. It's not about the implementation; once you have the concept, a good developer knows how to handle it. I'm just throwing the idea out there (by the way, it's my original idea, like the binary database; this isn't an AI response, in case you deny my intelligence). Keep your derogatory nonsense out of the technical forum. This isn't the Bitcoin Discussion area. Here, in case you don't know the rules, you can't attack with fallacies and generalizations. An idea that is, in principle, 100% correct, let go of my arm. My probabilistic proof remains unrefuted. You've moved from discussing mathematics to discussing GPUs, which confirms that you have no objections to the central concept.
The principle 16^L ≈ N holds true regardless of whether it's executed on a CPU, GPU, or paper and pencil. Until you refute the mathematics, the conceptual debate is closed.
|
|
|
|
|
kTimesG
|
 |
November 08, 2025, 04:19:53 PM Last edit: November 08, 2025, 05:00:12 PM by kTimesG |
|
LMFAO... So, first, you accepted that when doing exhaustive search, there is no advantage to any of the methods. Right? And this thread is your attempt to claim that, when not doing an exhaustive search, there might be some whatever advantage to doing prefix early exits. Right? Then you blabber on how technicals don't matter, since it's all conceptual, right? Well, technically speaking, you have a technical algorithm to do some technical work. Otherwise, I might as well come up with a cosmological neural metaphysics algorithm to solve some classical NP problems, and simply throw a "if you can't implement it, that's not my problem, it's your problem". This is the kinda level you bring the discussion to. I'm basically drawing you on why conceptually you can't apply a sequential algorithm ("a loop that breaks and exits" IS an sequential algorithm) to practical reality in the parallel realm (neither in theory nor in practice), and you refuse to accept that the practical reality (that, e.g., GPUs don't work even remotely close to how you think they do) is the way it is. That being said, it's not really my problem at all to open your eyes. But since we're not in the garbage thread here, you might have some hard time convincing anyone that I'm wrong with whatever I said so far. You say 'you can't parallelize' but you don't show a single line of code, a mathematical proof, or a benchmark. You just repeat GPU dogmas as if they were immutable physical laws.
No need to proof something that's obvious by definition. Code for what? It is impossible to parallelize a sequential code, so it is impossible for such code to exist. You're asking for something that cannot exist. 1. Feistel + Prefixes = Natural Parallelization: Each thread processes a unique range and checks prefixes independently.
2. Zero Dependencies: There is no communication between threads, no shared state.
3. Early Exit at the Thread Level: Each thread can terminate after verifying its key.
Instead of being envious of my ideas, I invite you to answer:
-What technical impossibility do you see in launching 10,000 threads, each verifying a different range?
-Why is it statistically not advantageous to perform 4,096 quick checks (using the relationship 16^L ≈ N) versus 4,096 full checks?
There is no technical impossibility to launch a billion threads if you want. However, you have to wait for all of them to finish, which is equivalent to having them do the same amount of work each, or simply having a single one do some work, while the rest waste cycles doing nothin' but waste cycles doing nothing, because they have nothing to do. This might be the central piece you're missing: all threads do the same job all the time. "Breaks" and "exits" and divergence simply means that all the threads do the exact same thing, and if they can't do anything at some time, its called "wasted cycles" because, you know, they could have been put to good use, by, for example, doing something. Like, anything except having to wait for the other 99.99% of the threads to finish. So you statistical non-sense that 0.03% divergence or whatever has no effect, is in reality, an execution armaggeddon: Because there is no concept of "breaking" or "returning from the thread". All threads finish at once before you can start doing anything else, like continuing the conceptual "sequential" algorithm. But maybe after you actually try to implement your "concept" and quickly being bite by the fact that you cannot actually implement it, because, well, the damn technicals don't allow you to, you'd understand why the technicals do not allow you to - it's because the conceptuals do not allow you to.
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 08, 2025, 05:05:14 PM |
|
snip
This will be my last response to you. If you remain trapped in this cycle of splitting hairs, any message that doesn't get to the point or lacks technical validity will be ignored: 1. My answer to your silly question about "exhaustive vs. non-exhaustive search": No, my point is exactly the opposite. In a non-exhaustive search (the only viable one with limited resources), the prefix strategy offers a statistical advantage. Your false dichotomy reveals that you didn't understand the fundamental concept, even though I clarified at the beginning of the thread that this is only valid for "those who try their luck," that is, the majority with limited resources. 2. You're back with the endless loop of mentioning "sequential algorithm", which I've refuted in all my previous responses:You're making the same mistake for the third time: you're confusing the proof with the concept. 'Early exit' doesn't require sequentiality; it's a Boolean condition independent of each thread. 3. Regarding your thoughts on the "practical reality of GPUs"You say that 'GPUs don't work the way you think,' but: -Where is your evidence that memcmp() cannot be parallelized? -Where is your benchmark showing that checking prefixes is slower? -Where is your proof that the relationship 16^L ≈ N is mathematically incorrect? So far, you have only presented dogma, not data. 4. Why is your rebuttal illogical here?: Your objection boils down to: ' Since I explained the concept with a sequential loop in Python, the concept is inherently sequential.' That's like saying multiplication is inherently sequential because you learned it from tables. Answer this directly: -Why is it statistically inefficient to perform N quick checks versus N full checks, when N ≈ 16^L? If you can't answer this mathematically, I'll acknowledge that you're avoiding the substantive debate.
|
|
|
|
|
kTimesG
|
 |
November 09, 2025, 08:17:05 AM |
|
I knew it was a very bad idea to get involved, it's getting worse just as I imagined. Better idea is to to stop getting involved  Your main issue is that your crackheads fan base is in the trash-piling main thread, not on the dev board. Here, we are talking about serious things. Otherwise, no one has time to deal with your total ignorance on so, so, many layers. It's come to the point where I don't even think you actually pass your eye balls over all the words people write (like maybe not seeing the "not doing" before of "exhaustive", instead of getting it in the opposite way that a normal reader would get it). Oh well. Good luck and health. Also, memcmp does not fucking exist on GPUs, just like the conceptual multi-threading loop-escaping return-based concurrent logic you're obsessing over does not exist in a parallel context. What kind of benchmark of things that don't exist, done on fictional hardware that only exists in your conceptual fantasies, do you want? Do your own instead of asking extremely stupid questions on and forth. We are not your teachers.
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 09, 2025, 10:35:51 AM |
|
I knew it was a very bad idea to get involved, it's getting worse just as I imagined. Better idea is to to stop getting involved  Your main issue is that your crackheads fan base is in the trash-piling main thread, not on the dev board. Here, we are talking about serious things. Otherwise, no one has time to deal with your total ignorance on so, so, many layers. It's come to the point where I don't even think you actually pass your eye balls over all the words people write (like maybe not seeing the "not doing" before of "exhaustive", instead of getting it in the opposite way that a normal reader would get it). Oh well. Good luck and health. Also, memcmp does not fucking exist on GPUs, just like the conceptual multi-threading loop-escaping return-based concurrent logic you're obsessing over does not exist in a parallel context. What kind of benchmark of things that don't exist, done on fictional hardware that only exists in your conceptual fantasies, do you want? Do your own instead of asking extremely stupid questions on and forth. We are not your teachers.You've crossed the line from technical debate to personal attack. Memcmp does exist in CUDA (__device__ int memcmp()), and your denial of verifiable facts demonstrates technical bad faith. This debate ended when you chose insults over argument. You spout nothing but technical nonsense, ask utterly stupid questions, and 90% of your posts are intended to be contemptuous. In short, your personal attacks against me continue. Even though I asked you in the past not to interfere with my posts, that's another verifiable fact. This says more about you than about me. Have a nice day!
|
|
|
|
|
kTimesG
|
 |
November 09, 2025, 09:49:59 PM |
|
It's impossible to have a "technical debate" when someone asks something ridiculous like parallelizing memcmp (which is a function whose result solely relies on the first different bit, not whether some random whatever bit is different) and is curious why prefix matching isn't faster when we only care about the prefix (when in fact, the full hash is computed anyway by that point, which is 99.999999999% of the work). Never mind that the entire block (of data, not of threads) was most likely batch inverted anyway. The cherry on the cake is: let's skip the rest of the execution cycles and idle the thread in which the prefix matches, because it's useless to do more computing, even though it would be exactly the same thing whether we finish the entire block or not (again: idle threads = wasted cycles, not faster speed!)
And yeah, there's no memcmp on GPUs. The function you've discovered is simply a wrapper code in a helper library, implementing a C++ standard header: it runs a simple while loop. But nvcc boils it down to stack-based SASS instructions that read data from the two sources state spaces (global, constant, or shared) and diverges when the difference is found; besides requiring predicates for exiting the loop. So - there is no hardware acceleration to do memory comparisons, just a very slow emulation. Good luck parallelizing something as trivial as 3 lines of C that returns depending on the first different byte, or whatever it was you wanted to do. Any 1st year CS student will tell you it's faster to do it linearly, and likely a nightmare to parallelize (and while surely possible, it's an absurd thing to do given the synchronization overhead required).
You are confusing classical computing architectures (CPU, RAM, concurrency) with SIMT concepts, and regular programming with HPC paradigms.
I gave you the benefit of the doubt by pretending that "let's assume that the theory holds". It is irrelevant what I care about the theory itself. if you can't keep up with the actual tech issues, stop circling around the concept's correctness, which is not relevant at all ever since we were under the assumption we got over that.
Feels like I'm talking against a wall for some time now, so byez.
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 09, 2025, 10:09:22 PM |
|
Snip...
It's simple: your inability to implement my proposal doesn't invalidate its capacity or validity. I'm not going to get bogged down in technicalities with you any longer because you're acting from a blind, imprecise, and arrogant perspective. You firmly believe that since your brain isn't capable of implementing it, you assume it's impossible. Therefore, it's absurd for me to continue debating with someone who thinks they have the absolute truth about everything. Anyone who reads this with awareness will know that the theory is correct, and once they understand it, they'll know how to implement it. And I'll leave you with this phrase: "If you can imagine it, you can program it." But I bet you won't let the matter drop here because you don't accept genuine ideas, and that's sad because you could use your knowledge, which I admit you possess, on something productive. God bless you; may He watch over your soul. To be like this, your life surely hasn't been easy.
|
|
|
|
|
kTimesG
|
 |
November 10, 2025, 01:44:50 PM |
|
It's simple: your inability to implement my proposal doesn't invalidate its capacity or validity
Here, Let Me Parallelize Your Proposal For You. def sequential_search(dataset, block_size, target_hash, block_order): # Parallel version of Sequential Search checks = 0 # TOTAL checks found = False # Global flag: target found! found_idx = None # Found index
# Launch all the blocks in parallel for block_idx in block_order: # This is a single data block (runs in parallel) start = block_idx * block_size end = min(start + block_size, len(dataset))
for i in range(start, end): checks += 1 if generate_h160(dataset[i]) == target_hash: # Solution found!!!! found = True found_idx = i break # Thread finished
# Parallel run has finished; gather final results return {"checks": checks, "found": found, "index": found_idx}
def prefix_search(dataset, block_size, prefix_len, target_hash, block_order): # Parallel version of Prefix Search prefix = target_hash[:prefix_len] checks = 0 # TOTAL checks found = False # Global flag: target found! found_idx = None # Found index
# Launch all the blocks in parallel for block_idx in block_order: # This is a single data block (runs in parallel) start = block_idx * block_size end = min(start + block_size, len(dataset)) found_prefix = False
for i in range(start, end): checks += 1 current_hash = generate_h160(dataset[i])
if current_hash == target_hash: # Solution found!!!! found = True found_idx = i break # Thread finished
if not found_prefix and current_hash.startswith(prefix): # PREFIX found!!! found_prefix = True break # Thread finished
return {"checks": checks, "found": found, "index": found_idx}
RESULTS === Configuration === Total numbers: 100,000 Block size: 4,096 Total blocks needed: 25 Prefix: 3 characters (16^3 = 4,096 combinations) Simulations: 1000 secp256k1 order: 115792089237316195423570985008687907852837564279074904382605163141518161494337
=== FINAL ANALYSIS === Valid cases (both found target): 638/1000
[Performance Metrics] | Sequential | Prefix ---------------+---------------------+-------------------- Checks (mean) | 97,661.8 ± 1,167.2 | 62,401.0 ± 7,407.6 Time (mean ms) | 104.34 ± 9.82 | 70.42 ± 8.82 Min checks | 95,908 | 40,816 Max checks | 99,985 | 84,018 Coef. Variation| 1.2% | 11.9%
[Comparison Results] Sequential wins: 0 (0.0%) Prefix wins: 638 (100.0%) Ties: 0 Both failed: 0
=== STATISTICAL ANALYSIS ===
[Confidence Intervals] Checks Sequential: 97661.8 (97571.0 - 97752.5) Checks Prefix: 62401.0 (61825.1 - 62976.9)
[Statistical Tests] Welch's t-test: t = 118.767, p = 0.0000 Mann-Whitney U: U = 407044.0, p = 0.0000 Effect Size (Cohen's d): 6.650
[Power Analysis] Statistical Power: 100.0%
=== STREAK ANALYSIS === Longest Sequential streak: 0 Longest Prefix streak: 638 Expected max streak: 9.3 (for 638 trials)
=== WIN DISTRIBUTION === Sequential : (0) Prefix : ################################################## (638) Ties : (0)
So, 63% success rate, just as you predicted. However: 63% of the range was scanned. It doesn't take a degree in nuclear physics to understand what that means. This is like saying: if I scan 0.1% of the range, and I force 0.1% success, then this is much better than scanning 100% of the range when I want 100% of success. Mind blowing all the way !!!! Here's the Scooby Doo upgrade to your algorithm (no prefix check required!): Simply swap current_hash.startswith(prefix)
with 0 == random.randint(0, 4096)
or i % 4096 == random.randint(0, 4096)
Oh, wow, the EXACT SAME RESULTS and NO PREFIX CHECK REQUIRED. G E N I U S ! ! ! You are hurting anyone's intelligence and common sense with your continued dementia regarding prefixes.
You wasted enough of my time this time around. See you in 3 months when you bring back the same topic again the 7th time, with the same script, and with the same absurdities and attitude.
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 10, 2025, 04:33:47 PM |
|
snip...
LOL, my prefix algorithm is based on a discard logic using real (not random) data. The advantage of my algorithm is that the probability of a correct guess (the prefix) is used as an efficient cryptographic filter (not fantasy like you're suggesting). You're trying to replace a data-based cryptographic filter with blind, random discard. WOW, your math is brilliant! That's obviously a sham test, since the relationship N ≈ 16^L is an unbeatable probabilistic detection mechanism. You're simply simulating the discard effect without performing the cryptographic check that justifies the discard, which automatically puts my detection system ahead. Haha, GENIUS. Calm down, bro. The more you look for the "but," the deeper you sink. Confusing a data-driven cryptographic filter with a blind randomizer demonstrates a fundamental misunderstanding. My algorithm detects real patterns in the key space; yours just rolls dice. It's the difference between searching for a needle in a haystack with a magnet (my method) versus closing your eyes and grabbing a random straw (your 'improvement').
|
|
|
|
|
kTimesG
|
 |
November 16, 2025, 09:30:19 AM |
|
LOL, my prefix algorithm is based on a discard logic using real (not random) data. The advantage of my algorithm is that the probability of a correct guess (the prefix) is used as an efficient cryptographic filter (not fantasy like you're suggesting).
Then why are you providing a demonstration that does not do what you just said? It means you are deriving all of those dozens of results from bad data, does it not? You're trying to replace a data-based cryptographic filter with blind, random discard. WOW, your math is brilliant! That's obviously a sham test, since the relationship N ≈ 16^L is an unbeatable probabilistic detection mechanism. You're simply simulating the discard effect without performing the cryptographic check that justifies the discard, which automatically puts my detection system ahead. Haha, GENIUS.
The results are identical. The results are based off on whatever results you initially wanted, or had, or predicted, or whatever. The results are the same results that you are basing everything also upon. So, why are the results a sham, but your initial results (identical results, finding identical things and solving the same identical problem) not a sham? Confusing a data-driven cryptographic filter with a blind randomizer demonstrates a fundamental misunderstanding. My algorithm detects real patterns in the key space; yours just rolls dice. It's the difference between searching for a needle in a haystack with a magnet (my method) versus closing your eyes and grabbing a random straw (your 'improvement').
Well then, present the demonstration that does what you are saying. Do not expect somebody random to simply test out the replacement of your target match from a hash of some string with a hash of some EC point just to prove something you failed to prove. Don't forget to test it against the Scooby Doo methodology (discarding randomly instead of checking whatever criteria) before you push the same script ahead for the 1836th time as a new topic!
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 17, 2025, 03:28:15 PM |
|
snip...
The theory behind 16^L ≈ N remains sound. You claim the results are identical, but you ignore the fundamental difference: 1- My prefixes: Based on actual cryptographic properties 2- Your randomness: Based on blind statistical noise Your 'discard random' method is a straw man: you create a weakened version of my idea and then declare victory when it doesn't work. Implement a system that uses the actual distribution of prefixes in the Bitcoin keyspace to dynamically optimize the search. Prefixes can do this; your randomness cannot. It's like saying that a doctor who diagnoses with blood tests is the same as a faith healer who guesses with dice. Both can 'get it right,' but one uses science and the other superstition. You want to invalidate the theory by attacking a basic proof. Is it so difficult to accept that the point is that the 16^L ≈ N theory works and that's the purpose of the post, or to refute it mathematically, not by juggling deviations to CUDA or biased implementations of your own?"
|
|
|
|
|
kTimesG
|
 |
November 17, 2025, 08:52:39 PM |
|
The theory behind 16^L ≈ N remains sound. You claim the results are identical, but you ignore the fundamental difference:
1- My prefixes: Based on actual cryptographic properties
2- Your randomness: Based on blind statistical noise
Are you blind? I am not claiming the results are identical. The results ARE identical, did you ever bother to actually check for yourself? #1 and #2 above are equivalent, because the cryptographic properties are exactly what ensures the blind statistical noise. That's why they were engineered, by design, to have no pattern. This is why these two lines of code do exactly the same thing: # Chance of success: 1 in 4096 # (a hash is a uniform variable) # The prefix does not matter, it can be whatever 3 bytes of choice current_hash.startswith(prefix)
# Chance of success: 1 in 4096 # A random variable is chosen uniformly; we can choose whatever 3 byte value 0 == random.randint(0, 4095)
So your magic magnet has exactly the same ratio of success as rolling the dice has. By nature. Because hashes are uniform, and you're basically trying for the billionth time to showcase some system where you want to convince idiots that there is even the slightest 0.00000000000000000000000001% bias in their uniformity. There isn't any. Run the Scooby Doo version. Results are identical. Results are the same. Let me repeat: you get the same results, for the same problem, without having to check prefixes. Or you can check whatever other prefix you want - the results are identical for any prefix you ever choose, or for whatever value you ever choose to pick, which has the probability of occurrence 1 in 4096. It doesn't even need to be part of the hash at all - the results are the same, because, well, this is how math works maybe? This should tell you something about a few things, but I'm really knocking on a closed door here (if not a totally barricaded door).
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|
mcdouglasx (OP)
|
 |
November 17, 2025, 09:16:32 PM |
|
snip
Wow, you're making a beginner's mistake in cryptography, confusing statistical uniformity with a lack of information. Yes, hashes are uniform, but when you're searching for a specific target, its prefix contains information correlated with the search. You say ' hashes are uniform' as if this invalidates the prefixes. But it's precisely uniformity that makes 16^L ≈ N work perfectly. Uniformity guarantees that the probability of a prefix match is exactly 1/16^L, not that the prefixes are 'useless' as you mistakenly want to suggest due to your personal envy of my idea. Until you understand the difference between correlation and randomness, any technical discussion is pointless.
|
|
|
|
|
kTimesG
|
 |
November 17, 2025, 09:31:17 PM |
|
Until you understand the difference between correlation and randomness, any technical discussion is pointless.
Oh wow. Did you make a script that automatically replies with replacing everything that you don't actually read with "~snip~" and then add some blabber on how everyone's so stupid and ignorant on your glorious discoveries on cryptographic hashes actually being uniform (and hence, basically equivalent to a random number generator)? Maybe try running the Scooby Doo version. I'm sure you can get your hands on a non-rigged Python to be sure the results ain't a sham. I'll check back in a week or so again, not sure what your excuse is anyway to never bother running it, instead of continuing with the metaphorical crap that nobody cares about anyway.
|
Off the grid, training pigeons to broadcast signed messages.
|
|
|
|