def verify_gaus_sum_complex_conj(N): ALMOST_ZERO = 0.001 # get dirich_char_mat, which is a 2D matrix dirich_char_mat, phi_n, coprime_list, prim_char_stat_all = dirichi_char_for_n(N) # number of row. Note: 1st row is principle for i in range(0, phi_n): chi = dirich_char_mat[i] gaus_sum = gaus_sum_for_dirich_char(chi) chi_conj = np.conjugate(chi) gaus_sum_for_chi_conj = gaus_sum_for_dirich_char(chi_conj) gaus_sum_conj = np.conjugate(gaus_sum) # chi(-1) = chi(N-1) # It seems this value is always be 1 or -1, why ? chi_minus_1 = chi[N-1] tmp = chi_minus_1*gaus_sum_conj assert(np.absolute(gaus_sum_for_chi_conj - tmp) < ALMOST_ZERO) # print 'chi = ', chi # print 'chi_conj = ', chi_conj # print 'N = %d, i = %d'%(N, i), ', gaus_sum_for_chi_conj = ', gaus_sum_for_chi_conj, ', tmp = ', tmp, ', chi_minus_1 = ', chi_minus_1 print 'verify_gaus_sum_complex_conj() pass !'
def gaus_sum_for_principle_char_upto_n(N): gaus_sum_arr = [1]*N # start from 1, because dirichi_char_for_n() is not defined for 1 for n in range(2, N + 1): # print 'n = ', n # get dirich_char_mat, which is a 2D matrix dirich_char_mat, phi_n, coprime_list, prim_char_stat_all = dirichi_char_for_n(n) # char_index = 0 will give principle char G_chi = gaus_sum_for_dirich_char_by_index(0, n, dirich_char_mat, phi_n) gaus_sum_arr[n - 1] = G_chi plt.figure() t_range_list = range(1, N+1) title_str = 'gaus_sum, for principle character N %d'%(N) plot_one_list(np.absolute(gaus_sum_arr), title_str, t_range_list, 'b-*') plot_one_list(np.asarray(gaus_sum_arr).real, title_str, t_range_list, 'c-*') plot_one_list(np.asarray(gaus_sum_arr).imag, title_str, t_range_list, 'y-*') xlabel_str = 'blue: abs, cyran: real, yellow: imag' plt.xlabel(xlabel_str) # need the round to int first, then astype(int) gaus_sum_principle_char = np.round(np.asarray(gaus_sum_arr).real).astype(int) print gaus_sum_principle_char return gaus_sum_principle_char
def verify_gaus_sum_of_char_prod(N, M): # this function only work for N, M are co-prime assert(gcd(N, M) == 1) ALMOST_ZERO = 0.001 # get dirich_char_mat, which is a 2D matrix dirich_char_mat_N, phi_n, coprime_list, prim_char_stat_all = dirichi_char_for_n(N) # get dirich_char_mat, which is a 2D matrix dirich_char_mat_M, phi_m, coprime_list, prim_char_stat_all = dirichi_char_for_n(M) # number of row. Note: 1st row is principle for i in range(0, phi_n): for j in range(0, phi_m): chi_i = dirich_char_mat_N[i] chi_j = dirich_char_mat_M[j] chi_i_chi_j = char_product(chi_i, chi_j) gaus_sum_chi_prod = gaus_sum_for_dirich_char(chi_i_chi_j) chi_i_M = chi_i[M%N] chi_j_N = chi_j[N%M] gaus_sum_chi_i = gaus_sum_for_dirich_char(chi_i) gaus_sum_chi_j = gaus_sum_for_dirich_char(chi_j) tmp = chi_i_M*chi_j_N*gaus_sum_chi_i*gaus_sum_chi_j assert(np.absolute(gaus_sum_chi_prod - tmp) < ALMOST_ZERO) # print 'chi = ', chi # print 'chi_conj = ', chi_conj # print 'N = %d, M = %d, i = %d, j = %d'%(N, M, i, j), ', gaus_sum_chi_prod = ', gaus_sum_chi_prod, ', tmp = ', tmp print 'verify_gaus_sum_of_char_prod() pass !'
def gaus_sum_for_N(N, more_verify = False): # get dirich_char_mat, which is a 2D matrix dirich_char_mat, phi_n, coprime_list, prim_char_stat_all = dirichi_char_for_n(N) gaus_sum_arr = [0]*phi_n # this is the theoretical result, absolute(G(1, chi)) = sqrt(N) gaus_sum_for_prim_char = np.sqrt(N) ALMOST_ZERO = 0.001 gaus_sum_prim_char_cnt = 0 # print np.asarray(dirich_char_mat) if(more_verify == True): verify_all_propertiers(dirich_char_mat, N, phi_n, coprime_list) # Note, in the following plot, 1st row skipped, so its gaus_sum is not correct. verify_poly_vinograd_gaus_sum(dirich_char_mat, N, phi_n, prim_char_stat_all) # number of row. Note: 1st row is principle for i in range(0, phi_n): G_chi = gaus_sum_for_dirich_char_by_index(i, N, dirich_char_mat, phi_n) gaus_sum_arr[i] = G_chi # For prim_char, its gaus_sum == sqrt(N), let's verify this diff = np.absolute(G_chi) - gaus_sum_for_prim_char if(np.absolute(diff) < ALMOST_ZERO): gaus_sum_prim_char_cnt += 1 plt.figure() t_range_list = range(phi_n) title_str = 'gaus_sum, N %d, phi_N %d, gaus_sum_prim_char_cnt %d'%(N, phi_n, gaus_sum_prim_char_cnt) # for prim_char, gaus_sum shall be equal to sqrt(N) plot_one_list(np.absolute(gaus_sum_arr), title_str, t_range_list, 'b-*') plot_one_list(np.asarray(gaus_sum_arr).real, title_str, t_range_list, 'c-*') plot_one_list(np.asarray(gaus_sum_arr).imag, title_str, t_range_list, 'y-*') xlabel_str = 'sqrt(N): %f, blue: abs, cyran: real, yellow: imag'%(np.sqrt(N)) plt.xlabel(xlabel_str)