2015年8月2日日曜日

150802

Python


ラマヌジャン予想(5)

ラマヌジャン予想(4)において、
100000 以下の素数 p について小さいものから順に |τ(p)| / p^5.5 を計算し、
それがそれまでの計算値をこえるごとに記録した
結果を確認してみた。

今回は、Pythonで確認してみる。
(実行時間は1時間15分ほどかかる。)

# -*- coding: cp932 -*-
import numpy
import math

# m次以下のみにする
def mth_degree_poly(p, m, type):
    return numpy.poly1d(numpy.array(list(p)[- m - 1:], dtype = type))

def power(f, n, m, type):
    p = numpy.poly1d(numpy.array([1L], dtype = type))
    for i in format (n, 'b'):
        p *= p
        p = mth_degree_poly(p, m, type)
        if i == '1':
            # fがリストでも答えが出る
            p *= f
            p = mth_degree_poly(p, m, type)
    return p

def A000594(n, type):
    ary = [0] * (n + 1)
    i = 0
    j, k = 2 * i + 1, i * (i + 1) / 2
    while k <= n:
        ary[k] = -j if i % 2 == 1 else j
        i += 1
        j, k = 2 * i + 1, i * (i + 1) / 2
    return list(reversed((power(list(reversed(ary)), 8, n - 1, type)).c))
    
def prime_ary(n):
    ary = [True for i in xrange(n + 1)]
    i = 2
    while i * i <= n:
        if ary[i]:
            j = i + i
            while j <= n:
                # jはiの倍数
                ary[j] = False
                j += i
        i += 1
    p_ary = [i for i in xrange(n + 1) if ary[i] and i >= 2]
    return p_ary

# |t(p)| / p^5.5 の最大値
def ramanujan_conjecture(ary):
    max = 0
    r_max_ary = []
    p_ary = prime_ary(len(ary))
    for p in p_ary:
        t = ary[p - 1]
        u = math.fabs(t) / p ** 5.5
        if max < u:
            r_max_ary.append([p, t, u])
            max = u
    return r_max_ary

N = 100000
type = numpy.object
ary = A000594(N, type)
print ramanujan_conjecture(ary)

出力結果
[[2, -24L, 0.5303300858899106], [3, 252L, 0.5987336124929452], [5, 4830L, 0.6912
13333204735], [11, 534612L, 1.0008729094970374], [17, -6905934L, 1.1796504994162
533], [47, 2687348496L, 1.7091720053051764], [103, -225755128648L, 1.91881404823
90927], [3371, 49278699535832155572L, 1.9497821915448013], [3967, 12075280611617
1238016L, 1.9514396698133158], [7451, -3875535882287120935548L, 1.95502206589493
24], [7589, 4299215878259436627390L, 1.9605332515011487], [16033, 26422052465366
8368557282L, 1.9696324533790046], [18047, -507583894904594239461504L, 1.97369587
34327261], [32233, -12353847812192420408840518L, 1.977644573320766], [39089, -35
739924948271037246368110L, 1.9808589644591574], [53593, -20312284045572123188421
5158L, 1.9845606903237616], [58189, 320344277397080839676063990L, 1.990636920097
253], [64849, 581810639436172985553940850L, 1.992111303823014], [74471, 12477466
75775398313329647672L, 1.996167133105195]]

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。