def test(input, n, M=32, Q=32): N = int(math.floor(n/(M*Q))) #Number of blocks if N < 38: print(" Number of blocks must be greater than 37") p = 0.0 return [0]*9 # Compute the reference probabilities for FM, FMM and remainder r = M product = 1.0 for i in range(r): upper1 = (1.0 - (2.0**(i-Q))) upper2 = (1.0 - (2.0**(i-M))) lower = 1-(2.0**(i-r)) product = product * ((upper1*upper2)/lower) FR_prob = product * (2.0**((r*(Q+M-r)) - (M*Q))) r = M-1 product = 1.0 for i in range(r): upper1 = (1.0 - (2.0**(i-Q))) upper2 = (1.0 - (2.0**(i-M))) lower = 1-(2.0**(i-r)) product = product * ((upper1*upper2)/lower) FRM1_prob = product * (2.0**((r*(Q+M-r)) - (M*Q))) LR_prob = 1.0 - (FR_prob + FRM1_prob) FM = 0 # Number of full rank matrices FMM = 0 # Number of rank -1 matrices remainder = 0 for blknum in range(N): block = [None] * (M*Q) for i in range(M*Q): block[i] = int(input[blknum*M*Q + i],2) # Put in a matrix matrix = gf2matrix.matrix_from_bits(M,Q,block,blknum) rank = gf2matrix.rank(M,Q,matrix,blknum) if rank == M: # count the result FM += 1 elif rank == M-1: FMM += 1 else: remainder += 1 chisq = (((FM-(FR_prob*N))**2)/(FR_prob*N)) chisq += (((FMM-(FRM1_prob*N))**2)/(FRM1_prob*N)) chisq += (((remainder-(LR_prob*N))**2)/(LR_prob*N)) p = math.e **(-chisq/2.0) success = (p >= 0.01) return [n, M, Q, N, FM, FMM, chisq, p, success]
def binary_matrix_rank_test(bits, M=32, Q=32): n = len(bits) N = int(math.floor(n / (M * Q))) #Number of blocks if N < 38: print(" Number of blocks must be greater than 37") return False, 0, None # Compute the reference probabilities for FM, FMM and remainder r = M product = 1.0 for i in range(r): upper1 = (1.0 - (2.0**(i - Q))) upper2 = (1.0 - (2.0**(i - M))) lower = 1 - (2.0**(i - r)) product = product * ((upper1 * upper2) / lower) FR_prob = product * (2.0**((r * (Q + M - r)) - (M * Q))) r = M - 1 product = 1.0 for i in range(r): upper1 = (1.0 - (2.0**(i - Q))) upper2 = (1.0 - (2.0**(i - M))) lower = 1 - (2.0**(i - r)) product = product * ((upper1 * upper2) / lower) FRM1_prob = product * (2.0**((r * (Q + M - r)) - (M * Q))) LR_prob = 1.0 - (FR_prob + FRM1_prob) FM = 0 # Number of full rank matrices FMM = 0 # Number of rank -1 matrices remainder = 0 for blknum in range(N): block = bits[blknum * (M * Q):(blknum + 1) * (M * Q)] # Put in a matrix matrix = gf2matrix.matrix_from_bits(M, Q, block, blknum) # Compute rank rank = gf2matrix.rank(M, Q, matrix, blknum) if rank == M: # count the result FM += 1 elif rank == M - 1: FMM += 1 else: remainder += 1 chisq = (((FM - (FR_prob * N))**2) / (FR_prob * N)) chisq += (((FMM - (FRM1_prob * N))**2) / (FRM1_prob * N)) chisq += (((remainder - (LR_prob * N))**2) / (LR_prob * N)) p = math.e**(-chisq / 2.0) success = (p >= 0.01) return (success, p, None)