Personal tools
You are here: Home Members folder スタッフ 関数の実装(素数生成)
XScale ブログ
« February 2012 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      
About this blog
スタッフブログ
Recent comments
Re:Blum-Blum-Shubとは jack 2011-05-04
Re:Blum-Blum-Shubとは Anonymous User 2011-05-03
こんにちわ 村上 優奈 2010-10-18
Re:Sandgate MID ソリューションセット ¥498,000.- !!! jack 2009-08-28
大変恐縮ですが 匿名希望 2009-08-27
 
Document Actions

関数の実装(素数生成)

充分に大きな素数が欲しいといっても、そこまで凝る必要はないような気がするので、せいぜい32bit くらいでいいでしょう。

すくなくとも無いよりましだし、hiddenタグがあまりに肥大化するのもやです。

こんな感じで素数を生成するのはどうでしょう

def primes(max=100, start=None): # max が最大数、startが素数を求めはじめる数
    sqrmax = int(max**0.5) + 1 # 割り算は最大数の平方根までで充分 +1は念の為
    if max > 65536: # 最大32bitと考えてハードコード
        if sqrmax % 2 == 0: sqrmax += 1 # 奇数にする
        if start:
            if start %2 == 0: start -= 1 # 奇数にする
        else: #スタートがなければ、平方根値をスタートとする。-2は念の為
            start = sqrmax - 2
        r = primes(sqrmax)
        c = [x for x in xrange(start, max+1, 2) if x%3 and x%5] # 2, 3, 5はあらかじめはぶく
        for x in r[3:]: # 7からエラストネス
            c = [y for y in c if y%x]
    else: # 小さい場合は普通にハードコード
        r, c = [2, 3],  [x for x in xrange(5, max, 2) if x%3] # 2, 3を省く
        while c[0] <= sqrmax: 
            r.append(c[0]) # 先頭のものは素数
            c = [x for x in c if x % c[0]] # なぜかというとここで先頭のものの倍数を全て除去するので
    return r + c

これで、32bit長くらいの素数なら作れると思います。動作もmaxに近いところを500整数くらいやるようにすれば0.1秒はかからないでしょう

 

Category(s)
j@ウェブ屋
The URL to Trackback this entry is:
http://www.xscale-freak.com/Members/folder/staff/95a26570306e5b9f88c5-7d206570751f6210/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)

Powered by Plone CMS, the Open Source Content Management System