Example #1
0
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 !'
Example #2
0
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
Example #3
0
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 !'
Example #4
0
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)