-

@ 7c73b32d:3edf3a4b
2025-02-23 01:23:12
here is the updated code with average plotting.
//
import hashlib
import matplotlib.pyplot as plt
import plotly.graph_objects as go
#CHECK_INTERVAL = 10000
def sha256_binary(input_bytes):
sha256_hash = hashlib.sha256()
sha256_hash.update(input_bytes)
return sha256_hash.digest()
def calculate_bit_change_probability(results, curr_result):
num_bits = len(curr_result) * 8
bit_change_count = [0] * num_bits
for result in results:
int_list1 = list(result)
int_list2 = list(curr_result)
xor_int_list = [a ^ b for a, b in zip(int_list1, int_list2)]
xor_bytes = bytes(xor_int_list)
xor_result = int.from_bytes(xor_bytes, byteorder='big')
for i in range(num_bits):
if (xor_result >> i) & 1:
bit_change_count[i] += 1
total_comparisons = len(results)
probabilities = [count / total_comparisons for count in bit_change_count]
return probabilities
def main():
results = []
probability_data = []
probability_sums = [0] * 256
probability_count = 0
i = 0
imin = 200000
for j in range(imin+20):
i += 1
input_bytes = i.to_bytes((i.bit_length() + 7) // 8, byteorder='big')
hash_result = sha256_binary(input_bytes)
#if (i + 1) % CHECK_INTERVAL == 0:
if i >= imin and len(results) > 0:
probabilities = calculate_bit_change_probability(results, hash_result)
probability_data.append(probabilities)
for idx, p in enumerate(probabilities):
probability_sums[idx] += p
probability_count += 1
print(i)
results.append(hash_result)
print("len", len(probability_data))
'''
for idx, sublist in enumerate(probability_data):
for i, value in enumerate(sublist):
plt.plot(idx, value, linestyle="", marker='.', markersize=5)
plt.text(idx+(i % 2 == 0 and -0.1 or 0.05), value, str(i), fontsize=2)
plt.title(f'Bit Change Probabilities (iteration {imin}-)')
plt.xlabel('iteration')
plt.ylabel('Probability')
plt.savefig('plot.png', dpi=600)
'''
for idx, value in enumerate(probability_sums):
avgval = value / probability_count
plt.plot(idx, avgval, linestyle="", marker='.', markersize=5)
plt.text(idx, avgval, str(idx), fontsize=2)
#plt.plot(probability_data, linestyle="", marker = '.', markersize=10)
plt.title(f'Bit Change Averages (iteration {imin} + {probability_count})')
plt.xlabel('bit index')
plt.ylabel('Probability')
plt.savefig('plot-avg.png', dpi=600)
#plt.show()
main()