Advertisement
Guest User

bdz rev 1.0

a guest
Apr 1st, 2015
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.08 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import math
  3. import sympy
  4. import numpy
  5. import itertools
  6.  
  7.  
  8. def Frequency_Monobits_Test (data):
  9.     amount=0
  10.     count=0
  11.     if data == 0:
  12.         amount=count=1
  13.     while data != 0:
  14.         a = data & 1
  15.         if a == 0:
  16.             a = -1
  17.         data = data >> 1
  18.         count+=1
  19.         amount += a
  20.    
  21.     static = abs(amount)/math.sqrt(count)/math.sqrt(2)
  22.    
  23.     #erfc = (2/math.sqrt(math.pi))*(sympy.integrate(sympy.exp(-sympy.Symbol('x')**2),(sympy.Symbol('x'),static,sympy.Symbol('oo'))))
  24.     return math.erfc(static)
  25.  
  26. def Compare(value):
  27.     p = 0.01
  28.     if  value < p:
  29.         print 'Ю񫥤򥫼򼠭塿㬿泱��󷠩.'
  30.     elif value == 0xff :
  31.         print 'ӥ񲠭塬痢򠡻򼠢󯮫.'
  32.     else:
  33.         print 'ñ塎ʮ'  
  34.  
  35.  
  36.  
  37. def Frequency_Block_Test (data, data_len):
  38.     blocks = []
  39.     s = []
  40.     mult = 1
  41.     x = 0
  42.     while data_len != 0:
  43.         if data_len < 3:
  44.             data <<= (3 - data_len)
  45.             data_len = 3
  46.            
  47.         blocks.append(data >> (data_len - 3))
  48.         data_len -= 3
  49.         if data_len==1 and (data==0 or data==1):
  50.             mult=1
  51.         else:
  52.             while x < data_len-1:
  53.                 mult = mult << 1
  54.                 mult += 1
  55.                 x += 1
  56.             data = data & mult
  57.             x,mult=0,1
  58.     if blocks[len(blocks) - 1] == 0:
  59.         del blocks[len(blocks) - 1]
  60.    
  61.    
  62.     for item in blocks:
  63.         s.append ((float(((item&0b1)+((item&0b10)>>0b1)+((item&0b100)>>0b10)))/3-0.5)**2)
  64.     #print 12*(sum (s))
  65.     #print math.gamma(float(len(blocks))/2)
  66.     return sympy.uppergamma(float(len(blocks))/2,(sum (s))*6)
  67. def Same_In_Row_Test(data, data_len):
  68.         temp_data = data
  69.         count_1 = 0
  70.         arg = 0
  71.         p = 0
  72.         v = 0
  73.        
  74.         while (data != 0):
  75.                 if data % 2 == 1:
  76.                         count_1 += 1
  77.                 data /= 2
  78.        
  79.         p = float(count_1) / data_len
  80.        
  81.         if abs(p - 0.5) < 2 / math.sqrt(data_len):
  82.                 while temp_data != 1:
  83.                         if temp_data % 2 != (temp_data % 4)>>1:
  84.                                 v += 1
  85.                                
  86.                         temp_data /= 2
  87.         v += 1
  88.         try:
  89.             arg = abs(v - 2*data_len*p*(1 - p))/(2*math.sqrt(2*data_len)*p*(1-p))
  90.             result = math.erfc(arg)
  91.         except ZeroDivisionError:
  92.             result = 0xff    
  93.         return result
  94. def Test_For_The_Longest_Run_Of_Ones (data, data_len):
  95.     if data_len <= 128:
  96.         M, K, R = 8, 3, 16
  97.         blocks_len4stat = [1, 2, 3, 4]
  98.         p = [0.2148, 0.3672, 0.2305, 0.1875]
  99.     elif data_len <= 6272:
  100.         M, K, R = 128, 5, 49
  101.         blocks_len4stat = [4, 5, 6, 7, 8, 9]
  102.         p = [0.1174, 0.2430, 0.2493, 0.1752, 0.1027, 0.1124]
  103.     else:
  104.         M, K, R = 10000, 6, 75
  105.         blocks_len4stat = [10, 11, 12, 13, 14, 15, 16]
  106.         p = [0.0228, 0.2092, 0.2483, 0.1933, 0.1208, 0.0675, 0.0727]
  107.    
  108.     # Разбиение последовательности на блоки
  109.     blocks = []
  110.     count_seq_len = []
  111.     ind = 0
  112.     while data_len > 0:
  113.         blocks.append(str(bin((data % ( 2 ** M)))))
  114.         data /= 2 ** M
  115.         data_len -= M
  116.         if (len(blocks[ind]) != M + 2):
  117.             temp = len(blocks[ind])
  118.             for i in range (M + 2 - temp):
  119.                 blocks[ind] += '0'
  120.         ind += 1
  121.  
  122.     # Вычисление максимальной последовательности единиц для каждого блока
  123.     length = 0
  124.    
  125.     for j in range(0, len(blocks)):
  126.         length_max = 0
  127.        
  128.         for i in range(0, M+2):      
  129.             if blocks[j][i] == '1':
  130.                 length += 1
  131.  
  132.             if blocks[j][i] == '0' or i == M+1:
  133.                 if length > length_max:
  134.                     length_max = length
  135.                 length = 0
  136.  
  137.         # Добавление длины последовательности в list
  138.         count_seq_len.append(length_max)
  139.  
  140.     # Вычисление статистики
  141.     stat = [0, 0, 0, 0, 0, 0, 0]
  142.    
  143.     for i in range(len(blocks_len4stat)):
  144.         for item in count_seq_len:
  145.             if item < blocks_len4stat[0]:
  146.                 stat[0] += 1
  147.             elif item == blocks_len4stat[i]:
  148.                 stat[i] += 1
  149.             elif item > blocks_len4stat[len(blocks_len4stat) - 1]:
  150.                 stat[len(blocks_len4stat) - 1] += 1
  151.                
  152.     # Вычисление Хи-квадрата
  153.     xi = 0
  154.     for i in range(0, K + 1):
  155.         xi += ((stat[i] - R * p[i]) ** 2) / (R * p[i])
  156.  
  157.     result = sympy.uppergamma(float(K)/2, float(xi)/2)
  158.     return result / sympy.gamma(float(K)/2) #ИСПРАВЛЕНО: igamc = uppergamma(a,x)/gamma(a)
  159.    
  160. def Binary_Matrix_Rank_Test (data, data_len):
  161.     M = Q = 3
  162.     # Число матриц
  163.     N = data_len / (M * Q)
  164.     pm = [0.2888, 0.5776, 0.1284, 0.005, 0]
  165.    
  166.     matrix = []
  167.     matrix_rank = []
  168.     fm = []
  169.  
  170.     data = data >> (data_len % (M * Q))
  171.     for i in range(N):
  172.         array = []
  173.         x = data % (2 ** (M * Q))
  174.         data >>= (M * Q)
  175.         data_len -= M * Q
  176.  
  177.         for j in range (M * Q):
  178.             array.append(x % 2)
  179.             x /= 2
  180.         matrix.append(sympy.Matrix(M, Q, array))
  181.  
  182.         matrix_rank.append(matrix[i].rank())
  183.  
  184.     for i in range(M + 1):
  185.         fm.append(0)
  186.  
  187.     for rank in matrix_rank:
  188.         fm[rank] += 1
  189.  
  190.     p = 0.005
  191.     for i in range(0, M + 1):
  192.         if i == M:
  193.             p = pm[0]
  194.         elif i == M - 1:
  195.             p = pm[1]
  196.         elif i == M - 2:
  197.             p = pm[2]
  198.         elif i == M - 3:
  199.             p = pm[3]
  200.            
  201.         fm[i] = float(((fm[i] - N * p) ** 2)) / (N * p)
  202.        
  203.     xi = 0
  204.     xi = sum(fm)
  205.  
  206.     result = sympy.uppergamma(1, float(xi)/2)
  207.     return result
  208. def Spectral_Test(data, data_len):
  209.     run =[]
  210.     run2=[]
  211.     four=[]
  212.     while data != 0:
  213.         a = data & 1
  214.         if a == 0:
  215.             a = -1
  216.         data = data >> 1
  217.         run.append(a)
  218.     run2 = run[::-1]
  219.     four = abs(numpy.fft.fft(run2))
  220.     T=math.sqrt((math.log(1/0.05))*data_len)
  221.    
  222.                
  223.     N0=0.95*datalen/2
  224.     N1=math.floor(N0)
  225.     d=float(N1-N0)/math.sqrt(float(data_len*0.95*0.05)/4)
  226.     result = sympy.erfc(float(abs(d))/math.sqrt(2))
  227.    
  228.     for item in range(data_len/2):
  229.         if four[item]>T:
  230.             result=0xff
  231.     return result
  232.        
  233.  
  234. def BerkelampMassey (arr):
  235.     N = len(arr)
  236.     b = []
  237.     c = []
  238.     t = []
  239.     b[0:N] = itertools.repeat(0, N)
  240.     b[0]=1
  241.     c[0:N] = b[0:N]
  242.     t[0:N] = itertools.repeat(0, N)
  243.     l = 0
  244.     m = -1
  245.     for n in range(N):
  246.         d = 0
  247.         for i in range(l+1):
  248.             d ^= c[i] * arr[n-i]
  249.         if d==1:
  250.             c[0:N] = t[0:N]
  251.             N_M = n - m
  252.             for j in range(N-N_M):
  253.                 c[N_M+j] ^= b[j]
  254.             if l <= n/2:
  255.                 l = n + 1 - l
  256.                 m = n
  257.                 t[0:N] = b[0:N]
  258.     return l
  259.        
  260. def chi2c(v, p, nn):
  261.     return (v - nn*p)^2/nn/p
  262.  
  263. def LinearComplexity(datanum, block_len, data_len):
  264.     data = map((lambda x : int (x=='1')), bin(datanum)[2:])
  265.     for z in range(len(data), datalen):
  266.         data.insert(0,0)
  267.     mu = block_len/2.0 + (9 + ((block_len %2)*2 - 1))/36.0 - (block_len/3.0 + 2/9.0)/2**block_len
  268.     pii = [ 0.010417, 0.03125, 0.125, 0.5, 0.25, 0.0625, 0.020833]
  269.     v = []
  270.     N = 0
  271.     v[0:7] = itertools.repeat(0, 7)
  272.     for z in range(0, data_len, block_len):
  273.         block = []
  274.         block[0:block_len] = data[z:z+block_len]
  275.         Li = BerkelampMassey(block)
  276.         Ti = (1 - (block_len%2)*2) * (Li - mu) + 2/9.0
  277.         ind = math.ceil(Ti+2.5)
  278.         if (ind <= 0):
  279.             v[0] += 1
  280.         elif (ind >= 6):
  281.             v[6] += 1
  282.         else:
  283.             v[int(ind)] += 1
  284.         N += 1
  285.     chi2 = sum(map (chi2c, v, pii, itertools.repeat(N, 7)))
  286.     return sympy.uppergamma(3.0, chi2/2)/2.0 #gamma(3) = 2! = 2
  287.  
  288. def ApproximateEntropy(datanum, datalen, blocklen):
  289.     data = map((lambda x : int (x=='1')), bin(datanum)[2:])
  290.     for z in range(len(data), datalen):
  291.         data.insert(0,0)
  292.     data.extend(data[0:blocklen-1])
  293.     C = []
  294.     C[0:2**blocklen] = itertools.repeat(0, 2**blocklen)
  295.     for j in range(datalen):
  296.         k = data[j:j+blocklen]
  297.         i = sum(map((lambda x, y: x* 2**y), k, range(blocklen-1,-1,-1)))
  298.         C[i] += 1
  299.     phim = sum(map(lambda p: p * math.log(p) ,filter(lambda k: k!=0, map(lambda x: float(x)/datalen, C))))
  300.     data.append(data[blocklen])
  301.     C = []
  302.     C[0:2*2**blocklen] = itertools.repeat(0, 2*2**blocklen)
  303.     for j in range(datalen):
  304.         k = data[j:j+blocklen+1]
  305.         i = sum(map((lambda x, y: x* 2**y), k, range(blocklen,-1,-1)))
  306.         C[i] += 1
  307.     phimp1 = sum(map(lambda p: p * math.log(p) ,filter(lambda k: k!=0, map(lambda x: float(x)/datalen, C))))
  308.     ApEn = phim - phimp1
  309.     chi2 = 2*datalen*(math.log(2)-ApEn)
  310.     return sympy.uppergamma(2**(blocklen-1), chi2/2) / sympy.gamma(2**(blocklen-1))
  311.  
  312.  
  313. def cdf(x):
  314.     return (1.0 + math.erf(x / math.sqrt(2.0))) / 2.0
  315.  
  316. def Cusum(data, datalen, mode):
  317.     X = map((lambda x : 2*int(x=='1')-1), bin(data)[2:])
  318.     for z in range(len(X), datalen):
  319.         X.insert(0, -1)
  320.     if mode:
  321.         X.reverse()
  322.     z = 0
  323.     for j in range(datalen):
  324.         si = reduce(lambda x,y: x+y, X[:j+1])
  325.         if (abs(si)>z): z=abs(si)
  326.     n = datalen
  327.     s1 = reduce(lambda s, k: s + cdf((((4*k+1)*z)/math.sqrt(n))) - cdf(((4*k-1)*z)/math.sqrt(n)), range(int((-n/z+1)/4), 1+((n/z-1)/4)), 0)
  328.     s2 = reduce(lambda s, k: s + cdf((((4*k+3)*z)/math.sqrt(n))) - cdf(((4*k+1)*z)/math.sqrt(n)), range(int((-n/z-3)/4), 1+((n/z-1)/4)), 0)
  329.     return 1.0 - s1 + s2
  330.  
  331.  
  332. def RandomWalk(data, datalen):
  333.     X = map((lambda x : 2*int(x=='1')-1), bin(data)[2:])
  334.     for z in range(len(X), datalen):
  335.         X.insert(0, -1)
  336.     S = list(range(datalen))
  337.     P = dict()
  338.     for j in range(datalen):
  339.         S[j] = reduce(lambda x,y: x+y, X[:j+1])
  340.     J = S.count(0) + 1
  341.     for r in range(9):
  342.         xi = S.count(-1-r)
  343.         P[-1-r] = math.erfc(abs(xi - J)/(2*J*(4*abs(-1-r)-2))**0.5)
  344.         xi = S.count(1+r)
  345.         P[1+r] = math.erfc(abs(xi - J)/(2*J*(4*abs(1+r)-2))**0.5)
  346.     return P    
  347.                                                      
  348.    
  349.  
  350.        
  351.    
  352.    
  353. seq = input("Enter data:")
  354. datalen = input("Enter len:")              
  355. temp = Frequency_Monobits_Test(seq)
  356. #print temp
  357. Compare(temp)    
  358. temp=Frequency_Block_Test(seq, datalen)
  359. Compare(temp)
  360. temp=Same_In_Row_Test(seq, datalen)
  361. Compare(temp)
  362. temp=Test_For_The_Longest_Run_Of_Ones (seq, datalen)
  363. Compare(temp)
  364. temp=Binary_Matrix_Rank_Test(seq, datalen)
  365. Compare(temp)
  366. temp=Spectral_Test(seq, datalen)
  367. Compare(temp)
  368. # проверки напрямую тут я прикручивать не стал, ибо нужен ещё размер блока
  369. # Заметь, что RandomWalk возвращает dict с ключами -9..-1, 1..9 и значениями соответствующих P.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement