From b2edfc7edd5a98062a48a70e961620c3b3f1f580 Mon Sep 17 00:00:00 2001 From: Benjamin_Loison Date: Tue, 2 May 2023 18:24:41 +0200 Subject: [PATCH] Current incorrect `statisticsFromHashes.py` version due to legends --- statisticsFromHashes.py | 60 ++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/statisticsFromHashes.py b/statisticsFromHashes.py index 49e45c9..c1d5780 100644 --- a/statisticsFromHashes.py +++ b/statisticsFromHashes.py @@ -1,19 +1,14 @@ -import os, matplotlib.pyplot as plt +import os, math, matplotlib.pyplot as plt path = '/home/benjamin/Desktop/bens_folder/school/m2/internship/work/romaric/me/' os.chdir(path) -def getBinaryHash(hexHash): - binaryHash = "{0:b}".format(int(hexHash, 16)) - binaryHash = (256 - len(binaryHash)) * '0' + binaryHash - return binaryHash +def getDifficultyOfHash(hexHash): + return int(hexHash, 16) -def getNumberOfLeadingBinaryZerosOfHash(hexHash): - binaryHash = getBinaryHash(hexHash) - return len(binaryHash) - len(binaryHash.lstrip('0')) - -additionalZeros = {} +difficultyRatios = {} +X, Y = [], [] with open('hashes.txt') as f: lines = f.read().splitlines() @@ -21,21 +16,42 @@ with open('hashes.txt') as f: lineParts = line.split() hash = lineParts[0] target = lineParts[1] - leadingBinaryZerosHash = getNumberOfLeadingBinaryZerosOfHash(hash) - leadingBinaryZerosTarget = getNumberOfLeadingBinaryZerosOfHash(target) - #print(leadingBinaryZerosHash, leadingBinaryZerosTarget) - additionalZero = leadingBinaryZerosHash - leadingBinaryZerosTarget - if additionalZero in additionalZeros: - additionalZeros[additionalZero] += 1 + hashDifficulty = getDifficultyOfHash(hash) + targetDifficulty = getDifficultyOfHash(target) + #difficultyRatio = targetDifficulty // hashDifficulty + difficultyRatio = int(math.log2(targetDifficulty / hashDifficulty)) + if difficultyRatio in difficultyRatios: + difficultyRatios[difficultyRatio] += 1 else: - additionalZeros[additionalZero] = 1 + difficultyRatios[difficultyRatio] = 1 -X, Y = [], [] - -for i in range(max(additionalZeros) + 1): - if i in additionalZeros: +for i in range(max(difficultyRatios) + 1): + if i in difficultyRatios: X += [i] - Y += [additionalZeros[i] / len(lines)] + Y += [difficultyRatios[i] / len(lines)] + +## To improve the readability: + +#plt.semilogx(X, Y, base = 2) +XMain = [2 ** i for i in range(math.ceil(math.log2(X[-1])))] +XP = [0] + XMain + ([X[-1]] if not X[-1] in XMain else []) +YP = [difficultyRatios[difficultyRatio] / len(lines) for difficultyRatio in XP] + +plt.scatter(XP, YP) + +plt.xticks(XP, XP) + +upperBound = math.ceil(math.log2(X[-1])) + 2 +YP = [2 ** -i for i in range(upperBound)] + +plt.yticks(YP, YP) + +for x, y in zip(X, Y): + if x == 0 or math.log2(x) == int(math.log2(x)): + plt.text(x, y, f'({x}, {round(y, 4)})', ha='center', va='top') + +## plt.plot(X, Y) + plt.show()