2

私は現在、別の大きな数に含まれる最大の素数を見つけようとしています。

maxlen = 1024
for i in range(1023, -1, -1):
    maxlen -= 1
    number = ""
    for k in range(maxlen, -1, -1):
            number = pi[k] + number
            if isprime(number) == True:
                    print number

isprime()は、数値が素数(かなり標準)であるかどうかをチェックする関数です。これは、MemoryErrorが発生する特定の時点まではかなりうまく機能します。

これは、最初のforループの6回目の実行付近で発生するため、関数によってチェックされる数が多すぎるためではありません。

私はすでにgc.enable()とgc.collect()を試しましたが、肯定的な結果は得られませんでした。

誰かがこれを修正する方法を知っていますか?

編集:リクエストに応じたpiとisprime()の定義:

f = open("/root/number", "r")
pi = f.read()
f.close()

ここで、ファイル「number」には、素数を見つけたい元の番号が含まれています。

def isprime(n):
    n = abs(int(n))
    if n < 2:
            return False
    if n == 2:
            return True
    if not n & 1:
            return False
    for x in range(3, int(n**0.5)+1, 2):
            if n % x == 0:
                    return False
    return True

トレースバック:

Traceback (most recent call last):
  File "./primal.py", line 36, in <module>
    if isprime(number) == True:
  File "./primal.py", line 24, in isprime
    for x in range(3, int(n**0.5)+1, 2):
MemoryError
4

2 に答える 2

7

xrangeの代わりにrange、最も重要なことにisprime、ここで使用します。

for x in xrange(3, int(n**0.5)+1, 2):

xrangerange はメモリ内にリスト全体を作成しませんが、結果を反復処理した後に結果を使用していません。

別のヒント: をテストするだけです。isprime(n)が と等しいかどうかを確認する必要はありTrueませif 。:-)

if isprime(number):  # Only works if isprime(number) is boolean True
    ...
于 2012-06-29T13:21:21.823 に答える
4

これが Python v 2.xの場合は、xrange()代わりにrange(). range()メモリ内で一度にリストを生成しますが、xrange()「オンデマンド」で動作し、値が必要になるたびに値を生成します。

Python 3.x xrange()ではなくなり、以前とrange()同じように動作xrange()します。

What's New in Python 3から引用するには:

range() は、任意のサイズの値で機能することを除いて、以前の xrange() のように動作するようになりました。後者はもうありません。

于 2012-06-29T13:22:48.050 に答える