приблизительная оценка всех чисел
, как предложил Ален Мериго, вы просто подсчитываете количество цифр от первого изменения (от MSB до LSB):
00251eb27d8d2deb15d615edd08dd7cf402638697a4aba6c7c199ce4ef858962h
002526837f828960f7d3c1e8359eaea84e38183c7ab9345a663b474063ca9e20h
|<---------------------60 digitis------------------------->|
, что дает нам 16^60
возможностей. Если вы хотите десятичные дроби, то преобразование выполняется следующим образом:
dec_digits/hex_digits = log(16)/log(10) = 1.204119982655924780854955578898
dec_digits = hex_digits * 1.204119982655924780854955578898
dec_digits = 60 * 1.204119982655924780854955578898 = ~72.25
, поскольку соотношение между целыми числами любой базы постоянно, что приводит к возможностям 10^72.25
.
все числа точно
просто вычтите 2 числа, чтобы результат был не отрицательным (это выполнимо для строк с одиночным циклом for, если у вас нет bigints)
-00251eb27d8d2deb15d615edd08dd7cf402638697a4aba6c7c199ce4ef858962h
+002526837f828960f7d3c1e8359eaea84e38183c7ab9345a663b474063ca9e20h
------------------------------------------------------------------
000007D101F55B75E1FDABFA6510D6D90E11DFD3006E79EDEA21AA5B744514BEh
если я преобразую его в dec с использованием этого str_hex2dec результат будет:
53947059527385558921671339033187394318456441692296348428515181989270718 = 5.39*10^70
вместо этого мы можем сделать приблизительную оценку по гексам:
000007D101F55B75E1FDABFA6510D6D90E11DFD3006E79EDEA21AA5B744514BEh
||<----------------------58 hex digits------------------->|
|
7h -> 0111b -> 3 bits
таким образом, мы получили 59 шестнадцатеричных цифр, каждая шестнадцатеричная цифра составляет 4 двоичных бита, кроме первого, который состоит из 3 битов, что дает нам приблизительную оценку (но гораздо более точную, чем тогда в # 1):
3 + 58*4 = 235 bits -> 2^235 numbers
снова преобразуется в десятичные:
235 * log(2)/log(10) = 70.74
ведет к оценке:
10^70.74 = 10^0.74 * 10^70 = 5.4954*10^70
, что довольно близко к реальной сделке выше.
ограничение на повторяющиеся цифры
этот сложный. Нам нужно вычесть количество всех возможных чисел с повторением цифр. Это вероятностная математика (не моя сильная сюита), но вы можете подойти к ней так:
Например, мы получили 58 шестнадцатеричных цифр. Итак, сколько последовательных n=4
цифр, таких как 7777
, мы можем иметь там? Если мы поместим 7777
от начала до конца, то это будет digits-n = 58+1-4
возможных мест ...
Для каждого местоположения результирующие цифры могут иметь «любую» комбинацию, поэтому возможности будут умножаться на неиспользованные цифры:
(digits+1-n)*16^(digits-n)
теперь n = <4 , digits>
, поэтому возможности объединились:
(digits+1-4)*16^(digits+1-4) + (digits+1-5)*16^(digits-5) + (digits+1-6)*16^(digits-6) ... + 1
(digits-3)*16^(digits-4) + (digits-4)*16^(digits-5) + (digits-5)*16^(digits-6) ... + 1
Теперь повторяющаяся цифра может быть любой от 0..F
, поэтому весь материал умножается также на 16 ...
(digits-3)*16^(digits-3) + (digits-4)*16^(digits-4) + (digits-5)*16^(digits-5) ... + 16
снова это приблизительная оценка, не учитывающая крайние случаи и дублирование (вы знаете, если есть 2 или более повторений, они учитываются больше раз, чем один раз, также соседние цифры повторяющейся последовательности не могут иметь одно и то же значение и т. д. ... учет всех случаев точно приведет к безумным уравнениям, которые не будут сильно отличаться от грубой оценки), поэтому полученная грубая оценка будет:
16^digits - sum[i=1,2,3,...,digits-3]( i*16^i )
Теперь создание будет «простым», вы просто реализуете приращение шестнадцатеричного значения в строке и проверяете на достоверность (повторы):
Однако результирующие данные будут огромными, и для этого тоже потребуются вычислительные мощности ... так что вы, скорее всего, покраситесь в старость до того, как закончите, не говоря уже о том, чтобы заполнить хранилище задолго до этого ...