def gauss_samp(B, sigma, mean, n, q): Bg = gramschmidt.gs(B) current_center = mean e = np.zeros(n) #print max([np.linalg.norm(np.array(Bg[:,i].T)[0]) for i in range(n)]) print B #print sigma # iterate i = n - 1 ... 0 for i in range(0,n)[::-1]: # get the i^th gram schmidt vector bg_i = np.array(Bg[:,i].T)[0] cp_i = np.dot(current_center.T, bg_i) / np.dot(bg_i, bg_i) sp_i = sigma/np.linalg.norm(bg_i) #print "s_i, c_i: ", sp_i, cp_i z_i = gauss_samp_1D(sp_i, cp_i, n) % q # get the i^th basis vector b_i = np.array(B[:,i].T)[0] zb = z_i*b_i e = np.mod(np.add(e, zb), q) current_center = np.mod(np.subtract(current_center, zb), q) return e
def gauss_samp(B, sigma, mean, n, q): Bg = gramschmidt.gs(B) current_center = mean e = np.zeros(n) #print max([np.linalg.norm(np.array(Bg[:,i].T)[0]) for i in range(n)]) print B #print sigma # iterate i = n - 1 ... 0 for i in range(0, n)[::-1]: # get the i^th gram schmidt vector bg_i = np.array(Bg[:, i].T)[0] cp_i = np.dot(current_center.T, bg_i) / np.dot(bg_i, bg_i) sp_i = sigma / np.linalg.norm(bg_i) #print "s_i, c_i: ", sp_i, cp_i z_i = gauss_samp_1D(sp_i, cp_i, n) % q # get the i^th basis vector b_i = np.array(B[:, i].T)[0] zb = z_i * b_i e = np.mod(np.add(e, zb), q) current_center = np.mod(np.subtract(current_center, zb), q) return e
W = np.concatenate((W,nextrow),axis=0) return W[1:] def trapdoor_G(n,q,k): Tg = np.diagflat(2*np.ones(k))+np.diagflat(-1*np.ones(k-1),-1) Tg[:,-1] = [int(b) for b in np.binary_repr(q,k)[::-1]] T = np.kron(np.eye(n),Tg) return T def gen_basis(n, q, m, A, R): k = int(np.ceil(np.log2(q))) m0=m-n*k M1 = np.concatenate((np.concatenate((np.eye(m0),np.zeros((n*k,m0))),axis=0),R),axis=1) Tg = trapdoor_G(n,q,k) A0 = np.mod(-A[:,:m0],q) W = binary_decomp(A0,k) M2 = np.concatenate((np.concatenate((np.eye(m0),W),axis=0),np.concatenate((np.zeros((m0,n*k)),Tg),axis=0)),axis=1) return np.mod(M1*M2,q) if __name__ == "__main__": n=32 q=2053 k=int(np.ceil(np.log2(q))) m=2*n*k A,R = gen_trap(n,q,m) B = gen_basis(n,q,m,A,R) print np.amax(np.amax(np.mod(A*B,q))) Bg = gramschmidt.gs(B) print "Max Gram-Schmidt: ", max([np.linalg.norm(np.array(Bg[:,i].T)[0]) for i in range(m)])
return T def gen_basis(n, q, m, A, R): k = int(np.ceil(np.log2(q))) m0 = m - n * k M1 = np.concatenate((np.concatenate( (np.eye(m0), np.zeros((n * k, m0))), axis=0), R), axis=1) Tg = trapdoor_G(n, q, k) A0 = np.mod(-A[:, :m0], q) W = binary_decomp(A0, k) M2 = np.concatenate((np.concatenate((np.eye(m0), W), axis=0), np.concatenate((np.zeros((m0, n * k)), Tg), axis=0)), axis=1) return np.mod(M1 * M2, q) if __name__ == "__main__": n = 32 q = 2053 k = int(np.ceil(np.log2(q))) m = 2 * n * k A, R = gen_trap(n, q, m) B = gen_basis(n, q, m, A, R) print np.amax(np.amax(np.mod(A * B, q))) Bg = gramschmidt.gs(B) print "Max Gram-Schmidt: ", max( [np.linalg.norm(np.array(Bg[:, i].T)[0]) for i in range(m)])